Fix bug 43914. Location headers must be encoded. Patch provided by Ivan Todoroski.
authormarkt <markt@13f79535-47bb-0310-9956-ffa450edef68>
Wed, 26 Dec 2007 21:23:17 +0000 (21:23 +0000)
committermarkt <markt@13f79535-47bb-0310-9956-ffa450edef68>
Wed, 26 Dec 2007 21:23:17 +0000 (21:23 +0000)
git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@606952 13f79535-47bb-0310-9956-ffa450edef68

java/org/apache/catalina/connector/CoyoteAdapter.java

index ad91350..a22e542 100644 (file)
@@ -25,6 +25,7 @@ import org.apache.catalina.Context;
 import org.apache.catalina.Globals;
 import org.apache.catalina.Wrapper;
 import org.apache.catalina.util.StringManager;
+import org.apache.catalina.util.URLEncoder;
 import org.apache.coyote.ActionCode;
 import org.apache.coyote.Adapter;
 import org.apache.juli.logging.Log;
@@ -101,6 +102,28 @@ public class CoyoteAdapter
         StringManager.getManager(Constants.Package);
 
 
+    /**
+     * Encoder for the Location URL in HTTP redirects.
+     */
+    protected static URLEncoder urlEncoder;
+
+
+    // ----------------------------------------------------- Static Initializer
+
+
+    /**
+     * The safe character set.
+     */
+    static {
+        urlEncoder = new URLEncoder();
+        urlEncoder.addSafeCharacter('-');
+        urlEncoder.addSafeCharacter('_');
+        urlEncoder.addSafeCharacter('.');
+        urlEncoder.addSafeCharacter('*');
+        urlEncoder.addSafeCharacter('/');
+    }
+
+
     // -------------------------------------------------------- Adapter Methods
 
     
@@ -452,7 +475,7 @@ public class CoyoteAdapter
         // Possible redirect
         MessageBytes redirectPathMB = request.getMappingData().redirectPath;
         if (!redirectPathMB.isNull()) {
-            String redirectPath = redirectPathMB.toString();
+            String redirectPath = urlEncoder.encode(redirectPathMB.toString());
             String query = request.getQueryString();
             if (request.isRequestedSessionIdFromURL()) {
                 // This is not optimal, but as this is not very common, it