Author: remm
Date: Thu Jul 27 08:03:46 2006
New Revision: 426096

URL: http://svn.apache.org/viewvc?rev=426096&view=rev
Log:
- Backport.
- Allow ';' in the URL if properly %xx encoded.

Modified:
    
tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/connector/CoyoteAdapter.java
    tomcat/container/tc5.5.x/webapps/docs/changelog.xml

Modified: 
tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/connector/CoyoteAdapter.java
URL: 
http://svn.apache.org/viewvc/tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/connector/CoyoteAdapter.java?rev=426096&r1=426095&r2=426096&view=diff
==============================================================================
--- 
tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/connector/CoyoteAdapter.java
 (original)
+++ 
tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/connector/CoyoteAdapter.java
 Thu Jul 27 08:03:46 2006
@@ -205,11 +205,21 @@
             req.serverName().setString(proxyName);
         }
 
+        // Parse session Id
+        parseSessionId(req, request);
+
         // URI decoding
         MessageBytes decodedURI = req.decodedURI();
         decodedURI.duplicate(req.requestURI());
 
         if (decodedURI.getType() == MessageBytes.T_BYTES) {
+            // Remove any path parameters
+            ByteChunk uriBB = decodedURI.getByteChunk();
+            int semicolon = uriBB.indexOf(';', 0);
+            if (semicolon > 0) {
+                decodedURI.setBytes
+                (uriBB.getBuffer(), uriBB.getStart(), semicolon);
+            }
             // %xx decoding of the URL
             try {
                 req.getURLDecoder().convert(decodedURI, false);
@@ -231,6 +241,13 @@
             // protocol handler, we have to assume the URL has been properly
             // decoded already
             decodedURI.toChars();
+            // Remove any path parameters
+            CharChunk uriCC = decodedURI.getCharChunk();
+            int semicolon = uriCC.indexOf(';');
+            if (semicolon > 0) {
+                decodedURI.setChars
+                (uriCC.getBuffer(), uriCC.getStart(), semicolon);
+            }
         }
 
         // Set the remote principal
@@ -245,9 +262,6 @@
             request.setAuthType(authtype);
         }
 
-        // Parse session Id
-        parseSessionId(req, request);
-
         // Remove any remaining parameters (other than session id, which has
         // already been removed in parseSessionId()) from the URI, so they
         // won't be considered by the mapping algorithm.
@@ -332,49 +346,35 @@
      */
     protected void parseSessionId(org.apache.coyote.Request req, Request 
request) {
 
-        CharChunk uriCC = req.decodedURI().getCharChunk();
-        int semicolon = uriCC.indexOf(match, 0, match.length(), 0);
+        ByteChunk uriBC = req.requestURI().getByteChunk();
+        int semicolon = uriBC.indexOf(match, 0, match.length(), 0);
 
         if (semicolon > 0) {
 
             // Parse session ID, and extract it from the decoded request URI
-            int start = uriCC.getStart();
-            int end = uriCC.getEnd();
+            int start = uriBC.getStart();
+            int end = uriBC.getEnd();
 
-            int sessionIdStart = start + semicolon + match.length();
-            int semicolon2 = uriCC.indexOf(';', sessionIdStart);
+            int sessionIdStart = semicolon + match.length();
+            int semicolon2 = uriBC.indexOf(';', sessionIdStart);
             if (semicolon2 >= 0) {
                 request.setRequestedSessionId
-                    (new String(uriCC.getBuffer(), sessionIdStart, 
-                                semicolon2 - semicolon - match.length()));
+                    (new String(uriBC.getBuffer(), start + sessionIdStart, 
+                            semicolon2 - sessionIdStart));
+                // Extract session ID from request URI
+                byte[] buf = uriBC.getBuffer();
+                for (int i = 0; i < end - start - semicolon2; i++) {
+                    buf[start + semicolon + i] 
+                        = buf[start + i + semicolon2];
+                }
+                uriBC.setBytes(buf, start, end - start - semicolon2 + 
semicolon);
             } else {
                 request.setRequestedSessionId
-                    (new String(uriCC.getBuffer(), sessionIdStart, 
-                                end - sessionIdStart));
-            }
-            request.setRequestedSessionURL(true);
-
-            // Extract session ID from request URI
-            ByteChunk uriBC = req.requestURI().getByteChunk();
-            start = uriBC.getStart();
-            end = uriBC.getEnd();
-            semicolon = uriBC.indexOf(match, 0, match.length(), 0);
-
-            if (semicolon > 0) {
-                sessionIdStart = start + semicolon;
-                semicolon2 = uriCC.indexOf
-                    (';', start + semicolon + match.length());
+                    (new String(uriBC.getBuffer(), start + sessionIdStart, 
+                            (end - start) - sessionIdStart));
                 uriBC.setEnd(start + semicolon);
-                byte[] buf = uriBC.getBuffer();
-                if (semicolon2 >= 0) {
-                    for (int i = 0; i < end - start - semicolon2; i++) {
-                        buf[start + semicolon + i] 
-                            = buf[start + i + semicolon2];
-                    }
-                    uriBC.setBytes(buf, start, semicolon 
-                                   + (end - start - semicolon2));
-                }
             }
+            request.setRequestedSessionURL(true);
 
         } else {
             request.setRequestedSessionId(null);

Modified: tomcat/container/tc5.5.x/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/container/tc5.5.x/webapps/docs/changelog.xml?rev=426096&r1=426095&r2=426096&view=diff
==============================================================================
--- tomcat/container/tc5.5.x/webapps/docs/changelog.xml (original)
+++ tomcat/container/tc5.5.x/webapps/docs/changelog.xml Thu Jul 27 08:03:46 2006
@@ -73,6 +73,10 @@
         <bug>39592</bug>: Stop HEAD requests for resources handled by SSI
         servlet or filter generating stack traces in the logs. (markt)
       </fix>
+      <fix>
+        Improve handling of the ';' character in the URL so that it is now
+        allowed if properly %xx encoded. (remm)
+      </fix>
   </changelog>
   </subsection> 
   <subsection name="Webapps">



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to