You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2011/04/06 18:39:39 UTC
svn commit: r1089531 - in /tomcat/trunk:
java/org/apache/coyote/http11/Http11Processor.java
test/org/apache/coyote/http11/TestAbstractHttp11Processor.java
webapps/docs/changelog.xml
Author: markt
Date: Wed Apr 6 16:39:38 2011
New Revision: 1089531
URL: http://svn.apache.org/viewvc?rev=1089531&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=50957
Fix regression in processing of pipe-lined requests.
Modified:
tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java
tomcat/trunk/test/org/apache/coyote/http11/TestAbstractHttp11Processor.java
tomcat/trunk/webapps/docs/changelog.xml
Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java?rev=1089531&r1=1089530&r2=1089531&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java Wed Apr 6 16:39:38 2011
@@ -314,9 +314,12 @@ public class Http11Processor extends Abs
inputBuffer.nextRequest();
outputBuffer.nextRequest();
}
-
- //hack keep alive behavior
- break;
+
+ // If we don't have a pipe-lined request allow this thread to be
+ // used by another connection
+ if (isAsync() || error || inputBuffer.lastValid == 0) {
+ break;
+ }
}
rp.setStage(org.apache.coyote.Constants.STAGE_ENDED);
Modified: tomcat/trunk/test/org/apache/coyote/http11/TestAbstractHttp11Processor.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/coyote/http11/TestAbstractHttp11Processor.java?rev=1089531&r1=1089530&r2=1089531&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/coyote/http11/TestAbstractHttp11Processor.java (original)
+++ tomcat/trunk/test/org/apache/coyote/http11/TestAbstractHttp11Processor.java Wed Apr 6 16:39:38 2011
@@ -14,12 +14,14 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
package org.apache.coyote.http11;
import java.io.File;
+import java.io.IOException;
+import org.apache.catalina.Context;
import org.apache.catalina.startup.SimpleHttpClient;
+import org.apache.catalina.startup.TesterServlet;
import org.apache.catalina.startup.Tomcat;
import org.apache.catalina.startup.TomcatBaseTest;
@@ -171,6 +173,66 @@ public class TestAbstractHttp11Processor
}
+ public void testPipelining() throws Exception {
+ Tomcat tomcat = getTomcatInstance();
+
+ // Must have a real docBase - just use temp
+ Context ctxt = tomcat.addContext("",
+ System.getProperty("java.io.tmpdir"));
+
+ // Add protected servlet
+ Tomcat.addServlet(ctxt, "TesterServlet", new TesterServlet());
+ ctxt.addServletMapping("/foo", "TesterServlet");
+
+ tomcat.start();
+
+ String requestPart1 =
+ "GET /foo HTTP/1.1" + SimpleHttpClient.CRLF;
+ String requestPart2 =
+ "Host: any" + SimpleHttpClient.CRLF +
+ SimpleHttpClient.CRLF;
+
+ final Client client = new Client();
+ client.setPort(getPort());
+ client.setRequest(new String[] {requestPart1, requestPart2});
+ client.setRequestPause(1000);
+ client.setUseContentLength(true);
+ client.connect();
+
+ Runnable send = new Runnable() {
+ @Override
+ public void run() {
+ try {
+ client.sendRequest();
+ client.sendRequest();
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ };
+ Thread t = new Thread(send);
+ t.start();
+
+ // Sleep for 1500 ms which should mean the all of request 1 has been
+ // sent and half of request 2
+ Thread.sleep(1500);
+
+ // Now read the first response
+ client.readResponse(true);
+ assertFalse(client.isResponse50x());
+ assertTrue(client.isResponse200());
+ assertEquals("OK", client.getResponseBody());
+
+ // Read the second response. No need to sleep, read will block until
+ // there is data to process
+ client.readResponse(true);
+ assertFalse(client.isResponse50x());
+ assertTrue(client.isResponse200());
+ assertEquals("OK", client.getResponseBody());
+ }
+
private static final class Client extends SimpleHttpClient {
@Override
public boolean isResponseBodyOK() {
Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1089531&r1=1089530&r2=1089531&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Wed Apr 6 16:39:38 2011
@@ -58,6 +58,14 @@
</update>
</changelog>
</subsection>
+ <subsection name="Coyote">
+ <changelog>
+ <fix>
+ <bug>50957</bug>: Fix regression in HTTP BIO connector that triggered
+ errors when processing pipe-lined requests. (markt)
+ </fix>
+ </changelog>
+ </subsection>
<subsection name="Web applications">
<changelog>
<update>
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org