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. 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? >>>> >>>> >> >
