users@jax-rs-spec.java.net

[jax-rs-spec users] [jsr339-experts] Re: UriBuilder, forward slashes, path and segments

From: Sergey Beryozkin <sberyozkin_at_talend.com>
Date: Fri, 1 Jun 2012 11:42:57 +0100

On 01/06/12 11:26, Sergey Beryozkin wrote:
> Hi
>
> I remember the lively thread we had awhile back about encoding "/"
> passed to UriBuilder path and segment methods as if it was yesterday
> when we talked about it :-), but I have to admit I've no idea what the
> actual conclusion to it was, sorry :-)
>
> I've just had a related query on the users list and I'm coming to the
> conclusion that the encoding of "/" should be different depending on
> when it is passed to UriBuilder, in case of path() methods:
>
> 1. UriBuilder.fromPath("").path("a/b").build()
> should produce "a/b" - as per the JavaDocs of path(...)
>
> 2. UriBuilder.fromPath("").path("{a}").build("a/b")
> should produce "a%2Fb"
>
> The reason I think the 2nd variant should produce "a%2Fb" is because
> producing "a/b" will be inconsistent with the fact the the matching
> algorithm will not actually match "a/b" when we have @Path("{a}") and I
> think it should kind of work both ways.
>
> I'm not sure all will agree as one can imagine it can break some
> existing code, but please imagine JAX-RS 2.0 Client code doing 1. above
> and working against the endpoint with @Path("{a}") and then repeating 2.
> and failing against the same endpoint
>
Actually. In both cases, as it currently stands, we will get "a/b" and
that will fail to match against @Path("{a}") but I think that the user
expectation in the 2nd case will likely be for it not to fail.

Marek, I recall you suggested to add an optional flag to build(), to
influence whether the "/" should be encoded or not in cases like

UriBuilder.fromPath("").path("{a}").build("a/b");

example

UriBuilder.fromPath("").path("{a}").build(true, "a/b");

produces ("a%2Fb") ?

thanks, Sergey

> For segments, the forward slash has to be encoded all the time:
>
> 1. UriBuilder.fromPath("").segment("a/b").build()
> should produce "a%2Fb" - as per the JavaDocs of segment(...)
>
> 2. UriBuilder.fromPath("").segment("{a}").build("a/b")
> should produce "a%2Fb"
>
> I do not see any ambiguity here
>