Clean URL decoding bug - double decoding of path
------------------------------------------------

                 Key: STS-894
                 URL: http://www.stripesframework.org/jira/browse/STS-894
             Project: Stripes
          Issue Type: Bug
          Components: ActionBean Dispatching
    Affects Versions: Release 1.5.7, Release 1.5.6, Release 1.5.5, Release 1.5.4
         Environment: Tomcat 6.0.20
            Reporter: Jonathan Baker


STS-743, while very well meaning, introduced a very subtle bug in the clean URL 
handling code.

The following URL, which is perfectly valid, will not be parsed correctly by 
the HttpUtil class.  

   @UrlBinding( value = "/action/group/{key}" )
   key = "upgrades+configuration"

   The Stripes tag libraries generated this URL (correctly):   
http://mysite.com/action/group/upgrades%2Bconfiguration

The HttpUtil class receives this from the HttpServletRequest correctly parsed:
   servletPath = "/action"
   pathInfo = "/group/upgrades+configuration"

So far, so good.  But then the path is sent to StringUtil.urlDecode().  This 
turns the path in to "/action/group/upgrades configuration".  This is incorrect.

The bug appears to be running a path through the URLDecoder class.  The 
URLDecoder class mangles the correct path.  The path should be returned as-is 
and not decoded twice.



================
Technical details - the boring stuff...
================

It took me a while to research this, but I finally found the cause:

Different parts of the URL (URI) are encoded differently.  The '+' sign, for 
example, is handled differently depending on where it appears.  According to 
RFC 2396 (http://www.ietf.org/rfc/rfc2396.txt), a plus sign is legal in the 
path, but converts to a space in the query/parameters area.  For example:
 
@UrlBinding( value = "/action/dosomething/{param1}")

http://mywebsite.com/action/dosomething/first+value?param2=other+value
|       path area parsing                          |  query area parsing
|       param1 = 'first+value'                     |  param2 = 'other value'

In STS-743, the reporter mentions that they have encoded the parameter values 
using URLEncoding.  URLEncoding/URLDecoding can only parse URI query 
parameters, and does not work on URI paths.  So the encoding that was reported 
as "broken" was actually working correctly for the first time.

Both of these are correctly handled by the parsing code in the Servlet engine.  
The path is parsed correctly, and using the parameterMap the values are also 
parsed correctly.  No further action would be required by stripes to handle 
this.  (In fact, the URI class always encodes a "+" sign in to the path as %23, 
but will accept either form for parsing and handles it correctly.)



=================
Suggested solutions
=================

Two possible fixes.  First, change the getRequestedPath() method.  I've 
attached code below.  Second, it might be worthwhile to provide a startup 
parameter that re-enables the use of URLDecoding for parameters passed in the 
path.  (And just the parameters, not the rest of the path.)  If you would like 
this option let me know, and I'll see what I can do.  


public static String getRequestedPath(HttpServletRequest request) {
        String servletPath, pathInfo;

        // Check to see if the request is processing an include, and pull the 
path
        // information from the appropriate source.
        servletPath = (String) 
request.getAttribute(StripesConstants.REQ_ATTR_INCLUDE_PATH);
        if (servletPath != null) {
            pathInfo = (String) 
request.getAttribute(StripesConstants.REQ_ATTR_INCLUDE_PATH_INFO);
        }
        else {
            servletPath = request.getServletPath();
            pathInfo = request.getPathInfo();
        }

        String finalPath = (servletPath != null ? servletPath : "") + (pathInfo 
!= null ? pathInfo : "" );
        return finalPath;
    }


-- 
This message is automatically generated by JIRA.
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

------------------------------------------------------------------------------
LogMeIn Rescue: Anywhere, Anytime Remote support for IT. Free Trial
Remotely access PCs and mobile devices and provide instant support
Improve your efficiency, and focus on delivering more value-add services
Discover what IT Professionals Know. Rescue delivers
http://p.sf.net/sfu/logmein_12329d2d
_______________________________________________
Stripes-development mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/stripes-development

Reply via email to