From: markt Date: Wed, 6 Apr 2011 16:39:38 +0000 (+0000) Subject: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=50957 X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=adbc9384f70e415a48e22ad85d5958769ed1a4cd;p=tomcat7.0 Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=50957 Fix regression in processing of pipe-lined requests. git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@1089531 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/java/org/apache/coyote/http11/Http11Processor.java b/java/org/apache/coyote/http11/Http11Processor.java index cc95597d6..5fd2b0164 100644 --- a/java/org/apache/coyote/http11/Http11Processor.java +++ b/java/org/apache/coyote/http11/Http11Processor.java @@ -314,9 +314,12 @@ public class Http11Processor extends AbstractHttp11Processor { 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); diff --git a/test/org/apache/coyote/http11/TestAbstractHttp11Processor.java b/test/org/apache/coyote/http11/TestAbstractHttp11Processor.java index 6425deff2..41660d711 100644 --- a/test/org/apache/coyote/http11/TestAbstractHttp11Processor.java +++ b/test/org/apache/coyote/http11/TestAbstractHttp11Processor.java @@ -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 extends TomcatBaseTest { } + 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() { diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index 1409959fc..b525a405d 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -58,6 +58,14 @@ + + + + 50957: Fix regression in HTTP BIO connector that triggered + errors when processing pipe-lined requests. (markt) + + +