diff options
3 files changed, 55 insertions, 1 deletions
diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpParser.java b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpParser.java index 5d24c9cac3..1effdada24 100644 --- a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpParser.java +++ b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpParser.java @@ -637,8 +637,8 @@ public class HttpParser implements Parser break; case HttpTokens.NO_CONTENT: - _handler.headerComplete(); _state=_persistent||(_responseStatus>=100&&_responseStatus<200)?STATE_END:STATE_SEEKING_EOF; + _handler.headerComplete(); _handler.messageComplete(_contentPosition); return 1; diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractHttpConnection.java b/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractHttpConnection.java index 42bd11d3c3..ccdd878900 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractHttpConnection.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractHttpConnection.java @@ -922,6 +922,8 @@ public abstract class AbstractHttpConnection extends AbstractConnection { _generator.setPersistent(true); _parser.setPersistent(true); + if (_parser instanceof HttpParser) + ((HttpParser)_parser).setState(HttpParser.STATE_END); } if (_server.getSendDateHeader()) diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/HttpServerTestBase.java b/jetty-server/src/test/java/org/eclipse/jetty/server/HttpServerTestBase.java index 899038e499..4fabe954dd 100644 --- a/jetty-server/src/test/java/org/eclipse/jetty/server/HttpServerTestBase.java +++ b/jetty-server/src/test/java/org/eclipse/jetty/server/HttpServerTestBase.java @@ -1234,6 +1234,58 @@ public abstract class HttpServerTestBase extends HttpServerTestFixture } } + @Test + public void testAvailableForPipelinedRequests() throws Exception + { + configureServer(new AbstractHandler() + { + public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException + { + baseRequest.setHandled(true); + int available = request.getInputStream().available(); + ServletOutputStream output = response.getOutputStream(); + output.println(target); + output.println(String.valueOf(available)); + } + }); + + Socket client = newSocket(HOST,_connector.getLocalPort()); + try + { + OutputStream output = client.getOutputStream(); + InputStream input = client.getInputStream(); + + output.write(( + "GET /one HTTP/1.1\r\n"+ + "host: "+HOST+":"+_connector.getLocalPort()+"\r\n"+ + "\r\n"+ + "GET /two HTTP/1.1\r\n"+ + "host: "+HOST+":"+_connector.getLocalPort()+"\r\n"+ + "\r\n" + ).getBytes()); + output.flush(); + + BufferedReader reader = new BufferedReader(new InputStreamReader(input, "UTF-8")); + + while(reader.readLine().length() > 0) + { + // Skip response headers. + } + assertEquals("/one", reader.readLine()); + assertEquals(0, Integer.parseInt(reader.readLine())); + + while(reader.readLine().length() > 0) + { + // Skip response headers. + } + assertEquals("/two", reader.readLine()); + assertEquals(0, Integer.parseInt(reader.readLine())); + } + finally + { + client.close(); + } + } @Test public void testDualRequest1() throws Exception |