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
>

Reply via email to