I'm going to investigate this issue further - I think we can improve ServletController it was written a long time ago and supporting encoded URIs was not really on the map at a time. The other thing I'll check if it is possible to pass matrix parameters without values, just
;slash as opposed to ;slash=y this has to work - just need to add a test and confirm Sergey On Thu, Mar 10, 2011 at 5:59 PM, Keith Hawes <[email protected]> wrote: > I was thinking along the lines of the matrix parameter as a work around as > well. > > > On Thu, Mar 10, 2011 at 1:25 AM, Sergey Beryozkin <[email protected]>wrote: > >> Hi >> >> On Thu, Mar 10, 2011 at 5:32 AM, Keith Hawes <[email protected]> wrote: >> >>> Got the source and added breakpoints. >>> >>> in ServletController.invoke: >>> String address = request.getPathInfo() == null ? "" : >>> request.getPathInfo(); >>> puts a decoded path info into address AND strips the repeated / >>> >>> I can call with "632%2F%2F04810" or "632//04810" and in both cases >>> address is "/v1/device/632/04810" >>> >>> Later in ServletController.getBaseURL we have >>> String reqPrefix = request.getRequestURL().toString(); >>> and reqPrefix gets set to: >>> http://localhost/myservice/v1/device/632//04810 >>> >>> It appears tomcat wants to strip the "extra" / on us. :( I cannot find a >>> way to stop it for doing so. >>> >>> >>> >> Thanks for this analysis...So may be you can do some workaround ? Always >> use a single '/' but if you need two of them then indicate it via an >> additional matrix parameter, say >> >> 632/04810;optionId=1;slash=y >> >> which can be seen as equivalent to >> 632//04810;optionId=1 >> >> Will that work for you ? >> >> In meantime I'll need to investigate if ServletController can be updated >> for request.getPathInfo() call be avoided... >> >> thanks, Sergey >> >> On Wed, Mar 9, 2011 at 8:21 PM, Keith Hawes <[email protected]> wrote: >>> >>>> Thanks. I had not tried the @Encoded annotation, I'll give that a try >>>> and then >>>> >>>> as for configuring tomcat those two parameters need to be in system >>>> properties, I just add them to the command line with -D >>>> like this: >>>> >>>> -Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true >>>> -Dorg.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH=true >>>> >>>> Yes I do have the matrix parameters (they are optional criteria which >>>> narrow the results) >>>> >>>> On Wed, Mar 9, 2011 at 10:20 AM, Sergey Beryozkin <[email protected] >>>> > wrote: >>>> >>>>> I've done a simple test (with Jetty) and it works fine. >>>>> >>>>> Client: >>>>> >>>>> @Test >>>>> public void testBookWithComplexEncoding() throws Exception { >>>>> BookStore store = JAXRSClientFactory.create("http://localhost:" >>>>> + PORT, BookStore.class); >>>>> >>>>> String complex1 = "70%2F70%5C70.v1.0"; >>>>> Book book = store.getBookComplexEncoded(complex1, 3L); >>>>> assertEquals(3L, book.getId()); >>>>> assertEquals(complex1, book.getName()); >>>>> >>>>> String complex2 = "70%2F%2F70%5C70.v1.0"; >>>>> book = store.getBookComplexEncoded(complex2, 3L); >>>>> assertEquals(3L, book.getId()); >>>>> assertEquals(complex2, book.getName()); >>>>> } >>>>> >>>>> Relevant server code: >>>>> >>>>> @GET >>>>> @Path("/books/encoded/{complex}") >>>>> public Book getBookComplexEncoded(@Encoded @PathParam("complex") >>>>> String complex, >>>>> @MatrixParam("optionId") Long id) >>>>> { >>>>> return new Book(complex, id); >>>>> } >>>>> >>>>> I'm just using @Encoded to capture the exact sequence in the original >>>>> form... >>>>> >>>>> Can you please explain how to configure those two properties in Tomcat >>>>> ? >>>>> >>>>> org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true >>>>> org.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH=true >>>>> >>>>> What would really help of you could download CXF source and put a >>>>> breakpoint in ServletController and JAXRSInInterceptor >>>>> >>>>> It is possible there is a flaw somewhere exposed on Tomcat only >>>>> >>>>> thanks, Sergey >>>>> >>>>> >>>>> On Wed, Mar 9, 2011 at 10:45 AM, Sergey Beryozkin < >>>>> [email protected]> wrote: >>>>> >>>>>> Hi >>>>>> >>>>>> Forwarding to the users list... >>>>>> >>>>>> I do suspect it's the ServletController's issue to do with the way the >>>>>> handles matrix parameters >>>>>> >>>>>> Do you actual request URIs having matrix params like this : >>>>>> >>>>>> /service/v1/device/70%2F%2F70%5C70.v1.0;optionId=1 >>>>>> >>>>>> ? >>>>>> >>>>>> thanks, Sergey >>>>>> >>>>>> >>>>>> On Tue, Mar 8, 2011 at 6:42 PM, kh <[email protected]> wrote: >>>>>> >>>>>>> I get this message when I have two encodes /s in the path %2F%2F >>>>>>> WARNING: .No root resource matching request path >>>>>>> /service/v1/device/70%2F%2F70%5C70.v1.0 is found. >>>>>>> However: >>>>>>> /service/v1/device/70%2F70%5C70.v1.0 >>>>>>> works fine. >>>>>>> I'm using cxf 2.2.3 >>>>>>> >>>>>>> I have >>>>>>> org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true >>>>>>> org.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH=true >>>>>>> set. >>>>>>> >>>>>>> My annotations are: >>>>>>> >>>>>>> >>>>>>> @Path("/v1/device") >>>>>>> public class Device extends com.netflix.customer.eds.Device { >>>>>>> >>>>>>> @GET >>>>>>> @Path("/{esn}") >>>>>>> @Consumes("application/xml") >>>>>>> @Produces("application/xml") >>>>>>> /* for error cases only */ >>>>>>> @Transactional(rollbackFor = {Throwable.class}) >>>>>>> public Response get(@Context HttpServletRequest request, >>>>>>> @PathParam("esn") String esn, >>>>>>> @MatrixParam("optionId") Long optionId) >>>>>>> >>>>>>> I gt the same response weather or not I include the matrix parameter. >>>>>>> >>>>>>> Am I missing something? >>>>>>> >>>>>>> >>>>> >>>> >>> >> >> >> -- >> Sergey Beryozkin >> >> Application Integration Division of Talend <http://www.talend.com> >> http://sberyozkin.blogspot.com >> > > -- Sergey Beryozkin Application Integration Division of Talend <http://www.talend.com> http://sberyozkin.blogspot.com
