Mark,

On 7/11/16 4:40 PM, Mark Thomas wrote:
> This was triggered by a thread on the users list. [1]
> 
> Tomcat does not, and hasn't as far back as at least 4.1.x, decoded the
> path provided in the call to getRequestDispatcher(path).
> 
> I think this might be incorrect. My logic for this is as follows.
> 
> The servlet spec is clear (see 9.1.1) that path can include a query string.
> 
> The query string is delimited by '?'.
> 
> '?' is a valid character in the path if it is encoded.
> 
> Users may want to use '?'in the path.
> 
> Therefore users need to be able to provide an encoded path.
> 
> Therefore the RequestDispatcher needs to decode the path.
> 
> 
> Given how long this has been as it is, I'm worried that changing to
> decoding the paths will break something. If we agree that this does need
> to change, I think we'll need a configuration option to restore the
> "don't decode" behaviour. I'm thinking a context attribute as that can
> be set globally in conf/context.xml but over-ridden per Context if
> necessary. Defaults TBD. We can worry about those if we agree that the
> current behaviour is wrong.
> 
> Thoughts?

+1 on this change

Just to be clear, this won't impact any existing code that does
something like the following:

String target = "/foo/bar?a=b&c=d";
request.getRequestDispatcher(target).forward(request, response);

The only thing it might break was if someone tried to use a URL
containing a % sign that wasn't encoded:

String target = "/foo/bar?percent=%&hash=#";
request.getRequestDispatcher(target).forward(request, response);

Right?

I think that case is quite rare, so I'm also +1 to introducing this new
behavior as the *default* with an option to revert back to the previous
behavior.

-chris

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to