From 69980c121bb91049acfdbc9ca84ef1470229b824 Mon Sep 17 00:00:00 2001 From: rjung Date: Fri, 29 Jul 2011 22:08:20 +0000 Subject: [PATCH] Set "reuse" flag of final AJP "END_RESPONSE" packet to "0" if we plan to close the connection. mod_jk will respect it and I just committed the same to mod_proxy_ajp in httpd trunk. If the web server does not respect it, things do not get worse by nevertheless setting the flag, because the patch does not change whether we actually close the connection or not. git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@1152385 13f79535-47bb-0310-9956-ffa450edef68 --- java/org/apache/coyote/ajp/AbstractAjpProcessor.java | 11 +++++++++++ java/org/apache/coyote/ajp/AjpAprProcessor.java | 10 ++++++++-- java/org/apache/coyote/ajp/AjpNioProcessor.java | 8 +++++++- java/org/apache/coyote/ajp/AjpProcessor.java | 2 +- webapps/docs/changelog.xml | 4 ++++ 5 files changed, 31 insertions(+), 4 deletions(-) diff --git a/java/org/apache/coyote/ajp/AbstractAjpProcessor.java b/java/org/apache/coyote/ajp/AbstractAjpProcessor.java index 04a0f5577..9ee30e8a8 100644 --- a/java/org/apache/coyote/ajp/AbstractAjpProcessor.java +++ b/java/org/apache/coyote/ajp/AbstractAjpProcessor.java @@ -63,6 +63,7 @@ public abstract class AbstractAjpProcessor extends AbstractProcessor { * End message array. */ protected static final byte[] endMessageArray; + protected static final byte[] endAndCloseMessageArray; /** @@ -88,6 +89,16 @@ public abstract class AbstractAjpProcessor extends AbstractProcessor { System.arraycopy(endMessage.getBuffer(), 0, endMessageArray, 0, endMessage.getLen()); + // Allocate the end and close message array + AjpMessage endAndCloseMessage = new AjpMessage(16); + endAndCloseMessage.reset(); + endAndCloseMessage.appendByte(Constants.JK_AJP13_END_RESPONSE); + endAndCloseMessage.appendByte(0); + endAndCloseMessage.end(); + endAndCloseMessageArray = new byte[endAndCloseMessage.getLen()]; + System.arraycopy(endAndCloseMessage.getBuffer(), 0, endAndCloseMessageArray, 0, + endAndCloseMessage.getLen()); + // Allocate the flush message array AjpMessage flushMessage = new AjpMessage(16); flushMessage.reset(); diff --git a/java/org/apache/coyote/ajp/AjpAprProcessor.java b/java/org/apache/coyote/ajp/AjpAprProcessor.java index 96ded174a..6efd5945f 100644 --- a/java/org/apache/coyote/ajp/AjpAprProcessor.java +++ b/java/org/apache/coyote/ajp/AjpAprProcessor.java @@ -299,10 +299,16 @@ public class AjpAprProcessor extends AbstractAjpProcessor { finished = true; // Add the end message - if (outputBuffer.position() + endMessageArray.length > outputBuffer.capacity()) { + byte[] messageArray; + if (error) { + messageArray = endAndCloseMessageArray; + } else { + messageArray = endMessageArray; + } + if (outputBuffer.position() + messageArray.length > outputBuffer.capacity()) { flush(false); } - outputBuffer.put(endMessageArray); + outputBuffer.put(messageArray); flush(false); } diff --git a/java/org/apache/coyote/ajp/AjpNioProcessor.java b/java/org/apache/coyote/ajp/AjpNioProcessor.java index 4ce2ee808..84cab1338 100644 --- a/java/org/apache/coyote/ajp/AjpNioProcessor.java +++ b/java/org/apache/coyote/ajp/AjpNioProcessor.java @@ -319,7 +319,13 @@ public class AjpNioProcessor extends AbstractAjpProcessor { finished = true; // Add the end message - output(endMessageArray, 0, endMessageArray.length); + byte[] messageArray; + if (error) { + messageArray = endAndCloseMessageArray; + } else { + messageArray = endMessageArray; + } + output(messageArray, 0, messageArray.length); } diff --git a/java/org/apache/coyote/ajp/AjpProcessor.java b/java/org/apache/coyote/ajp/AjpProcessor.java index 35b77b36a..ceb1c2940 100644 --- a/java/org/apache/coyote/ajp/AjpProcessor.java +++ b/java/org/apache/coyote/ajp/AjpProcessor.java @@ -313,7 +313,7 @@ public class AjpProcessor extends AbstractAjpProcessor { finished = true; // Add the end message - output.write(endMessageArray); + output.write(error ? endAndCloseMessageArray : endMessageArray); } diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index 9a08ccfbb..2ae9e9c85 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -128,6 +128,10 @@ Ensure that when using sendfile, HTTP APR sockets are not added to multiple pollers. This may cause errors during shutdown. (markt) + + Set reuse flag of final AJP END_RESPONSE + packet to 0 if we plan to close the connection. (rjung) + -- 2.11.0