larryi 2004/01/05 18:06:26 Modified: coyote/src/java/org/apache/coyote/tomcat4 CoyoteAdapter.java CoyoteRequest.java Log: Port convertURI() method so URIEncoding setting has the desired effect. Revision Changes Path 1.25 +62 -6 jakarta-tomcat-connectors/coyote/src/java/org/apache/coyote/tomcat4/CoyoteAdapter.java Index: CoyoteAdapter.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/coyote/src/java/org/apache/coyote/tomcat4/CoyoteAdapter.java,v retrieving revision 1.24 retrieving revision 1.25 diff -u -r1.24 -r1.25 --- CoyoteAdapter.java 11 Dec 2003 21:35:24 -0000 1.24 +++ CoyoteAdapter.java 6 Jan 2004 02:06:26 -0000 1.25 @@ -68,6 +68,7 @@ import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; +import org.apache.tomcat.util.buf.B2CConverter; import org.apache.tomcat.util.buf.ByteChunk; import org.apache.tomcat.util.buf.CharChunk; import org.apache.tomcat.util.buf.MessageBytes; @@ -220,7 +221,7 @@ */ protected void postParseRequest(Request req, CoyoteRequest request, Response res, CoyoteResponse response) - throws IOException { + throws Exception { // XXX the processor needs to set a correct scheme and port prior to this point, // in ajp13 protocols dont make sense to get the port from the connector.. // XXX the processor may have set a correct scheme and port prior to this point, @@ -268,7 +269,6 @@ res.setMessage("Invalid URI"); throw ioe; } - req.decodedURI().setEncoding("UTF-8"); // Normalize decoded URI if (!normalize(req.decodedURI())) { @@ -277,6 +277,9 @@ throw new IOException("Invalid URI"); } + // URI character decoding + convertURI(req.decodedURI(), request); + // Parse session Id parseSessionId(req, request); @@ -293,6 +296,7 @@ // Redoing the URI decoding req.decodedURI().duplicate(req.requestURI()); req.getURLDecoder().convert(req.decodedURI(), true); + convertURI(req.decodedURI(), request); } } @@ -512,6 +516,58 @@ // Return the normalized path that we have completed return (normalized); + + } + + + /** + * Character conversion of the URI. + */ + protected void convertURI(MessageBytes uri, CoyoteRequest request) + throws Exception { + + ByteChunk bc = uri.getByteChunk(); + CharChunk cc = uri.getCharChunk(); + cc.allocate(bc.getLength(), -1); + + String enc = connector.getURIEncoding(); + if (enc != null) { + B2CConverter conv = request.getURIConverter(); + try { + if (conv == null) { + conv = new B2CConverter(enc); + request.setURIConverter(conv); + } else { + conv.recycle(); + } + } catch (IOException e) { + // Ignore + log("Invalid URI encoding; using HTTP default", e); + connector.setURIEncoding(null); + } + if (conv != null) { + try { + conv.convert(bc, cc); + uri.setChars(cc.getBuffer(), cc.getStart(), + cc.getLength()); + return; + } catch (IOException e) { + if (debug >= 1) { + log("Invalid URI character encoding; trying ascii", e); + } + cc.recycle(); + } + } + } + + // Default encoding: fast conversion + byte[] bbuf = bc.getBuffer(); + char[] cbuf = cc.getBuffer(); + int start = bc.getStart(); + for (int i = 0; i < bc.getLength(); i++) { + cbuf[i] = (char) (bbuf[i + start] & 0xff); + } + uri.setChars(cbuf, 0, bc.getLength()); } 1.36 +27 -4 jakarta-tomcat-connectors/coyote/src/java/org/apache/coyote/tomcat4/CoyoteRequest.java Index: CoyoteRequest.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/coyote/src/java/org/apache/coyote/tomcat4/CoyoteRequest.java,v retrieving revision 1.35 retrieving revision 1.36 diff -u -r1.35 -r1.36 --- CoyoteRequest.java 12 Dec 2003 02:44:34 -0000 1.35 +++ CoyoteRequest.java 6 Jan 2004 02:06:26 -0000 1.36 @@ -110,6 +110,7 @@ import org.apache.catalina.util.StringParser; import org.apache.coyote.ActionCode; import org.apache.coyote.Request; +import org.apache.tomcat.util.buf.B2CConverter; import org.apache.tomcat.util.http.Parameters; /** @@ -577,6 +578,28 @@ */ public void setStream(InputStream stream) { // Ignore + } + + + /** + * URI byte to char converter (not recycled). + */ + protected B2CConverter URIConverter = null; + + /** + * Return the URI converter. + */ + protected B2CConverter getURIConverter() { + return URIConverter; + } + + /** + * Set the URI converter. + * + * @param URIConverter the new URI connverter + */ + protected void setURIConverter(B2CConverter URIConverter) { + this.URIConverter = URIConverter; }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]