[resteasy] Client escapes slashes causing failure

Gareth Healy garethahealy at gmail.com
Sun Sep 18 06:27:17 EDT 2016


I can't change how it works, since i am only the client and don't control
the server side. The server side is a RH/JBoss project:

   - https://github.com/hawkular/hawkular-inventory

Since the code currently supports deciding whether to encode the slash or
not, i've raised a PR [1].

[1] https://github.com/resteasy/Resteasy/pull/945

On Fri, Sep 16, 2016 at 5:28 PM, Rebecca Searls <rsearls at redhat.com> wrote:

>
>
> As you have noted there is no simple clean way to alter this processing
> behavior.
> When it is this difficult and complex to control the processing behavior
> you
> desire, its an strong indication that you are attempting to use a feature
> outside
> its defined bounds and your implementation would be considered a bad code
> practice,
> fraught with potential maintenance nightmares.
>
> I strongly recommend you stop and reevaluate the problem you are attempting
> to solve and seek a means of addressing it in a way that is considered a
> standard
> practice.
>
> If you absolutely must proceed down this solution path then you would need
> to provide your own javax.ws.rs.core.URIBuilder implementation and pass it
> to the ProxyBuilder as a target.
>
>       CustomURIBuilder cBuilder = new CustomURIBuilder();
>
>         ProxyBuilder<T> proxyBuilder = client
>             .target(cBuilder.uri(uri))
>             //.target(uri)
>             .proxyBuilder(apiClassType);
>
> After looking at the code you might think that you can extend Resteasy's
> URIBuilder implementation and override one of the resolveTemplates methods
> but there are several problems with that.
>
>   - Overriding resolveTemplates method will not work because these methods
>       call method buildString, which is private.
>   - javax.ws.rs.core.URIBuilder is an abstract class that uses
>       RuntimeDelegate.getInstance().createUriBuilder() in a handful of
> methods
>       for creating a UriBuilder object.  In Resteasy the RuntimeDelegate is
>       tied to ResteasyProviderFactory so you can not use methods
> newInstance,
>       fromUri, fromPath, fromResource, fromMethod because they will return
>       Resteasy's implementation class not yours.
>   - You will not be able to override URiBuilder.newInstance to avoid
> access to
>       RuntimeDelegate because it is a static method.  You don't want to
> replace
>       Resteasy's RuntimeDelegate because then you will break Resteasy
> itself.
>
>
> So now that we have discussed what you don't want to do and what you can't
> do
> lets consider other options.
>
> URI variables "{path}" can be matched by a regular expression "[^/]+?".
> There are
> a variety of web sites that discuss this.  The disadvantage to this
> solution is
> the more unrestricted a string you want to support the more complicated
> the the
> expression may be.  This could cause long term maintenance issues.
>
> Use the URI variable as it is intended, in particular don't embed a
> forward slack in the value
> and use another methodology to process the path.  Here is a post with some
> good suggests,
> http://stackoverflow.com/questions/17000193/can-we-
> have-more-than-one-path-annotation-for-same-rest-method
>
> Don't pass the "path" information as a URI variable.  Pass it as a
> QueryParam to
> your REST method, and process it internally.
>
>
>
> ----- Original Message -----
> > From: "Rebecca Searls" <rsearls at redhat.com>
> > To: "Gareth Healy" <garethahealy at gmail.com>
> > Cc: resteasy at lists.jboss.org
> > Sent: Friday, September 16, 2016 7:34:46 AM
> > Subject: Re: [resteasy] Client escapes slashes causing failure
> >
> > I'm putting together an example of how to override the "encodeSlash"
> setting.
> > Should be available later today.
> >
> >
> > ----- Original Message -----
> > > From: "Gareth Healy" <garethahealy at gmail.com>
> > > To: "Rebecca Searls" <rsearls at redhat.com>
> > > Cc: resteasy at lists.jboss.org
> > > Sent: Friday, September 16, 2016 4:27:27 AM
> > > Subject: Re: [resteasy] Client escapes slashes causing failure
> > >
> > > Just digging into this a bit more, i can see the param processor is
> loaded
> > > [1] which calls the web target [2], but this calls an overload which
> always
> > > passes in true for "encodeSlash".
> > >
> > > [1] https://github.com/resteasy/Resteasy/blob/master/resteasy-
> > > client/src/main/java/org/jboss/resteasy/client/jaxrs/
> > > internal/proxy/processors/webtarget/PathParamProcessor.java
> > > [2] https://github.com/resteasy/Resteasy/blob/master/resteasy-
> > > client/src/main/java/org/jboss/resteasy/client/jaxrs/
> > > internal/ClientWebTarget.java#L134
> > > [3] https://github.com/resteasy/Resteasy/blob/master/resteasy-
> > > jaxrs/src/main/java/org/jboss/resteasy/specimpl/
> > > ResteasyUriBuilder.java#L1085
> > >
> > > The param processor is created by the factory [4] so i can't see how to
> > > change the default behaviour.
> > >
> > > [4]
> > > https://github.com/resteasy/Resteasy/blob/master/resteasy-
> client/src/main/java/org/jboss/resteasy/client/jaxrs/
> internal/proxy/processors/ProcessorFactory.java
> > >
> > > On Thu, Sep 15, 2016 at 9:54 AM, Gareth Healy <garethahealy at gmail.com>
> > > wrote:
> > >
> > > > I've added a simple unit test which shows the behaviour @
> > > > https://github.com/garethahealy/resteast-pathparam-escape
> > > >
> > > > Contains 1 test, which uses a ClientRequestFilter to check what the
> URI
> > > > is, if it contains "%2F", then it fails.
> > > >
> > > > Cheers.
> > > >
> > > > On Wed, Sep 14, 2016 at 8:01 PM, Rebecca Searls <rsearls at redhat.com>
> > > > wrote:
> > > >
> > > >>
> > > >> If you replace RelativePath with String do you have the same issue?
> > > >> What RelativePath class are you using?
> > > >>
> > > >> ----- Original Message -----
> > > >> > From: "Gareth Healy" <garethahealy at gmail.com>
> > > >> > To: resteasy at lists.jboss.org
> > > >> > Sent: Wednesday, September 14, 2016 11:36:31 AM
> > > >> > Subject: [resteasy] Client escapes slashes causing failure
> > > >> >
> > > >> > I have a client which uses the following method:
> > > >> >
> > > >> >
> > > >> >
> > > >> > @GET
> > > >> > @Path("/{path}/treeHash")
> > > >> > Response getEntityHash(@PathParam("path") RelativePath path);
> > > >> >
> > > >> > The RelativePath object gets converted into a value of:
> > > >> > t;unit-testing/e;ua2shhq9
> > > >> >
> > > >> >
> > > >> >
> > > >> >
> > > >> > Example full URL: /entity/t;unit-testing/e;ua2shhq9/treeHash
> > > >> >
> > > >> > When its executed, the forward slash is converted to %2F (encoded
> /).
> > > >> This
> > > >> > causes the call to fail. What do i need to do, to make sure its
> not
> > > >> > URL
> > > >> > encoded?
> > > >> >
> > > >> > I've tried adding @Encoded, but that has no effect.
> > > >> >
> > > >> > Cheers.
> > > >> >
> > > >> > _______________________________________________
> > > >> > resteasy mailing list
> > > >> > resteasy at lists.jboss.org
> > > >> > https://lists.jboss.org/mailman/listinfo/resteasy
> > > >> >
> > > >>
> > > >
> > > >
> > >
> > _______________________________________________
> > resteasy mailing list
> > resteasy at lists.jboss.org
> > https://lists.jboss.org/mailman/listinfo/resteasy
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/resteasy/attachments/20160918/e549bcc7/attachment.html 


More information about the resteasy mailing list