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

Reply via email to