[ 
https://issues.apache.org/jira/browse/SLING-1218?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12784902#action_12784902
 ] 

Alexander Klimetschek edited comment on SLING-1218 at 12/2/09 5:07 PM:
-----------------------------------------------------------------------

Attaching patch that solves the issue by using the URI class from 
commons-httpclient 3.1, which can accept unescaped uri strings, can update the 
unescaped path part and properly return an escaped URI in toString(): 
http://hc.apache.org/httpclient-3.x/apidocs/org/apache/commons/httpclient/URI.html

I wasn't able to find another proven and open sourced class doing that, so this 
patch adds commons-httpclient plus jcl-over-sl4j (since one of the httpclient 
classes used uses jakarta commons logging) to the dependencies. I reckon this 
could be improved by just embedding the few classes used into the final bundle 
to keep the bundle imports stable, but I don't know how to configure that 
properly.

The nice thing about httpclient URI is that it accepts both full absolute and 
relative URIs, so the if (mappedPathIsUrl) / else block could be removed and 
handled as one case. This is required as also relative URIs, ie. with a path 
only, need to be escaped at the end, which is now always done by httpclient URI 
for us.

The patch also adds a new test testMapURLEscaping() to JcrResourceResolverTest 
that tests this issue (only with spaces).

(patch to be applied in bundles/jcr/resource)

      was (Author: alexander.klimetschek):
    Attaching patch that solves the issue by using the URI class from 
commons-httpclient 3.1, which can accept unescaped uri strings, can update the 
unescaped path part and properly return an escaped URI in toString().

I wasn't able to find another proven and open sourced class doing that, so this 
patch adds commons-httpclient plus jcl-over-sl4j (since one of the httpclient 
classes used uses jakarta commons logging) to the dependencies. I reckon this 
could be improved by just embedding the few classes used into the final bundle 
to keep the bundle imports stable, but I don't know how to configure that 
properly.

The nice thing about httpclient URI is that it accepts both full absolute and 
relative URIs, so the if (mappedPathIsUrl) / else block could be removed and 
handled as one case. This is required as also relative URIs, ie. with a path 
only, need to be escaped at the end, which is now always done by httpclient URI 
for us.

The patch also adds a new test testMapURLEscaping() to JcrResourceResolverTest 
that tests this issue (only with spaces).

(patch to be applied in bundles/jcr/resource)
  
> JcrResourceResolver.map() does not return proper escaped URIs
> -------------------------------------------------------------
>
>                 Key: SLING-1218
>                 URL: https://issues.apache.org/jira/browse/SLING-1218
>             Project: Sling
>          Issue Type: Bug
>          Components: JCR
>    Affects Versions: JCR Resource 2.0.6
>            Reporter: Alexander Klimetschek
>         Attachments: SLING-1218.patch
>
>
> The JcrResourceResolver's map() methods do not escape the URIs that are 
> returned (as string). For example, a path with spaces (which is valid in JCR) 
> such as
>     /content/path/with spaces.jpg
> will be returned as-is (or like "http://my.domain.com/content/path/with 
> spaces.jpg" if a mapping config is present for that). However, it should be 
> returned as
>     /content/path/with%20spaces.jpg
> (Or in case of a mapping config, like 
> "http://my.domain.com/content/path/with%20spaces.jpg";).
> Furthermore, in case of a mapping config present, an URISyntaxException 
> exception will be thrown in line 384 of JcrResourceResolver as the uri string 
> "mappedPath" contains spaces and cannot be parsed by java.net.URI(String), 
> which expects an already-escaped URI. That exception is catched internally, 
> but namespace mangling and prepending of the servlet context path are omitted 
> in that case.
> The use of java.net.URI is not good when it is about building URIs from 
> plain, unescaped components, since it only really supports parsing of escaped 
> uri strings and the multi-args constructor in conjunction with toString() 
> simply behaves wrong. See also http://blog.limewire.org/?p=261

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to