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