Details
Description
Preconditions:
Working application on tomacat 5.5 with non SSL HTTP/1.1 connector , that has utf-8 encoded URLs
Connector configuration :
<Connector port="8080" maxHttpHeaderSize="8192" URIEncoding="UTF-8" maxThreads="400" maxKeepAliveRequests="100" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443"
acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" compression="on"/>
Configured virtual host on apache http server:
Listen 81
NameVirtualHost *:81
<VirtualHost *:81>
ServerName jewelry.npa.com
<Proxy *>
AddDefaultCharset utf-8
Order deny,allow
Allow from all
</Proxy>
ProxyPass / ajp://jewelry.npa.com:8009/
ProxyPassReverse / ajp://jewelry.npa.com:8009/
AddDefaultCharset utf-8
</VirtualHost>
Configured ajp connector on tomcat 5.5
<Connector port="8009" useBodyEncodingForURI="false" maxHttpHeaderSize="8192" URIEncoding="UTF-8" maxThreads="400"
maxKeepAliveRequests="100" minSpareThreads="25" maxSpareThreads="75" enableLookups="false"
redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true"
compression="on" protocol="AJP/1.3" />
Problem:
All requests, that has utf-8 url and NOT served by wicket filter works ok.
All requests, that has utf-8 url and served by wicket filter works incorrect, because of encoding issue with ajp connector and incorect work of WicketFilter#getRelativePath(HttpServletRequest request) lines 590 - 594.
Explanation:
ajp module change the percent encoding (http://en.wikipedia.org/wiki/Percent-encoding)
Proposed fix:
Need to use request.getServletPath() instead of request.getRequestURI() to get the relativePath, because of
HttpServletRequest sepecification http://java.sun.com/products/servlet/2.3/javadoc/javax/servlet/http/HttpServletRequest.html
Please look at difference getServletPath returns DECODED value, but getRequestURI and getRequestURL - not.