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 >
