Author: rjung Date: Mon Apr 6 21:10:05 2009 New Revision: 762507 URL: http://svn.apache.org/viewvc?rev=762507&view=rev Log: Allow huge request body packets for AJP13. Backport of r697192 and r757708.
Modified: tomcat/tc6.0.x/trunk/STATUS.txt tomcat/tc6.0.x/trunk/java/org/apache/coyote/ajp/AjpAprProcessor.java tomcat/tc6.0.x/trunk/java/org/apache/coyote/ajp/AjpAprProtocol.java tomcat/tc6.0.x/trunk/java/org/apache/coyote/ajp/AjpProcessor.java tomcat/tc6.0.x/trunk/java/org/apache/coyote/ajp/AjpProtocol.java tomcat/tc6.0.x/trunk/java/org/apache/jk/common/ChannelNioSocket.java tomcat/tc6.0.x/trunk/java/org/apache/jk/common/JkInputStream.java tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml Modified: tomcat/tc6.0.x/trunk/STATUS.txt URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/STATUS.txt?rev=762507&r1=762506&r2=762507&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/STATUS.txt (original) +++ tomcat/tc6.0.x/trunk/STATUS.txt Mon Apr 6 21:10:05 2009 @@ -38,14 +38,6 @@ 0: remm (looks risky, very minor problem), fhanik - minor problem -1: -* Allow huge request body packets for AJP13. - This was already applied to connectors, but never - carried forward to trunk and tc6.0.x. - http://svn.apache.org/viewvc?rev=697192&view=rev - Original change: http://svn.apache.org/viewvc?rev=486217&view=rev - +1: rjung, mturk, markt, pero, jim - 0: remm (also affects to the two other AJP connectors) - * Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=45403 See commit message for details of negligable performance impact http://svn.apache.org/viewvc?rev=701358&view=rev @@ -80,13 +72,6 @@ +1: markt, rjung -1: -* Allow huge request body packets for AJP13. - Part 2 of the backport proposed and approved above - (r697192), now also for the other AJP connectors. - http://svn.apache.org/viewvc?rev=757708&view=rev - +1: rjung, markt, remm - -1: - * Backport cleanup of semantics of thisAccessedTime and lastAccessedTime for sessions: - preparational whitespace changes Modified: tomcat/tc6.0.x/trunk/java/org/apache/coyote/ajp/AjpAprProcessor.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/coyote/ajp/AjpAprProcessor.java?rev=762507&r1=762506&r2=762507&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/coyote/ajp/AjpAprProcessor.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/coyote/ajp/AjpAprProcessor.java Mon Apr 6 21:10:05 2009 @@ -86,10 +86,23 @@ response.setOutputBuffer(new SocketOutputBuffer()); request.setResponse(response); + this.packetSize = packetSize; requestHeaderMessage = new AjpMessage(packetSize); responseHeaderMessage = new AjpMessage(packetSize); bodyMessage = new AjpMessage(packetSize); - + + // Set the get body message buffer + AjpMessage getBodyMessage = new AjpMessage(16); + getBodyMessage.reset(); + getBodyMessage.appendByte(Constants.JK_AJP13_GET_BODY_CHUNK); + // Adjust allowed size if packetSize != default (Constants.MAX_PACKET_SIZE) + getBodyMessage.appendInt(Constants.MAX_READ_SIZE + packetSize - Constants.MAX_PACKET_SIZE); + getBodyMessage.end(); + getBodyMessageBuffer = + ByteBuffer.allocateDirect(getBodyMessage.getLen()); + getBodyMessageBuffer.put(getBodyMessage.getBuffer(), 0, + getBodyMessage.getLen()); + // Allocate input and output buffers inputBuffer = ByteBuffer.allocateDirect(packetSize * 2); inputBuffer.limit(0); @@ -126,6 +139,12 @@ /** + * The socket timeout used when reading the first block of the request + * header. + */ + protected int packetSize; + + /** * Header message. Note that this header is merely the one used during the * processing of the first message of a "request", so it might not be a request * header. It will stay unchanged during the processing of the whole request. @@ -238,7 +257,7 @@ /** * Direct buffer used for sending right away a get body message. */ - protected static final ByteBuffer getBodyMessageBuffer; + protected final ByteBuffer getBodyMessageBuffer; /** @@ -263,17 +282,6 @@ static { - // Set the get body message buffer - AjpMessage getBodyMessage = new AjpMessage(16); - getBodyMessage.reset(); - getBodyMessage.appendByte(Constants.JK_AJP13_GET_BODY_CHUNK); - getBodyMessage.appendInt(Constants.MAX_READ_SIZE); - getBodyMessage.end(); - getBodyMessageBuffer = - ByteBuffer.allocateDirect(getBodyMessage.getLen()); - getBodyMessageBuffer.put(getBodyMessage.getBuffer(), 0, - getBodyMessage.getLen()); - // Set the read body message buffer AjpMessage pongMessage = new AjpMessage(16); pongMessage.reset(); @@ -1280,7 +1288,8 @@ int len = chunk.getLength(); // 4 - hardcoded, byte[] marshalling overhead - int chunkSize = Constants.MAX_SEND_SIZE; + // Adjust allowed size if packetSize != default (Constants.MAX_PACKET_SIZE) + int chunkSize = Constants.MAX_SEND_SIZE + packetSize - Constants.MAX_PACKET_SIZE; int off = 0; while (len > 0) { int thisTime = len; Modified: tomcat/tc6.0.x/trunk/java/org/apache/coyote/ajp/AjpAprProtocol.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/coyote/ajp/AjpAprProtocol.java?rev=762507&r1=762506&r2=762507&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/coyote/ajp/AjpAprProtocol.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/coyote/ajp/AjpAprProtocol.java Mon Apr 6 21:10:05 2009 @@ -291,7 +291,13 @@ */ protected int packetSize = Constants.MAX_PACKET_SIZE; public int getPacketSize() { return packetSize; } - public void setPacketSize(int packetSize) { this.packetSize = packetSize; } + public void setPacketSize(int packetSize) { + if(packetSize < Constants.MAX_PACKET_SIZE) { + this.packetSize = Constants.MAX_PACKET_SIZE; + } else { + this.packetSize = packetSize; + } + } /** * The number of seconds Tomcat will wait for a subsequent request Modified: tomcat/tc6.0.x/trunk/java/org/apache/coyote/ajp/AjpProcessor.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/coyote/ajp/AjpProcessor.java?rev=762507&r1=762506&r2=762507&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/coyote/ajp/AjpProcessor.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/coyote/ajp/AjpProcessor.java Mon Apr 6 21:10:05 2009 @@ -86,10 +86,22 @@ response.setOutputBuffer(new SocketOutputBuffer()); request.setResponse(response); + this.packetSize = packetSize; requestHeaderMessage = new AjpMessage(packetSize); responseHeaderMessage = new AjpMessage(packetSize); bodyMessage = new AjpMessage(packetSize); - + + // Set the get body message buffer + AjpMessage getBodyMessage = new AjpMessage(16); + getBodyMessage.reset(); + getBodyMessage.appendByte(Constants.JK_AJP13_GET_BODY_CHUNK); + // Adjust allowed size if packetSize != default (Constants.MAX_PACKET_SIZE) + getBodyMessage.appendInt(Constants.MAX_READ_SIZE + packetSize - Constants.MAX_PACKET_SIZE); + getBodyMessage.end(); + getBodyMessageArray = new byte[getBodyMessage.getLen()]; + System.arraycopy(getBodyMessage.getBuffer(), 0, getBodyMessageArray, + 0, getBodyMessage.getLen()); + // Cause loading of HexUtils int foo = HexUtils.DEC[0]; @@ -121,6 +133,12 @@ /** + * The socket timeout used when reading the first block of the request + * header. + */ + protected int packetSize; + + /** * Header message. Note that this header is merely the one used during the * processing of the first message of a "request", so it might not be a request * header. It will stay unchanged during the processing of the whole request. @@ -240,7 +258,7 @@ /** * Direct buffer used for sending right away a get body message. */ - protected static final byte[] getBodyMessageArray; + protected final byte[] getBodyMessageArray; /** @@ -265,17 +283,6 @@ static { - // Set the get body message buffer - - AjpMessage getBodyMessage = new AjpMessage(16); - getBodyMessage.reset(); - getBodyMessage.appendByte(Constants.JK_AJP13_GET_BODY_CHUNK); - getBodyMessage.appendInt(Constants.MAX_READ_SIZE); - getBodyMessage.end(); - getBodyMessageArray = new byte[getBodyMessage.getLen()]; - System.arraycopy(getBodyMessage.getBuffer(), 0, getBodyMessageArray, - 0, getBodyMessage.getLen()); - // Set the read body message buffer AjpMessage pongMessage = new AjpMessage(16); pongMessage.reset(); @@ -1218,7 +1225,8 @@ int len = chunk.getLength(); // 4 - hardcoded, byte[] marshalling overhead - int chunkSize = Constants.MAX_SEND_SIZE; + // Adjust allowed size if packetSize != default (Constants.MAX_PACKET_SIZE) + int chunkSize = Constants.MAX_SEND_SIZE + packetSize - Constants.MAX_PACKET_SIZE; int off = 0; while (len > 0) { int thisTime = len; Modified: tomcat/tc6.0.x/trunk/java/org/apache/coyote/ajp/AjpProtocol.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/coyote/ajp/AjpProtocol.java?rev=762507&r1=762506&r2=762507&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/coyote/ajp/AjpProtocol.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/coyote/ajp/AjpProtocol.java Mon Apr 6 21:10:05 2009 @@ -290,7 +290,13 @@ */ protected int packetSize = Constants.MAX_PACKET_SIZE; public int getPacketSize() { return packetSize; } - public void setPacketSize(int packetSize) { this.packetSize = packetSize; } + public void setPacketSize(int packetSize) { + if(packetSize < Constants.MAX_PACKET_SIZE) { + this.packetSize = Constants.MAX_PACKET_SIZE; + } else { + this.packetSize = packetSize; + } + } /** Modified: tomcat/tc6.0.x/trunk/java/org/apache/jk/common/ChannelNioSocket.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/jk/common/ChannelNioSocket.java?rev=762507&r1=762506&r2=762507&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/jk/common/ChannelNioSocket.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/jk/common/ChannelNioSocket.java Mon Apr 6 21:10:05 2009 @@ -664,7 +664,7 @@ void acceptConnections() { if( running ) { try{ - MsgContext ep=createMsgContext(); + MsgContext ep=createMsgContext(packetSize); ep.setSource(this); ep.setWorkerEnv( wEnv ); this.accept(ep); Modified: tomcat/tc6.0.x/trunk/java/org/apache/jk/common/JkInputStream.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/jk/common/JkInputStream.java?rev=762507&r1=762506&r2=762507&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/jk/common/JkInputStream.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/jk/common/JkInputStream.java Mon Apr 6 21:10:05 2009 @@ -52,6 +52,7 @@ private boolean isFirst = true; private boolean isReplay = false; private boolean isReadRequired = false; + private int packetSize = AjpConstants.MAX_PACKET_SIZE; static { // Make certain HttpMessages is loaded for SecurityManager @@ -64,14 +65,19 @@ public JkInputStream(MsgContext context, int bsize) { mc = context; - bodyMsg = new MsgAjp(bsize); - outputMsg = new MsgAjp(bsize); + // Never use less than the default maximum packet size. + if (bsize < AjpConstants.MAX_PACKET_SIZE) + this.packetSize = AjpConstants.MAX_PACKET_SIZE; + else + this.packetSize = bsize; + bodyMsg = new MsgAjp(this.packetSize); + outputMsg = new MsgAjp(this.packetSize); } /** * @deprecated */ public JkInputStream(MsgContext context) { - this(context, 8*1024); + this(context, AjpConstants.MAX_PACKET_SIZE); } // -------------------- Jk specific methods -------------------- @@ -244,7 +250,8 @@ // Why not use outBuf?? bodyMsg.reset(); bodyMsg.appendByte(AjpConstants.JK_AJP13_GET_BODY_CHUNK); - bodyMsg.appendInt(AjpConstants.MAX_READ_SIZE); + // Adjust allowed size if packetSize != default (AjpConstants.MAX_PACKET_SIZE) + bodyMsg.appendInt(AjpConstants.MAX_READ_SIZE + packetSize - AjpConstants.MAX_PACKET_SIZE); if( log.isDebugEnabled() ) log.debug("refillReadBuffer " + Thread.currentThread()); Modified: tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml?rev=762507&r1=762506&r2=762507&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml (original) +++ tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml Mon Apr 6 21:10:05 2009 @@ -43,6 +43,9 @@ </subsection> <subsection name="Coyote"> <changelog> + <update> + Allow huge request body packets for AJP13. (rjung) + </update> <fix> <bug>45026</bug>: Never return an empty HTTP status reason phrase. mod_jk and httpd 2.x do not like that. (rjung) --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org