From 183e3acabb828af8ed370b8a5eeaacbd6a5bf91b Mon Sep 17 00:00:00 2001 From: Greg Wilkins Date: Thu, 7 Jul 2016 16:36:22 +1000 Subject: [PATCH 1/5] Issue #695 improve getResponse methods --- .../eclipse/jetty/io/ByteArrayEndPoint.java | 2 +- .../eclipse/jetty/server/LocalConnector.java | 100 +++++++++++++++--- 2 files changed, 88 insertions(+), 14 deletions(-) diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/ByteArrayEndPoint.java b/jetty-io/src/main/java/org/eclipse/jetty/io/ByteArrayEndPoint.java index 6e9684bf050..fd2a6b9c806 100644 --- a/jetty-io/src/main/java/org/eclipse/jetty/io/ByteArrayEndPoint.java +++ b/jetty-io/src/main/java/org/eclipse/jetty/io/ByteArrayEndPoint.java @@ -282,7 +282,7 @@ public class ByteArrayEndPoint extends AbstractEndPoint try(Locker.Lock lock = _locker.lock()) { - if (BufferUtil.isEmpty(_out)) + if (BufferUtil.isEmpty(_out) && !_closed && !_oshut) _hasOutput.await(time,unit); b=_out; diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/LocalConnector.java b/jetty-server/src/main/java/org/eclipse/jetty/server/LocalConnector.java index c00b0673338..348cf148de5 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/LocalConnector.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/LocalConnector.java @@ -38,11 +38,20 @@ import org.eclipse.jetty.util.ByteArrayOutputStream2; import org.eclipse.jetty.util.ssl.SslContextFactory; import org.eclipse.jetty.util.thread.Scheduler; +/** + * A local connector, mostly for testing purposes. + *
+ *  HttpTester.Request request = HttpTester.newRequest();
+ *  request.setURI("/some/resource");
+ *  HttpTester.Response response = 
+ *      HttpTester.parseResponse(HttpTester.from(localConnector.getResponse(request.generate())));
+ * 
+ * + */ public class LocalConnector extends AbstractConnector { private final BlockingQueue _connects = new LinkedBlockingQueue<>(); - public LocalConnector(Server server, Executor executor, Scheduler scheduler, ByteBufferPool pool, int acceptors, ConnectionFactory... factories) { super(server,executor,scheduler,pool,acceptors,factories); @@ -198,20 +207,36 @@ public class LocalConnector extends AbstractConnector { return getResponse(requestsBuffer,false,10,TimeUnit.SECONDS); } + + /** Get a single response using a parser to search for the end of the message. + * @param requestBuffer The request to send + * @param time The time to wait + * @param unit The units of the wait + * @return ByteBuffer containing response or null. + * @throws Exception If there is a problem + */ + public ByteBuffer getResponse(ByteBuffer requestBuffer, long time,TimeUnit unit) throws Exception + { + boolean head = BufferUtil.toString(requestBuffer).toLowerCase().startsWith("head "); + if (LOG.isDebugEnabled()) + LOG.debug("requests {}", BufferUtil.toUTF8String(requestBuffer)); + LocalEndPoint endp = executeRequest(requestBuffer); + return endp.waitForResponse(head,time,unit); + } /** Get a single response using a parser to search for the end of the message. - * @param requestsBuffer The request to send + * @param requestBuffer The request to send * @param head True if the response is for a head request * @param time The time to wait * @param unit The units of the wait * @return ByteBuffer containing response or null. * @throws Exception If there is a problem */ - public ByteBuffer getResponse(ByteBuffer requestsBuffer,boolean head, long time,TimeUnit unit) throws Exception + public ByteBuffer getResponse(ByteBuffer requestBuffer,boolean head, long time,TimeUnit unit) throws Exception { if (LOG.isDebugEnabled()) - LOG.debug("requests {}", BufferUtil.toUTF8String(requestsBuffer)); - LocalEndPoint endp = executeRequest(requestsBuffer); + LOG.debug("requests {}", BufferUtil.toUTF8String(requestBuffer)); + LocalEndPoint endp = executeRequest(requestBuffer); return endp.waitForResponse(head,time,unit); } @@ -225,6 +250,25 @@ public class LocalConnector extends AbstractConnector { return getResponse(rawRequest,false,30,TimeUnit.SECONDS); } + + /** Get a single response using a parser to search for the end of the message. + * @param rawRequest The request to send + * @param time The time to wait + * @param unit The units of the wait + * @return ByteBuffer containing response or null. + * @throws Exception If there is a problem + */ + public String getResponse(String rawRequest,long time,TimeUnit unit) throws Exception + { + boolean head = rawRequest.toLowerCase().startsWith("head "); + ByteBuffer requestsBuffer = BufferUtil.toBuffer(rawRequest, StandardCharsets.ISO_8859_1); + if (LOG.isDebugEnabled()) + LOG.debug("request {}", BufferUtil.toUTF8String(requestsBuffer)); + LocalEndPoint endp = executeRequest(requestsBuffer); + + return BufferUtil.toString(endp.waitForResponse(head,time,unit), StandardCharsets.ISO_8859_1); + } + /** Get a single response using a parser to search for the end of the message. * @param rawRequest The request to send @@ -244,8 +288,6 @@ public class LocalConnector extends AbstractConnector return BufferUtil.toString(endp.waitForResponse(head,time,unit), StandardCharsets.ISO_8859_1); } - - /** Local EndPoint */ public class LocalEndPoint extends ByteArrayEndPoint @@ -332,7 +374,30 @@ public class LocalConnector extends AbstractConnector } } } - + + /** Wait for a response using a parser to detect the end of message + * @return Buffer containing full response or null for EOF; + * @throws Exception + */ + public String getResponse() throws Exception + { + return getResponse(false,30,TimeUnit.SECONDS); + } + + /** Wait for a response using a parser to detect the end of message + * @param head + * @param time + * @param unit + * @return Buffer containing full response or null for EOF; + * @throws Exception + */ + public String getResponse(boolean head, long time,TimeUnit unit) throws Exception + { + ByteBuffer response = waitForResponse(head,time,unit); + if (response!=null) + return BufferUtil.toString(response); + return null; + } /** Wait for a response using a parser to detect the end of message * @param head @@ -391,7 +456,6 @@ public class LocalConnector extends AbstractConnector } }; - HttpParser parser = new HttpParser(handler); parser.setHeadResponse(head); try(ByteArrayOutputStream2 bout = new ByteArrayOutputStream2();) @@ -399,10 +463,20 @@ public class LocalConnector extends AbstractConnector loop: while(true) { // read a chunk of response - ByteBuffer chunk = BufferUtil.hasContent(_responseData) - ? _responseData : waitForOutput(time,unit); - _responseData=null; - + ByteBuffer chunk; + if (BufferUtil.hasContent(_responseData)) + chunk = _responseData; + else + { + chunk = waitForOutput(time,unit); + if (BufferUtil.isEmpty(chunk) && (!isOpen() || isOutputShutdown())) + { + parser.atEOF(); + parser.parseNext(BufferUtil.EMPTY_BUFFER); + break loop; + } + } + // Parse the content of this chunk while (BufferUtil.hasContent(chunk)) { From e38ec83de9d8f354e08ac1c5a8e61aa395307ada Mon Sep 17 00:00:00 2001 From: Greg Wilkins Date: Thu, 7 Jul 2016 18:13:44 +1000 Subject: [PATCH 2/5] Issue #695 use the getResponse methods --- .../java/org/eclipse/jetty/http/HttpURI.java | 2 +- .../org/eclipse/jetty/http/HttpTester.java | 25 +++- .../eclipse/jetty/io/ByteArrayEndPoint.java | 24 ++- .../eclipse/jetty/server/LocalConnector.java | 7 + .../jetty/server/HttpConnectionTest.java | 89 ++++++----- .../eclipse/jetty/server/HttpOutputTest.java | 88 ++++++----- .../jetty/server/PartialRFC2616Test.java | 141 ++++++++++++------ .../org/eclipse/jetty/server/RequestTest.java | 127 +++++++++------- .../handler/ContextHandlerCollectionTest.java | 2 +- .../server/handler/ContextHandlerTest.java | 2 +- .../jetty/servlet/AsyncListenerTest.java | 26 ++-- .../eclipse/jetty/servlet/ServletTester.java | 8 +- .../jetty/servlets/ThreadStarvationTest.java | 8 +- 13 files changed, 339 insertions(+), 210 deletions(-) diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpURI.java b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpURI.java index ec54cc5f19c..4b7d9cfd91d 100644 --- a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpURI.java +++ b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpURI.java @@ -477,7 +477,7 @@ public class HttpURI case ASTERISK: { - throw new IllegalArgumentException("only '*'"); + throw new IllegalArgumentException("Bad character '*'"); } case FRAGMENT: diff --git a/jetty-http/src/test/java/org/eclipse/jetty/http/HttpTester.java b/jetty-http/src/test/java/org/eclipse/jetty/http/HttpTester.java index 7da2f9bd010..75dd55e84d9 100644 --- a/jetty-http/src/test/java/org/eclipse/jetty/http/HttpTester.java +++ b/jetty-http/src/test/java/org/eclipse/jetty/http/HttpTester.java @@ -107,9 +107,19 @@ public class HttpTester public abstract static class Input { + final ByteBuffer _buffer; boolean _eof=false; HttpParser _parser; - ByteBuffer _buffer = BufferUtil.allocate(8192); + + Input() + { + this(BufferUtil.allocate(8192)); + } + + Input(ByteBuffer buffer) + { + _buffer = buffer; + } public ByteBuffer getBuffer() { @@ -142,6 +152,19 @@ public class HttpTester } + public static Input from(final ByteBuffer data) + { + return new Input(data.slice()) + { + @Override + public int fillBuffer() throws IOException + { + _eof=true; + return -1; + } + }; + } + public static Input from(final InputStream in) { return new Input() diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/ByteArrayEndPoint.java b/jetty-io/src/main/java/org/eclipse/jetty/io/ByteArrayEndPoint.java index a37401d20fd..cc4fa118daf 100644 --- a/jetty-io/src/main/java/org/eclipse/jetty/io/ByteArrayEndPoint.java +++ b/jetty-io/src/main/java/org/eclipse/jetty/io/ByteArrayEndPoint.java @@ -143,6 +143,28 @@ public class ByteArrayEndPoint extends AbstractEndPoint onOpen(); } + /* ------------------------------------------------------------ */ + @Override + public void doShutdownOutput() + { + super.doShutdownOutput(); + try(Locker.Lock lock = _locker.lock()) + { + _hasOutput.signalAll(); + } + } + + /* ------------------------------------------------------------ */ + @Override + public void doClose() + { + super.doClose(); + try(Locker.Lock lock = _locker.lock()) + { + _hasOutput.signalAll(); + } + } + /* ------------------------------------------------------------ */ @Override public InetSocketAddress getLocalAddress() @@ -317,7 +339,7 @@ public class ByteArrayEndPoint extends AbstractEndPoint try(Locker.Lock lock = _locker.lock()) { - if (BufferUtil.isEmpty(_out) && !_closed && !_oshut) + if (BufferUtil.isEmpty(_out) && isOpen() && !isOutputShutdown()) _hasOutput.await(time,unit); b=_out; diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/LocalConnector.java b/jetty-server/src/main/java/org/eclipse/jetty/server/LocalConnector.java index aabec31a295..0fe35c97a6b 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/LocalConnector.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/LocalConnector.java @@ -94,6 +94,7 @@ public class LocalConnector extends AbstractConnector * @param requests the requests * @return the responses * @throws Exception if the requests fail + * @deprecated Use {@link #getResponse(String)} */ public String getResponses(String requests) throws Exception { @@ -112,6 +113,7 @@ public class LocalConnector extends AbstractConnector * @param units The units of idleFor * @return the responses * @throws Exception if the requests fail + * @deprecated Use {@link #getResponse(String, boolean, long, TimeUnit)} */ public String getResponses(String requests,long idleFor,TimeUnit units) throws Exception { @@ -129,6 +131,7 @@ public class LocalConnector extends AbstractConnector * @param requestsBuffer the requests * @return the responses * @throws Exception if the requests fail + * @deprecated Use {@link #getResponse(ByteBuffer)} */ public ByteBuffer getResponses(ByteBuffer requestsBuffer) throws Exception { @@ -146,6 +149,7 @@ public class LocalConnector extends AbstractConnector * @param units The units of idleFor * @return the responses * @throws Exception if the requests fail + * @deprecated Use {@link #getResponse(ByteBuffer, boolean, long, TimeUnit)} */ public ByteBuffer getResponses(ByteBuffer requestsBuffer,long idleFor,TimeUnit units) throws Exception { @@ -491,6 +495,9 @@ public class LocalConnector extends AbstractConnector } } } + + if (bout.getCount()==0 && isOutputShutdown()) + return null; return ByteBuffer.wrap(bout.getBuf(),0,bout.getCount()); } } diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/HttpConnectionTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/HttpConnectionTest.java index 3b6d32cf9aa..15f9819f032 100644 --- a/jetty-server/src/test/java/org/eclipse/jetty/server/HttpConnectionTest.java +++ b/jetty-server/src/test/java/org/eclipse/jetty/server/HttpConnectionTest.java @@ -46,8 +46,10 @@ import org.eclipse.jetty.http.HttpCompliance; import org.eclipse.jetty.http.HttpHeader; import org.eclipse.jetty.http.HttpParser; import org.eclipse.jetty.http.MimeTypes; +import org.eclipse.jetty.server.LocalConnector.LocalEndPoint; import org.eclipse.jetty.server.handler.AbstractHandler; import org.eclipse.jetty.server.handler.ErrorHandler; +import org.eclipse.jetty.util.BufferUtil; import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Logger; import org.eclipse.jetty.util.log.StacklessLogging; @@ -99,7 +101,7 @@ public class HttpConnectionTest int offset=0; // Chunk last - response=connector.getResponses("GET /R1 HTTP/1.1\r\n"+ + response=connector.getResponse("GET /R1 HTTP/1.1\r\n"+ "Host: localhost\r\n"+ "Transfer-Encoding: chunked\r\n"+ "Content-Type: text/plain\r\n"+ @@ -114,7 +116,7 @@ public class HttpConnectionTest checkContains(response,offset,"12345"); offset = 0; - response=connector.getResponses("GET /R2 HTTP/1.1\r\n"+ + response=connector.getResponse("GET /R2 HTTP/1.1\r\n"+ "Host: localhost\r\n"+ "Transfer-Encoding: chunked\r\n"+ "Content-Type: text/plain\r\n"+ @@ -139,7 +141,7 @@ public class HttpConnectionTest @Test public void testNoPath() throws Exception { - String response=connector.getResponses("GET http://localhost:80 HTTP/1.1\r\n"+ + String response=connector.getResponse("GET http://localhost:80 HTTP/1.1\r\n"+ "Host: localhost:80\r\n"+ "Connection: close\r\n"+ "\r\n"); @@ -152,7 +154,7 @@ public class HttpConnectionTest @Test public void testDate() throws Exception { - String response=connector.getResponses("GET / HTTP/1.1\r\n"+ + String response=connector.getResponse("GET / HTTP/1.1\r\n"+ "Host: localhost:80\r\n"+ "Connection: close\r\n"+ "\r\n"); @@ -166,7 +168,7 @@ public class HttpConnectionTest @Test public void testSetDate() throws Exception { - String response=connector.getResponses("GET /?date=1+Jan+1970 HTTP/1.1\r\n"+ + String response=connector.getResponse("GET /?date=1+Jan+1970 HTTP/1.1\r\n"+ "Host: localhost:80\r\n"+ "Connection: close\r\n"+ "\r\n"); @@ -180,7 +182,7 @@ public class HttpConnectionTest @Test public void testBadNoPath() throws Exception { - String response=connector.getResponses("GET http://localhost:80/../cheat HTTP/1.1\r\n"+ + String response=connector.getResponse("GET http://localhost:80/../cheat HTTP/1.1\r\n"+ "Host: localhost:80\r\n"+ "\r\n"); checkContains(response,0,"HTTP/1.1 400"); @@ -189,7 +191,7 @@ public class HttpConnectionTest @Test public void testOKPathDotDotPath() throws Exception { - String response=connector.getResponses("GET /ooops/../path HTTP/1.0\r\nHost: localhost:80\r\n\n"); + String response=connector.getResponse("GET /ooops/../path HTTP/1.0\r\nHost: localhost:80\r\n\n"); checkContains(response,0,"HTTP/1.1 200 OK"); checkContains(response,0,"pathInfo=/path"); } @@ -197,14 +199,14 @@ public class HttpConnectionTest @Test public void testBadPathDotDotPath() throws Exception { - String response=connector.getResponses("GET /ooops/../../path HTTP/1.0\r\nHost: localhost:80\r\n\n"); + String response=connector.getResponse("GET /ooops/../../path HTTP/1.0\r\nHost: localhost:80\r\n\n"); checkContains(response,0,"HTTP/1.1 400 Bad URI"); } @Test public void testOKPathEncodedDotDotPath() throws Exception { - String response=connector.getResponses("GET /ooops/%2e%2e/path HTTP/1.0\r\nHost: localhost:80\r\n\n"); + String response=connector.getResponse("GET /ooops/%2e%2e/path HTTP/1.0\r\nHost: localhost:80\r\n\n"); checkContains(response,0,"HTTP/1.1 200 OK"); checkContains(response,0,"pathInfo=/path"); } @@ -212,28 +214,28 @@ public class HttpConnectionTest @Test public void testBadPathEncodedDotDotPath() throws Exception { - String response=connector.getResponses("GET /ooops/%2e%2e/%2e%2e/path HTTP/1.0\r\nHost: localhost:80\r\n\n"); + String response=connector.getResponse("GET /ooops/%2e%2e/%2e%2e/path HTTP/1.0\r\nHost: localhost:80\r\n\n"); checkContains(response,0,"HTTP/1.1 400 Bad URI"); } @Test public void testBadDotDotPath() throws Exception { - String response=connector.getResponses("GET ../path HTTP/1.0\r\nHost: localhost:80\r\n\n"); + String response=connector.getResponse("GET ../path HTTP/1.0\r\nHost: localhost:80\r\n\n"); checkContains(response,0,"HTTP/1.1 400 Bad URI"); } @Test public void testBadSlashDotDotPath() throws Exception { - String response=connector.getResponses("GET /../path HTTP/1.0\r\nHost: localhost:80\r\n\n"); + String response=connector.getResponse("GET /../path HTTP/1.0\r\nHost: localhost:80\r\n\n"); checkContains(response,0,"HTTP/1.1 400 Bad URI"); } @Test public void testEncodedBadDotDotPath() throws Exception { - String response=connector.getResponses("GET %2e%2e/path HTTP/1.0\r\nHost: localhost:80\r\n\n"); + String response=connector.getResponse("GET %2e%2e/path HTTP/1.0\r\nHost: localhost:80\r\n\n"); checkContains(response,0,"HTTP/1.1 400 Bad URI"); } @@ -241,7 +243,9 @@ public class HttpConnectionTest public void test_0_9() throws Exception { connector.getConnectionFactory(HttpConnectionFactory.class).setHttpCompliance(HttpCompliance.RFC2616); - String response=connector.getResponses("GET /R1\n"); + LocalEndPoint endp = connector.executeRequest("GET /R1\n"); + endp.waitUntilClosed(); + String response=BufferUtil.toString(endp.takeOutput()); int offset=0; checkNotContained(response,offset,"HTTP/1.1"); @@ -252,7 +256,7 @@ public class HttpConnectionTest @Test public void testSimple() throws Exception { - String response=connector.getResponses("GET /R1 HTTP/1.1\r\n"+ + String response=connector.getResponse("GET /R1 HTTP/1.1\r\n"+ "Host: localhost\r\n"+ "Connection: close\r\n"+ "\r\n"); @@ -265,7 +269,7 @@ public class HttpConnectionTest @Test public void testEmptyChunk() throws Exception { - String response=connector.getResponses("GET /R1 HTTP/1.1\r\n"+ + String response=connector.getResponse("GET /R1 HTTP/1.1\r\n"+ "Host: localhost\r\n"+ "Transfer-Encoding: chunked\r\n"+ "Content-Type: text/plain\r\n"+ @@ -282,12 +286,12 @@ public class HttpConnectionTest @Test public void testHead() throws Exception { - String responsePOST=connector.getResponses("POST /R1 HTTP/1.1\r\n"+ + String responsePOST=connector.getResponse("POST /R1 HTTP/1.1\r\n"+ "Host: localhost\r\n"+ "Connection: close\r\n"+ "\r\n"); - String responseHEAD=connector.getResponses("HEAD /R1 HTTP/1.1\r\n"+ + String responseHEAD=connector.getResponse("HEAD /R1 HTTP/1.1\r\n"+ "Host: localhost\r\n"+ "Connection: close\r\n"+ "\r\n"); @@ -385,7 +389,7 @@ public class HttpConnectionTest Log.getLogger(HttpParser.class).info("badMessage: Number formate exception expected ..."); String response; - response=connector.getResponses("GET http://localhost:EXPECTED_NUMBER_FORMAT_EXCEPTION/ HTTP/1.1\r\n"+ + response=connector.getResponse("GET http://localhost:EXPECTED_NUMBER_FORMAT_EXCEPTION/ HTTP/1.1\r\n"+ "Host: localhost\r\n"+ "Connection: close\r\n"+ "\r\n"); @@ -400,7 +404,7 @@ public class HttpConnectionTest try(StacklessLogging stackless = new StacklessLogging(HttpParser.class)) { - response=connector.getResponses("GET /bad/encoding%1 HTTP/1.1\r\n"+ + response=connector.getResponse("GET /bad/encoding%1 HTTP/1.1\r\n"+ "Host: localhost\r\n"+ "Connection: close\r\n"+ "\r\n"); @@ -414,13 +418,13 @@ public class HttpConnectionTest Log.getLogger(HttpParser.class).info("badMessage: bad encoding expected ..."); String response; - response=connector.getResponses("GET /foo/bar%c0%00 HTTP/1.1\r\n"+ + response=connector.getResponse("GET /foo/bar%c0%00 HTTP/1.1\r\n"+ "Host: localhost\r\n"+ "Connection: close\r\n"+ "\r\n"); checkContains(response,0,"HTTP/1.1 200"); //now fallback to iso-8859-1 - response=connector.getResponses("GET /bad/utf8%c1 HTTP/1.1\r\n"+ + response=connector.getResponse("GET /bad/utf8%c1 HTTP/1.1\r\n"+ "Host: localhost\r\n"+ "Connection: close\r\n"+ "\r\n"); @@ -432,7 +436,7 @@ public class HttpConnectionTest { int offset=0; - String response = connector.getResponses("GET /R1 HTTP/1.1\r\n" + + String response = connector.getResponse("GET /R1 HTTP/1.1\r\n" + "Host: localhost\r\n" + "Transfer-Encoding: chunked\r\n" + "Content-Type: text/plain\r\n" + @@ -458,14 +462,14 @@ public class HttpConnectionTest public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setStatus(200); - OutputStream out =response.getOutputStream(); + OutputStream out = response.getOutputStream(); out.flush(); out.flush(); } }); server.start(); - String response=connector.getResponses("GET / HTTP/1.1\r\n"+ + String response=connector.getResponse("GET / HTTP/1.1\r\n"+ "Host: localhost\r\n"+ "Connection: close\r\n"+ "\r\n"); @@ -480,7 +484,7 @@ public class HttpConnectionTest try { int offset=0; - response=connector.getResponses("GET /R1 HTTP/1.1\r\n"+ + response=connector.getResponse("GET /R1 HTTP/1.1\r\n"+ "Host: localhost\r\n"+ "Transfer-Encoding: chunked\r\n"+ "Content-Type: text/plain; charset=utf-8\r\n"+ @@ -496,7 +500,7 @@ public class HttpConnectionTest checkContains(response,offset,"12345"); offset=0; - response=connector.getResponses("GET /R1 HTTP/1.1\r\n"+ + response=connector.getResponse("GET /R1 HTTP/1.1\r\n"+ "Host: localhost\r\n"+ "Transfer-Encoding: chunked\r\n"+ "Content-Type: text/plain; charset = iso-8859-1 ; other=value\r\n"+ @@ -512,7 +516,7 @@ public class HttpConnectionTest checkContains(response,offset,"12345"); offset=0; - response=connector.getResponses("GET /R1 HTTP/1.1\r\n"+ + response=connector.getResponse("GET /R1 HTTP/1.1\r\n"+ "Host: localhost\r\n"+ "Transfer-Encoding: chunked\r\n"+ "Content-Type: text/plain; charset=unknown\r\n"+ @@ -559,7 +563,8 @@ public class HttpConnectionTest "\r\n" + "abcdefghij\r\n"; - String response = connector.getResponses(requests); + LocalEndPoint endp = connector.executeRequest(requests); + String response = endp.getResponse()+endp.getResponse(); offset = checkContains(response,offset,"HTTP/1.1 200"); offset = checkContains(response,offset,"pathInfo=/R1"); @@ -586,7 +591,7 @@ public class HttpConnectionTest "12345\r\n"; long start=System.currentTimeMillis(); - String response = connector.getResponses(requests, 2000, TimeUnit.MILLISECONDS); + String response = connector.getResponse(requests, 2000, TimeUnit.MILLISECONDS); if ((System.currentTimeMillis()-start)>=2000) Assert.fail(); @@ -620,7 +625,8 @@ public class HttpConnectionTest "\r\n"+ "abcdefghij\r\n"; - String response = connector.getResponses(requests); + LocalEndPoint endp = connector.executeRequest(requests); + String response = endp.getResponse()+endp.getResponse(); offset = checkContains(response,offset,"HTTP/1.1 499"); offset = checkContains(response,offset,"HTTP/1.1 200"); @@ -653,7 +659,8 @@ public class HttpConnectionTest "\r\n"+ "abcdefghij\r\n"; - String response = connector.getResponses(requests); + LocalEndPoint endp = connector.executeRequest(requests); + String response = endp.getResponse()+endp.getResponse(); offset = checkContains(response,offset,"HTTP/1.1 599"); offset = checkContains(response,offset,"HTTP/1.1 200"); @@ -688,7 +695,7 @@ public class HttpConnectionTest try (StacklessLogging stackless = new StacklessLogging(logger)) { logger.info("EXPECTING: java.lang.IllegalStateException..."); - String response = connector.getResponses(requests); + String response = connector.getResponse(requests); offset = checkContains(response,offset,"HTTP/1.1 500"); offset = checkContains(response,offset,"Connection: close"); checkNotContained(response,offset,"HTTP/1.1 200"); @@ -702,7 +709,7 @@ public class HttpConnectionTest try { int offset=0; - response=connector.getResponses("GET /R1 HTTP/1.1\r\n"+ + response=connector.getResponse("GET /R1 HTTP/1.1\r\n"+ "Host: localhost\r\n"+ "Connection: TE, close\r\n"+ "Transfer-Encoding: chunked\r\n"+ @@ -736,7 +743,7 @@ public class HttpConnectionTest String cookie = "thisisastringthatshouldreachover1kbytes"; for (int i=0;i<100;i++) cookie+="xxxxxxxxxxxx"; - response = connector.getResponses("GET / HTTP/1.1\r\n"+ + response = connector.getResponse("GET / HTTP/1.1\r\n"+ "Host: localhost\r\n" + "Cookie: "+cookie+"\r\n"+ "\r\n" @@ -769,7 +776,7 @@ public class HttpConnectionTest } request.append("\r\n"); - String response = connector.getResponses(request.toString()); + String response = connector.getResponse(request.toString()); offset = checkContains(response, offset, "HTTP/1.1 413"); checkContains(response, offset, "

Bad Message 413

reason: Request Entity Too Large
"); } @@ -806,7 +813,7 @@ public class HttpConnectionTest try (StacklessLogging stackless = new StacklessLogging(logger)) { logger.info("Expect IOException: Response header too large..."); - response = connector.getResponses("GET / HTTP/1.1\r\n"+ + response = connector.getResponse("GET / HTTP/1.1\r\n"+ "Host: localhost\r\n" + "\r\n" ); @@ -830,7 +837,7 @@ public class HttpConnectionTest { int offset=0; - response=connector.getResponses("OPTIONS * HTTP/1.1\r\n"+ + response=connector.getResponse("OPTIONS * HTTP/1.1\r\n"+ "Host: localhost\r\n"+ "Transfer-Encoding: chunked\r\n"+ "Content-Type: text/plain; charset=utf-8\r\n"+ @@ -843,7 +850,7 @@ public class HttpConnectionTest checkContains(response,offset,"HTTP/1.1 200"); offset=0; - response=connector.getResponses("GET * HTTP/1.1\r\n"+ + response=connector.getResponse("GET * HTTP/1.1\r\n"+ "Host: localhost\r\n"+ "Transfer-Encoding: chunked\r\n"+ "Content-Type: text/plain; charset=utf-8\r\n"+ @@ -856,7 +863,7 @@ public class HttpConnectionTest checkContains(response,offset,"HTTP/1.1 400"); offset=0; - response=connector.getResponses("GET ** HTTP/1.1\r\n"+ + response=connector.getResponse("GET ** HTTP/1.1\r\n"+ "Host: localhost\r\n"+ "Transfer-Encoding: chunked\r\n"+ "Content-Type: text/plain; charset=utf-8\r\n"+ @@ -884,7 +891,7 @@ public class HttpConnectionTest { int offset=0; - response=connector.getResponses("CONNECT www.webtide.com:8080 HTTP/1.1\r\n"+ + response=connector.getResponse("CONNECT www.webtide.com:8080 HTTP/1.1\r\n"+ "Host: myproxy:8888\r\n"+ "\r\n",200,TimeUnit.MILLISECONDS); checkContains(response,offset,"HTTP/1.1 200"); diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/HttpOutputTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/HttpOutputTest.java index b3740a33ebe..5fe09ef3890 100644 --- a/jetty-server/src/test/java/org/eclipse/jetty/server/HttpOutputTest.java +++ b/jetty-server/src/test/java/org/eclipse/jetty/server/HttpOutputTest.java @@ -28,8 +28,6 @@ import java.io.InputStream; import java.nio.ByteBuffer; import java.nio.channels.ReadableByteChannel; import java.util.Arrays; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import javax.servlet.AsyncContext; @@ -39,7 +37,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.eclipse.jetty.server.HttpOutput.Interceptor; -import org.eclipse.jetty.server.HttpOutputTest.ChainedInterceptor; +import org.eclipse.jetty.server.LocalConnector.LocalEndPoint; import org.eclipse.jetty.server.handler.AbstractHandler; import org.eclipse.jetty.server.handler.HotSwapHandler; import org.eclipse.jetty.util.BufferUtil; @@ -90,7 +88,7 @@ public class HttpOutputTest @Test public void testSimple() throws Exception { - String response=_connector.getResponses("GET / HTTP/1.0\nHost: localhost:80\n\n"); + String response=_connector.getResponse("GET / HTTP/1.0\nHost: localhost:80\n\n"); assertThat(response,containsString("HTTP/1.1 200 OK")); } @@ -99,7 +97,7 @@ public class HttpOutputTest @Test public void testByteUnknown() throws Exception { - String response=_connector.getResponses("GET / HTTP/1.0\nHost: localhost:80\n\n"); + String response=_connector.getResponse("GET / HTTP/1.0\nHost: localhost:80\n\n"); assertThat(response,containsString("HTTP/1.1 200 OK")); } @@ -114,7 +112,7 @@ public class HttpOutputTest _handler._content=ByteBuffer.wrap(buffer); _handler._content.limit(12*1024); _handler._content.position(4*1024); - String response=_connector.getResponses("GET / HTTP/1.0\nHost: localhost:80\n\n"); + String response=_connector.getResponse("GET / HTTP/1.0\nHost: localhost:80\n\n"); assertThat(response,containsString("HTTP/1.1 200 OK")); assertThat(response,containsString("\r\nXXXXXXXXXXXXXXXXXXXXXXXXXXX")); @@ -129,7 +127,7 @@ public class HttpOutputTest { Resource simple = Resource.newClassPathResource("simple/simple.txt"); _handler._contentInputStream=simple.getInputStream(); - String response=_connector.getResponses("GET / HTTP/1.0\nHost: localhost:80\n\n"); + String response=_connector.getResponse("GET / HTTP/1.0\nHost: localhost:80\n\n"); assertThat(response,containsString("HTTP/1.1 200 OK")); assertThat(response,containsString("Content-Length: 11")); } @@ -139,7 +137,7 @@ public class HttpOutputTest { Resource big = Resource.newClassPathResource("simple/big.txt"); _handler._contentInputStream=big.getInputStream(); - String response=_connector.getResponses("GET / HTTP/1.0\nHost: localhost:80\n\n"); + String response=_connector.getResponse("GET / HTTP/1.0\nHost: localhost:80\n\n"); assertThat(response,containsString("HTTP/1.1 200 OK")); assertThat(response,Matchers.not(containsString("Content-Length"))); } @@ -157,16 +155,22 @@ public class HttpOutputTest return filled; } }; - String response=_connector.getResponses( + LocalEndPoint endp=_connector.executeRequest( "GET / HTTP/1.1\nHost: localhost:80\n\n"+ "GET / HTTP/1.1\nHost: localhost:80\nConnection: close\n\n" ); - response=response.substring(0,response.lastIndexOf("HTTP/1.1 200 OK")); + String response = endp.getResponse(); + assertThat(response,containsString("HTTP/1.1 200 OK")); assertThat(response,containsString("Transfer-Encoding: chunked")); assertThat(response,containsString("400\tThis is a big file")); assertThat(response,containsString("\r\n0\r\n")); + + response = endp.getResponse(); + assertThat(response,containsString("HTTP/1.1 200 OK")); + assertThat(response,containsString("Connection: close")); + } @Test @@ -174,7 +178,7 @@ public class HttpOutputTest { Resource simple = Resource.newClassPathResource("simple/simple.txt"); _handler._contentChannel=simple.getReadableByteChannel(); - String response=_connector.getResponses("GET / HTTP/1.0\nHost: localhost:80\n\n"); + String response=_connector.getResponse("GET / HTTP/1.0\nHost: localhost:80\n\n"); assertThat(response,containsString("HTTP/1.1 200 OK")); assertThat(response,containsString("Content-Length: 11")); } @@ -184,7 +188,7 @@ public class HttpOutputTest { Resource big = Resource.newClassPathResource("simple/big.txt"); _handler._contentChannel=big.getReadableByteChannel(); - String response=_connector.getResponses("GET / HTTP/1.0\nHost: localhost:80\n\n"); + String response=_connector.getResponse("GET / HTTP/1.0\nHost: localhost:80\n\n"); assertThat(response,containsString("HTTP/1.1 200 OK")); assertThat(response,Matchers.not(containsString("Content-Length"))); assertThat(response,containsString("400\tThis is a big file")); @@ -195,7 +199,7 @@ public class HttpOutputTest { Resource big = Resource.newClassPathResource("simple/big.txt"); _handler._content=BufferUtil.toBuffer(big,true); - String response=_connector.getResponses("GET / HTTP/1.0\nHost: localhost:80\n\n"); + String response=_connector.getResponse("GET / HTTP/1.0\nHost: localhost:80\n\n"); assertThat(response,containsString("HTTP/1.1 200 OK")); assertThat(response,containsString("Content-Length")); assertThat(response,containsString("400\tThis is a big file")); @@ -206,7 +210,7 @@ public class HttpOutputTest { Resource big = Resource.newClassPathResource("simple/big.txt"); _handler._content=BufferUtil.toBuffer(big,false); - String response=_connector.getResponses("GET / HTTP/1.0\nHost: localhost:80\n\n"); + String response=_connector.getResponse("GET / HTTP/1.0\nHost: localhost:80\n\n"); assertThat(response,containsString("HTTP/1.1 200 OK")); assertThat(response,containsString("Content-Length")); assertThat(response,containsString("400\tThis is a big file")); @@ -249,15 +253,19 @@ public class HttpOutputTest } }; - String response=_connector.getResponses( + LocalEndPoint endp=_connector.executeRequest( "GET / HTTP/1.1\nHost: localhost:80\n\n"+ "GET / HTTP/1.1\nHost: localhost:80\nConnection: close\n\n" ); - response=response.substring(0,response.lastIndexOf("HTTP/1.1 200 OK")); + String response = endp.getResponse(); assertThat(response,containsString("HTTP/1.1 200 OK")); assertThat(response,containsString("Transfer-Encoding: chunked")); assertThat(response,containsString("\r\n0\r\n")); + + response = endp.getResponse(); + assertThat(response,containsString("HTTP/1.1 200 OK")); + assertThat(response,containsString("Connection: close")); } @Test @@ -268,7 +276,7 @@ public class HttpOutputTest _handler._content=BufferUtil.toBuffer(big,false); _handler._arrayBuffer=new byte[1]; - String response=_connector.getResponses("GET / HTTP/1.0\nHost: localhost:80\n\n"); + String response=_connector.getResponse("GET / HTTP/1.0\nHost: localhost:80\n\n"); assertThat(response,containsString("HTTP/1.1 200 OK")); assertThat(response,Matchers.not(containsString("Content-Length"))); assertThat(response,containsString("400\tThis is a big file")); @@ -282,7 +290,7 @@ public class HttpOutputTest _handler._content=BufferUtil.toBuffer(big,false); _handler._arrayBuffer=new byte[8]; - String response=_connector.getResponses("GET / HTTP/1.0\nHost: localhost:80\n\n"); + String response=_connector.getResponse("GET / HTTP/1.0\nHost: localhost:80\n\n"); assertThat(response,containsString("HTTP/1.1 200 OK")); assertThat(response,Matchers.not(containsString("Content-Length"))); assertThat(response,containsString("400\tThis is a big file")); @@ -296,7 +304,7 @@ public class HttpOutputTest _handler._content=BufferUtil.toBuffer(big,false); _handler._arrayBuffer=new byte[4000]; - String response=_connector.getResponses("GET / HTTP/1.0\nHost: localhost:80\n\n"); + String response=_connector.getResponse("GET / HTTP/1.0\nHost: localhost:80\n\n"); assertThat(response,containsString("HTTP/1.1 200 OK")); assertThat(response,Matchers.not(containsString("Content-Length"))); assertThat(response,containsString("400\tThis is a big file")); @@ -310,7 +318,7 @@ public class HttpOutputTest _handler._content=BufferUtil.toBuffer(big,false); _handler._arrayBuffer=new byte[8192]; - String response=_connector.getResponses("GET / HTTP/1.0\nHost: localhost:80\n\n"); + String response=_connector.getResponse("GET / HTTP/1.0\nHost: localhost:80\n\n"); assertThat(response,containsString("HTTP/1.1 200 OK")); assertThat(response,Matchers.not(containsString("Content-Length"))); assertThat(response,containsString("400\tThis is a big file")); @@ -324,7 +332,7 @@ public class HttpOutputTest _handler._content=BufferUtil.toBuffer(big,false); _handler._arrayBuffer=new byte[1]; - String response=_connector.getResponses("GET / HTTP/1.0\nHost: localhost:80\n\n"); + String response=_connector.getResponse("GET / HTTP/1.0\nHost: localhost:80\n\n"); assertThat(response,containsString("HTTP/1.1 200 OK")); assertThat(response,containsString("Content-Length")); assertThat(response,containsString("400\tThis is a big file")); @@ -338,7 +346,7 @@ public class HttpOutputTest _handler._content=BufferUtil.toBuffer(big,false); _handler._arrayBuffer=new byte[8]; - String response=_connector.getResponses("GET / HTTP/1.0\nHost: localhost:80\n\n"); + String response=_connector.getResponse("GET / HTTP/1.0\nHost: localhost:80\n\n"); assertThat(response,containsString("HTTP/1.1 200 OK")); assertThat(response,containsString("Content-Length")); assertThat(response,containsString("400\tThis is a big file")); @@ -352,7 +360,7 @@ public class HttpOutputTest _handler._content=BufferUtil.toBuffer(big,false); _handler._arrayBuffer=new byte[4000]; - String response=_connector.getResponses("GET / HTTP/1.0\nHost: localhost:80\n\n"); + String response=_connector.getResponse("GET / HTTP/1.0\nHost: localhost:80\n\n"); assertThat(response,containsString("HTTP/1.1 200 OK")); assertThat(response,containsString("Content-Length")); assertThat(response,containsString("400\tThis is a big file")); @@ -366,7 +374,7 @@ public class HttpOutputTest _handler._content=BufferUtil.toBuffer(big,false); _handler._arrayBuffer=new byte[8192]; - String response=_connector.getResponses("GET / HTTP/1.0\nHost: localhost:80\n\n"); + String response=_connector.getResponse("GET / HTTP/1.0\nHost: localhost:80\n\n"); assertThat(response,containsString("HTTP/1.1 200 OK")); assertThat(response,containsString("Content-Length")); assertThat(response,containsString("400\tThis is a big file")); @@ -383,7 +391,7 @@ public class HttpOutputTest _handler._content.put(i,(byte)'x'); _handler._arrayBuffer=new byte[8192]; - String response=_connector.getResponses("GET / HTTP/1.0\nHost: localhost:80\n\n"); + String response=_connector.getResponse("GET / HTTP/1.0\nHost: localhost:80\n\n"); assertThat(response,containsString("HTTP/1.1 200 OK")); assertThat(response,containsString("Content-Length")); } @@ -397,7 +405,7 @@ public class HttpOutputTest _handler._content=BufferUtil.toBuffer(big,false); _handler._byteBuffer=BufferUtil.allocate(8); - String response=_connector.getResponses("GET / HTTP/1.0\nHost: localhost:80\n\n"); + String response=_connector.getResponse("GET / HTTP/1.0\nHost: localhost:80\n\n"); assertThat(response,containsString("HTTP/1.1 200 OK")); assertThat(response,Matchers.not(containsString("Content-Length"))); assertThat(response,containsString("400\tThis is a big file")); @@ -411,7 +419,7 @@ public class HttpOutputTest _handler._content=BufferUtil.toBuffer(big,false); _handler._byteBuffer=BufferUtil.allocate(4000); - String response=_connector.getResponses("GET / HTTP/1.0\nHost: localhost:80\n\n"); + String response=_connector.getResponse("GET / HTTP/1.0\nHost: localhost:80\n\n"); assertThat(response,containsString("HTTP/1.1 200 OK")); assertThat(response,Matchers.not(containsString("Content-Length"))); assertThat(response,containsString("400\tThis is a big file")); @@ -425,7 +433,7 @@ public class HttpOutputTest _handler._content=BufferUtil.toBuffer(big,false); _handler._byteBuffer=BufferUtil.allocate(8192); - String response=_connector.getResponses("GET / HTTP/1.0\nHost: localhost:80\n\n"); + String response=_connector.getResponse("GET / HTTP/1.0\nHost: localhost:80\n\n"); assertThat(response,containsString("HTTP/1.1 200 OK")); assertThat(response,Matchers.not(containsString("Content-Length"))); assertThat(response,containsString("400\tThis is a big file")); @@ -441,7 +449,7 @@ public class HttpOutputTest _handler._arrayBuffer=new byte[1]; _handler._async=true; - String response=_connector.getResponses("GET / HTTP/1.0\nHost: localhost:80\n\n"); + String response=_connector.getResponse("GET / HTTP/1.0\nHost: localhost:80\n\n"); assertThat(response,containsString("HTTP/1.1 200 OK")); assertThat(response,Matchers.not(containsString("Content-Length"))); assertThat(response,containsString("400\tThis is a big file")); @@ -456,7 +464,7 @@ public class HttpOutputTest _handler._arrayBuffer=new byte[8]; _handler._async=true; - String response=_connector.getResponses("GET / HTTP/1.0\nHost: localhost:80\n\n"); + String response=_connector.getResponse("GET / HTTP/1.0\nHost: localhost:80\n\n"); assertThat(response,containsString("HTTP/1.1 200 OK")); assertThat(response,Matchers.not(containsString("Content-Length"))); assertThat(response,containsString("400\tThis is a big file")); @@ -471,7 +479,7 @@ public class HttpOutputTest _handler._arrayBuffer=new byte[4000]; _handler._async=true; - String response=_connector.getResponses("GET / HTTP/1.0\nHost: localhost:80\n\n"); + String response=_connector.getResponse("GET / HTTP/1.0\nHost: localhost:80\n\n"); assertThat(response,containsString("HTTP/1.1 200 OK")); assertThat(response,Matchers.not(containsString("Content-Length"))); assertThat(response,containsString("400\tThis is a big file")); @@ -486,7 +494,7 @@ public class HttpOutputTest _handler._arrayBuffer=new byte[8192]; _handler._async=true; - String response=_connector.getResponses("GET / HTTP/1.0\nHost: localhost:80\n\n"); + String response=_connector.getResponse("GET / HTTP/1.0\nHost: localhost:80\n\n"); assertThat(response,containsString("HTTP/1.1 200 OK")); assertThat(response,Matchers.not(containsString("Content-Length"))); assertThat(response,containsString("400\tThis is a big file")); @@ -504,7 +512,7 @@ public class HttpOutputTest _handler._arrayBuffer=new byte[8192]; _handler._async=true; - String response=_connector.getResponses("GET / HTTP/1.0\nHost: localhost:80\n\n"); + String response=_connector.getResponse("GET / HTTP/1.0\nHost: localhost:80\n\n"); assertThat(response,containsString("HTTP/1.1 200 OK")); assertThat(response,containsString("Content-Length")); } @@ -520,7 +528,7 @@ public class HttpOutputTest _handler._byteBuffer=BufferUtil.allocate(8); _handler._async=true; - String response=_connector.getResponses("GET / HTTP/1.0\nHost: localhost:80\n\n"); + String response=_connector.getResponse("GET / HTTP/1.0\nHost: localhost:80\n\n"); assertThat(response,containsString("HTTP/1.1 200 OK")); assertThat(response,Matchers.not(containsString("Content-Length"))); assertThat(response,containsString("400\tThis is a big file")); @@ -535,7 +543,7 @@ public class HttpOutputTest _handler._byteBuffer=BufferUtil.allocate(4000); _handler._async=true; - String response=_connector.getResponses("GET / HTTP/1.0\nHost: localhost:80\n\n"); + String response=_connector.getResponse("GET / HTTP/1.0\nHost: localhost:80\n\n"); assertThat(response,containsString("HTTP/1.1 200 OK")); assertThat(response,Matchers.not(containsString("Content-Length"))); assertThat(response,containsString("400\tThis is a big file")); @@ -550,7 +558,7 @@ public class HttpOutputTest _handler._byteBuffer=BufferUtil.allocate(8192); _handler._async=true; - String response=_connector.getResponses("GET / HTTP/1.0\nHost: localhost:80\n\n"); + String response=_connector.getResponse("GET / HTTP/1.0\nHost: localhost:80\n\n"); assertThat(response,containsString("HTTP/1.1 200 OK")); assertThat(response,Matchers.not(containsString("Content-Length"))); assertThat(response,containsString("400\tThis is a big file")); @@ -566,7 +574,7 @@ public class HttpOutputTest _handler._async=true; int start=_handler._owp.get(); - String response=_connector.getResponses("HEAD / HTTP/1.0\nHost: localhost:80\n\n"); + String response=_connector.getResponse("HEAD / HTTP/1.0\nHost: localhost:80\n\n"); assertThat(_handler._owp.get()-start,Matchers.greaterThan(0)); assertThat(response,containsString("HTTP/1.1 200 OK")); assertThat(response,Matchers.not(containsString("Content-Length"))); @@ -583,7 +591,7 @@ public class HttpOutputTest _handler._content=BufferUtil.toBuffer(big,false); _handler._arrayBuffer=new byte[4000]; - String response=_connector.getResponses("GET / HTTP/1.0\nHost: localhost:80\n\n"); + String response=_connector.getResponse("GET / HTTP/1.0\nHost: localhost:80\n\n"); assertThat(response,containsString("HTTP/1.1 200 OK")); assertThat(response,containsString("Content-Length: 11")); assertThat(response,containsString("simple text")); @@ -600,7 +608,7 @@ public class HttpOutputTest _handler._arrayBuffer=new byte[4000]; int start=_handler._owp.get(); - String response=_connector.getResponses("HEAD / HTTP/1.0\nHost: localhost:80\n\n"); + String response=_connector.getResponse("HEAD / HTTP/1.0\nHost: localhost:80\n\n"); assertThat(_handler._owp.get()-start,Matchers.equalTo(1)); assertThat(response,containsString("HTTP/1.1 200 OK")); assertThat(response,containsString("Content-Length: 11")); @@ -644,7 +652,7 @@ public class HttpOutputTest } }; - String response=_connector.getResponses("GET / HTTP/1.0\nHost: localhost:80\n\n"); + String response=_connector.getResponse("GET / HTTP/1.0\nHost: localhost:80\n\n"); assertThat(response,containsString("HTTP/1.1 200 OK")); assertThat(response,Matchers.not(containsString("Content-Length"))); assertThat(response,containsString("400\tTHIS IS A BIGGER FILE")); diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/PartialRFC2616Test.java b/jetty-server/src/test/java/org/eclipse/jetty/server/PartialRFC2616Test.java index 58e93e8788d..b65e6c79b1b 100644 --- a/jetty-server/src/test/java/org/eclipse/jetty/server/PartialRFC2616Test.java +++ b/jetty-server/src/test/java/org/eclipse/jetty/server/PartialRFC2616Test.java @@ -26,7 +26,9 @@ package org.eclipse.jetty.server; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.nullValue; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.util.Date; @@ -36,10 +38,12 @@ import java.util.concurrent.TimeUnit; import org.eclipse.jetty.http.HttpFields; import org.eclipse.jetty.http.HttpParser; +import org.eclipse.jetty.server.LocalConnector.LocalEndPoint; import org.eclipse.jetty.server.handler.ContextHandler; import org.eclipse.jetty.server.handler.HandlerCollection; import org.eclipse.jetty.toolchain.test.AdvancedRunner; import org.eclipse.jetty.util.log.StacklessLogging; +import org.hamcrest.Matchers; import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -121,7 +125,7 @@ public class PartialRFC2616Test { int offset=0; // Chunk last - String response = connector.getResponses( + String response = connector.getResponse( "GET /R1 HTTP/1.1\n" + "Host: localhost\n" + "Transfer-Encoding: chunked,identity\n" + @@ -136,9 +140,10 @@ public class PartialRFC2616Test @Test public void test3_6_b() throws Exception { + String response; int offset=0; // Chunked - String response = connector.getResponses( + LocalEndPoint endp=connector.executeRequest( "GET /R1 HTTP/1.1\n" + "Host: localhost\n" + "Transfer-Encoding: chunked\n" + @@ -165,18 +170,25 @@ public class PartialRFC2616Test "Host: localhost\n" + "Connection: close\n" + "\n"); + offset=0; + response = endp.getResponse(); offset=checkContains(response,offset,"HTTP/1.1 200","3.6.1 Chunking"); offset=checkContains(response,offset,"12345","3.6.1 Chunking"); + offset=0; + response = endp.getResponse(); offset=checkContains(response,offset,"HTTP/1.1 200","3.6.1 Chunking"); offset=checkContains(response,offset,"6789abcde","3.6.1 Chunking"); + offset=0; + response = endp.getResponse(); offset=checkContains(response,offset,"/R3","3.6.1 Chunking"); } @Test public void test3_6_c() throws Exception { + String response; int offset=0; - String response = connector.getResponses( + LocalEndPoint endp=connector.executeRequest( "POST /R1 HTTP/1.1\n" + "Host: localhost\n" + "Transfer-Encoding: chunked\n" + @@ -203,20 +215,29 @@ public class PartialRFC2616Test "Host: localhost\n" + "Connection: close\n" + "\n"); + offset=0; + response = endp.getResponse(); checkNotContained(response,"HTTP/1.1 100","3.6.1 Chunking"); offset=checkContains(response,offset,"HTTP/1.1 200","3.6.1 Chunking"); offset=checkContains(response,offset,"fghIjk","3.6.1 Chunking"); + offset=0; + response = endp.getResponse(); + checkNotContained(response,"HTTP/1.1 100","3.6.1 Chunking"); offset=checkContains(response,offset,"HTTP/1.1 200","3.6.1 Chunking"); offset=checkContains(response,offset,"lmnoPqrst","3.6.1 Chunking"); + offset=0; + response = endp.getResponse(); + checkNotContained(response,"HTTP/1.1 100","3.6.1 Chunking"); offset=checkContains(response,offset,"/R3","3.6.1 Chunking"); } @Test public void test3_6_d() throws Exception { + String response; int offset=0; // Chunked and keep alive - String response = connector.getResponses( + LocalEndPoint endp=connector.executeRequest( "GET /R1 HTTP/1.1\n" + "Host: localhost\n" + "Transfer-Encoding: chunked\n" + @@ -233,8 +254,12 @@ public class PartialRFC2616Test "Host: localhost\n" + "Connection: close\n" + "\n"); + offset=0; + response = endp.getResponse(); offset=checkContains(response,offset,"HTTP/1.1 200","3.6.1 Chunking")+10; offset=checkContains(response,offset,"123456","3.6.1 Chunking"); + offset=0; + response = endp.getResponse(); offset=checkContains(response,offset,"/R2","3.6.1 Chunking")+10; } @@ -257,9 +282,10 @@ public class PartialRFC2616Test @Test public void test4_4_2() throws Exception { + String response; int offset=0; // If _content length not used, second request will not be read. - String response = connector.getResponses( + LocalEndPoint endp=connector.executeRequest( "GET /R1 HTTP/1.1\n" + "Host: localhost\n" + "Transfer-Encoding: identity\n" + @@ -273,8 +299,12 @@ public class PartialRFC2616Test "Transfer-Encoding: other\n" + "Connection: close\n" + "\n"); + offset=0; + response = endp.getResponse(); offset=checkContains(response,offset,"HTTP/1.1 200 OK","2. identity")+10; offset=checkContains(response,offset,"/R1","2. identity")+3; + offset=0; + response = endp.getResponse(); offset=checkContains(response,offset,"HTTP/1.1 200 OK","2. identity")+10; offset=checkContains(response,offset,"/R2","2. identity")+3; } @@ -285,7 +315,8 @@ public class PartialRFC2616Test // _content length is ignored, as chunking is used. If it is // not ignored, the second request wont be seen. int offset=0; - String response = connector.getResponses( + String response; + LocalEndPoint endp=connector.executeRequest( "GET /R1 HTTP/1.1\n" + "Host: localhost\n" + "Transfer-Encoding: chunked\n" + @@ -306,9 +337,13 @@ public class PartialRFC2616Test "Content-Length: 6\n" + "\n" + "abcdef"); + offset=0; + response = endp.getResponse(); offset=checkContains(response,offset,"HTTP/1.1 200 OK","3. ignore c-l")+1; offset=checkContains(response,offset,"/R1","3. ignore c-l")+1; offset=checkContains(response,offset,"123456","3. ignore c-l")+1; + offset=0; + response = endp.getResponse(); offset=checkContains(response,offset,"HTTP/1.1 200 OK","3. ignore c-l")+1; offset=checkContains(response,offset,"/R2","3. _content-length")+1; offset=checkContains(response,offset,"abcdef","3. _content-length")+1; @@ -320,7 +355,7 @@ public class PartialRFC2616Test // No _content length assertTrue("Skip 411 checks as IE breaks this rule",true); // offset=0; connector.reopen(); - // response=connector.getResponses("GET /R2 HTTP/1.1\n"+ + // response=connector.getResponse("GET /R2 HTTP/1.1\n"+ // "Host: localhost\n"+ // "Content-Type: text/plain\n"+ // "Connection: close\n"+ @@ -329,7 +364,7 @@ public class PartialRFC2616Test // offset=checkContains(response,offset, // "HTTP/1.1 411 ","411 length required")+10; // offset=0; connector.reopen(); - // response=connector.getResponses("GET /R2 HTTP/1.0\n"+ + // response=connector.getResponse("GET /R2 HTTP/1.0\n"+ // "Content-Type: text/plain\n"+ // "\n"+ // "123456"); @@ -343,7 +378,7 @@ public class PartialRFC2616Test { // Default Host int offset=0; - String response = connector.getResponses("GET http://VirtualHost:8888/path/R1 HTTP/1.1\n" + "Host: wronghost\n" + "Connection: close\n" + "\n"); + String response = connector.getResponse("GET http://VirtualHost:8888/path/R1 HTTP/1.1\n" + "Host: wronghost\n" + "Connection: close\n" + "\n"); offset=checkContains(response,offset,"HTTP/1.1 200","Virtual host")+1; offset=checkContains(response,offset,"Virtual Dump","Virtual host")+1; offset=checkContains(response,offset,"pathInfo=/path/R1","Virtual host")+1; @@ -355,14 +390,14 @@ public class PartialRFC2616Test { // Default Host int offset=0; - String response = connector.getResponses("GET /path/R1 HTTP/1.1\n" + "Host: localhost\n" + "Connection: close\n" + "\n"); + String response = connector.getResponse("GET /path/R1 HTTP/1.1\n" + "Host: localhost\n" + "Connection: close\n" + "\n"); offset=checkContains(response,offset,"HTTP/1.1 200","Default host")+1; offset=checkContains(response,offset,"Dump HttpHandler","Default host")+1; offset=checkContains(response,offset,"pathInfo=/path/R1","Default host")+1; // Virtual Host offset=0; - response=connector.getResponses("GET /path/R2 HTTP/1.1\n"+"Host: VirtualHost\n"+"Connection: close\n"+"\n"); + response=connector.getResponse("GET /path/R2 HTTP/1.1\n"+"Host: VirtualHost\n"+"Connection: close\n"+"\n"); offset=checkContains(response,offset,"HTTP/1.1 200","Default host")+1; offset=checkContains(response,offset,"Virtual Dump","virtual host")+1; offset=checkContains(response,offset,"pathInfo=/path/R2","Default host")+1; @@ -373,21 +408,21 @@ public class PartialRFC2616Test { // Virtual Host int offset=0; - String response = connector.getResponses("GET /path/R1 HTTP/1.1\n" + "Host: VirtualHost\n" + "Connection: close\n" + "\n"); + String response = connector.getResponse("GET /path/R1 HTTP/1.1\n" + "Host: VirtualHost\n" + "Connection: close\n" + "\n"); offset=checkContains(response,offset,"HTTP/1.1 200","2. virtual host field")+1; offset=checkContains(response,offset,"Virtual Dump","2. virtual host field")+1; offset=checkContains(response,offset,"pathInfo=/path/R1","2. virtual host field")+1; // Virtual Host case insensitive offset=0; - response=connector.getResponses("GET /path/R1 HTTP/1.1\n"+"Host: ViRtUalhOst\n"+"Connection: close\n"+"\n"); + response=connector.getResponse("GET /path/R1 HTTP/1.1\n"+"Host: ViRtUalhOst\n"+"Connection: close\n"+"\n"); offset=checkContains(response,offset,"HTTP/1.1 200","2. virtual host field")+1; offset=checkContains(response,offset,"Virtual Dump","2. virtual host field")+1; offset=checkContains(response,offset,"pathInfo=/path/R1","2. virtual host field")+1; // Virtual Host offset=0; - response=connector.getResponses("GET /path/R1 HTTP/1.1\n"+"\n"); + response=connector.getResponse("GET /path/R1 HTTP/1.1\n"+"\n"); offset=checkContains(response,offset,"HTTP/1.1 400","3. no host")+1; } @@ -395,23 +430,28 @@ public class PartialRFC2616Test public void test8_1() throws Exception { int offset=0; - String response = connector.getResponses("GET /R1 HTTP/1.1\n" + "Host: localhost\n" + "\n", 250, TimeUnit.MILLISECONDS); + String response = connector.getResponse("GET /R1 HTTP/1.1\n" + "Host: localhost\n" + "\n", 250, TimeUnit.MILLISECONDS); offset=checkContains(response,offset,"HTTP/1.1 200 OK\015\012","8.1.2 default")+10; checkContains(response,offset,"Content-Length: ","8.1.2 default"); - offset=0; - response=connector.getResponses("GET /R1 HTTP/1.1\n"+"Host: localhost\n"+"\n"+ + LocalEndPoint endp=connector.executeRequest("GET /R1 HTTP/1.1\n"+"Host: localhost\n"+"\n"+ "GET /R2 HTTP/1.1\n"+"Host: localhost\n"+"Connection: close\n"+"\n"+ "GET /R3 HTTP/1.1\n"+"Host: localhost\n"+"Connection: close\n"+"\n"); + offset=0; + response = endp.getResponse(); offset=checkContains(response,offset,"HTTP/1.1 200 OK\015\012","8.1.2 default")+1; offset=checkContains(response,offset,"/R1","8.1.2 default")+1; + offset=0; + response = endp.getResponse(); offset=checkContains(response,offset,"HTTP/1.1 200 OK\015\012","8.1.2.2 pipeline")+11; offset=checkContains(response,offset,"Connection: close","8.1.2.2 pipeline")+1; offset=checkContains(response,offset,"/R2","8.1.2.1 close")+3; - assertEquals("8.1.2.1 close",-1,response.indexOf("/R3")); + offset=0; + response = endp.getResponse(); + assertThat(response,nullValue()); } @@ -420,7 +460,7 @@ public class PartialRFC2616Test { // Expect Failure int offset=0; - String response = connector.getResponses( + String response = connector.getResponse( "GET /R1 HTTP/1.1\n" + "Host: localhost\n" + "Expect: unknown\n" + @@ -435,7 +475,7 @@ public class PartialRFC2616Test { // Expect with body: client sends the content right away, we should not send 100-Continue int offset=0; - String response = connector.getResponses( + String response = connector.getResponse( "GET /R1 HTTP/1.1\n" + "Host: localhost\n" + "Expect: 100-continue\n" + @@ -479,7 +519,7 @@ public class PartialRFC2616Test { // Expect 100 not sent int offset=0; - String response = connector.getResponses("GET /R1?error=401 HTTP/1.1\n" + + String response = connector.getResponse("GET /R1?error=401 HTTP/1.1\n" + "Host: localhost\n" + "Expect: 100-continue\n" + "Content-Type: text/plain\n" + @@ -495,14 +535,14 @@ public class PartialRFC2616Test { int offset=0; - String response=connector.getResponses("OPTIONS * HTTP/1.1\n"+ + String response=connector.getResponse("OPTIONS * HTTP/1.1\n"+ "Connection: close\n"+ "Host: localhost\n"+ "\n"); offset=checkContains(response,offset, "HTTP/1.1 200","200")+1; offset=0; - response=connector.getResponses("GET * HTTP/1.1\n"+ + response=connector.getResponse("GET * HTTP/1.1\n"+ "Connection: close\n"+ "Host: localhost\n"+ "\n"); @@ -514,13 +554,13 @@ public class PartialRFC2616Test { try { - String get=connector.getResponses("GET /R1 HTTP/1.0\n"+"Host: localhost\n"+"\n"); + String get=connector.getResponse("GET /R1 HTTP/1.0\n"+"Host: localhost\n"+"\n"); checkContains(get,0,"HTTP/1.1 200","GET"); checkContains(get,0,"Content-Type: text/html","GET _content"); checkContains(get,0,"","GET body"); - String head=connector.getResponses("HEAD /R1 HTTP/1.0\n"+"Host: localhost\n"+"\n"); + String head=connector.getResponse("HEAD /R1 HTTP/1.0\n"+"Host: localhost\n"+"\n"); checkContains(head,0,"HTTP/1.1 200","HEAD"); checkContains(head,0,"Content-Type: text/html","HEAD _content"); assertEquals("HEAD no body",-1,head.indexOf("")); @@ -540,19 +580,19 @@ public class PartialRFC2616Test try (StacklessLogging stackless = new StacklessLogging(HttpParser.class)) { int offset=0; - String response = connector.getResponses("GET /R1 HTTP/1.0\n" + "Connection: close\n" + "\n"); + String response = connector.getResponse("GET /R1 HTTP/1.0\n" + "Connection: close\n" + "\n"); offset=checkContains(response,offset,"HTTP/1.1 200","200")+1; offset=0; - response=connector.getResponses("GET /R1 HTTP/1.1\n"+"Connection: close\n"+"\n"); + response=connector.getResponse("GET /R1 HTTP/1.1\n"+"Connection: close\n"+"\n"); offset=checkContains(response,offset,"HTTP/1.1 400","400")+1; offset=0; - response=connector.getResponses("GET /R1 HTTP/1.1\n"+"Host: localhost\n"+"Connection: close\n"+"\n"); + response=connector.getResponse("GET /R1 HTTP/1.1\n"+"Host: localhost\n"+"Connection: close\n"+"\n"); offset=checkContains(response,offset,"HTTP/1.1 200","200")+1; offset=0; - response=connector.getResponses("GET /R1 HTTP/1.1\n"+"Host:\n"+"Connection: close\n"+"\n"); + response=connector.getResponse("GET /R1 HTTP/1.1\n"+"Host:\n"+"Connection: close\n"+"\n"); offset=checkContains(response,offset,"HTTP/1.1 400","400")+1; } } @@ -563,17 +603,17 @@ public class PartialRFC2616Test try { int offset=0; - String response = connector.getResponses("GET /R1 HTTP/1.0\n" + "\n"); + String response = connector.getResponse("GET /R1 HTTP/1.0\n" + "\n"); offset=checkContains(response,offset,"HTTP/1.1 200 OK\015\012","19.6.2 default close")+10; checkNotContained(response,offset,"Connection: close","19.6.2 not assumed"); + LocalEndPoint endp=connector.executeRequest( + "GET /R1 HTTP/1.0\n"+"Host: localhost\n"+"Connection: keep-alive\n"+"\n"+ + "GET /R2 HTTP/1.0\n"+"Host: localhost\n"+"Connection: close\n"+"\n"+ + "GET /R3 HTTP/1.0\n"+"Host: localhost\n"+"Connection: close\n"+"\n"); + offset=0; - response=connector.getResponses("GET /R1 HTTP/1.0\n"+"Host: localhost\n"+"Connection: keep-alive\n"+"\n"+ - - "GET /R2 HTTP/1.0\n"+"Host: localhost\n"+"Connection: close\n"+"\n"+ - - "GET /R3 HTTP/1.0\n"+"Host: localhost\n"+"Connection: close\n"+"\n"); - + response = endp.getResponse(); offset=checkContains(response,offset,"HTTP/1.1 200 OK\015\012","19.6.2 Keep-alive 1")+1; offset=checkContains(response,offset,"Connection: keep-alive","19.6.2 Keep-alive 1")+1; @@ -581,33 +621,44 @@ public class PartialRFC2616Test offset=checkContains(response,offset,"/R1","19.6.2 Keep-alive 1")+1; + offset=0; + response = endp.getResponse(); offset=checkContains(response,offset,"HTTP/1.1 200 OK\015\012","19.6.2 Keep-alive 2")+11; offset=checkContains(response,offset,"/R2","19.6.2 Keep-alive close")+3; - assertEquals("19.6.2 closed",-1,response.indexOf("/R3")); + offset=0; + response = endp.getResponse(); + assertThat("19.6.2 closed",response,nullValue()); offset=0; - response=connector.getResponses("GET /R1 HTTP/1.0\n"+"Host: localhost\n"+"Connection: keep-alive\n"+"Content-Length: 10\n"+"\n"+"1234567890\n"+ - - "GET /RA HTTP/1.0\n"+"Host: localhost\n"+"Connection: keep-alive\n"+"Content-Length: 10\n"+"\n"+"ABCDEFGHIJ\n"+ - - "GET /R2 HTTP/1.0\n"+"Host: localhost\n"+"Connection: close\n"+"\n"+ - - "GET /R3 HTTP/1.0\n"+"Host: localhost\n"+"Connection: close\n"+"\n"); + endp=connector.executeRequest( + "GET /R1 HTTP/1.0\n"+"Host: localhost\n"+"Connection: keep-alive\n"+"Content-Length: 10\n"+"\n"+"1234567890\n"+ + "GET /RA HTTP/1.0\n"+"Host: localhost\n"+"Connection: keep-alive\n"+"Content-Length: 10\n"+"\n"+"ABCDEFGHIJ\n"+ + "GET /R2 HTTP/1.0\n"+"Host: localhost\n"+"Connection: close\n"+"\n"+ + "GET /R3 HTTP/1.0\n"+"Host: localhost\n"+"Connection: close\n"+"\n"); + + offset=0; + response = endp.getResponse(); offset=checkContains(response,offset,"HTTP/1.1 200 OK\015\012","19.6.2 Keep-alive 1")+1; offset=checkContains(response,offset,"Connection: keep-alive","19.6.2 Keep-alive 1")+1; offset=checkContains(response,offset,"","19.6.2 Keep-alive 1")+1; offset=checkContains(response,offset,"1234567890","19.6.2 Keep-alive 1")+1; + offset=0; + response = endp.getResponse(); offset=checkContains(response,offset,"HTTP/1.1 200 OK\015\012","19.6.2 Keep-alive 1")+1; offset=checkContains(response,offset,"Connection: keep-alive","19.6.2 Keep-alive 1")+1; offset=checkContains(response,offset,"","19.6.2 Keep-alive 1")+1; offset=checkContains(response,offset,"ABCDEFGHIJ","19.6.2 Keep-alive 1")+1; + offset=0; + response = endp.getResponse(); offset=checkContains(response,offset,"HTTP/1.1 200 OK\015\012","19.6.2 Keep-alive 2")+11; offset=checkContains(response,offset,"/R2","19.6.2 Keep-alive close")+3; - assertEquals("19.6.2 closed",-1,response.indexOf("/R3")); + offset=0; + response = endp.getResponse(); + assertThat("19.6.2 closed",response,nullValue()); } catch (Exception e) { diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/RequestTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/RequestTest.java index f0f911e83b8..e1124120eb9 100644 --- a/jetty-server/src/test/java/org/eclipse/jetty/server/RequestTest.java +++ b/jetty-server/src/test/java/org/eclipse/jetty/server/RequestTest.java @@ -56,6 +56,7 @@ import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Part; import org.eclipse.jetty.http.MimeTypes; +import org.eclipse.jetty.server.LocalConnector.LocalEndPoint; import org.eclipse.jetty.server.handler.AbstractHandler; import org.eclipse.jetty.server.handler.ContextHandler; import org.eclipse.jetty.server.handler.ErrorHandler; @@ -128,7 +129,7 @@ public class RequestTest "Connection: close\n"+ "\n"; - String responses=_connector.getResponses(request); + String responses=_connector.getResponse(request); assertTrue(responses.startsWith("HTTP/1.1 200")); } @@ -173,7 +174,7 @@ public class RequestTest "Name: \n"+ "\n"; - String responses=_connector.getResponses(request); + String responses=_connector.getResponse(request); assertTrue(responses.startsWith("HTTP/1.1 200")); } @@ -222,7 +223,7 @@ public class RequestTest "\r\n"+ multipart; - String responses=_connector.getResponses(request); + String responses=_connector.getResponse(request); assertTrue(responses.startsWith("HTTP/1.1 200")); } @@ -259,7 +260,7 @@ public class RequestTest "Accept-Language: da, en-gb;q=0.8, en;q=0.7\r\n"+ "Accept-Language: XX;q=0, en-au;q=0.9\r\n"+ "\r\n"; - String response = _connector.getResponses(request); + String response = _connector.getResponse(request); assertThat(response,Matchers.containsString(" 200 OK")); } @@ -320,7 +321,7 @@ public class RequestTest "\r\n"+ multipart; - String responses=_connector.getResponses(request); + String responses=_connector.getResponse(request); // System.err.println(responses); assertTrue(responses.startsWith("HTTP/1.1 200")); } @@ -382,7 +383,7 @@ public class RequestTest try(StacklessLogging stackless = new StacklessLogging(HttpChannel.class)) { - String responses=_connector.getResponses(request); + String responses=_connector.getResponse(request); //System.err.println(responses); assertTrue(responses.startsWith("HTTP/1.1 500")); } @@ -411,7 +412,7 @@ public class RequestTest "\n"; LOG.info("Expecting NotUtf8Exception in state 36..."); - String responses=_connector.getResponses(request); + String responses=_connector.getResponse(request); assertThat(responses,startsWith("HTTP/1.1 200")); } @@ -433,7 +434,7 @@ public class RequestTest "Connection: close\n"+ "\n"; - String responses=_connector.getResponses(request); + String responses=_connector.getResponse(request); assertThat(responses, Matchers.startsWith("HTTP/1.1 400")); } @@ -452,7 +453,7 @@ public class RequestTest } }; - _connector.getResponses( + LocalEndPoint endp = _connector.executeRequest( "GET / HTTP/1.1\n"+ "Host: whatever\n"+ "Content-Type: text/test\n"+ @@ -475,6 +476,11 @@ public class RequestTest "\n" ); + endp.getResponse(); + endp.getResponse(); + endp.getResponse(); + endp.getResponse(); + int i=0; assertEquals("text/test",results.get(i++)); assertEquals(null,results.get(i++)); @@ -507,7 +513,7 @@ public class RequestTest }; results.clear(); - String response=_connector.getResponses( + String response=_connector.getResponse( "GET / HTTP/1.1\n"+ "Host: myhost\n"+ "Connection: close\n"+ @@ -521,7 +527,7 @@ public class RequestTest results.clear(); - response=_connector.getResponses( + response=_connector.getResponse( "GET / HTTP/1.1\n"+ "Host: myhost:8888\n"+ "Connection: close\n"+ @@ -535,7 +541,7 @@ public class RequestTest results.clear(); - response=_connector.getResponses( + response=_connector.getResponse( "GET http://myhost:8888/ HTTP/1.0\n"+ "\n"); i=0; @@ -546,7 +552,7 @@ public class RequestTest assertEquals("8888",results.get(i++)); results.clear(); - response=_connector.getResponses( + response=_connector.getResponse( "GET http://myhost:8888/ HTTP/1.1\n"+ "Host: wrong:666\n"+ "Connection: close\n"+ @@ -560,7 +566,7 @@ public class RequestTest results.clear(); - response=_connector.getResponses( + response=_connector.getResponse( "GET / HTTP/1.1\n"+ "Host: 1.2.3.4\n"+ "Connection: close\n"+ @@ -575,7 +581,7 @@ public class RequestTest results.clear(); - response=_connector.getResponses( + response=_connector.getResponse( "GET / HTTP/1.1\n"+ "Host: 1.2.3.4:8888\n"+ "Connection: close\n"+ @@ -589,7 +595,7 @@ public class RequestTest results.clear(); - response=_connector.getResponses( + response=_connector.getResponse( "GET / HTTP/1.1\n"+ "Host: [::1]\n"+ "Connection: close\n"+ @@ -603,7 +609,7 @@ public class RequestTest results.clear(); - response=_connector.getResponses( + response=_connector.getResponse( "GET / HTTP/1.1\n"+ "Host: [::1]:8888\n"+ "Connection: close\n"+ @@ -617,7 +623,7 @@ public class RequestTest results.clear(); - response=_connector.getResponses( + response=_connector.getResponse( "GET / HTTP/1.1\n"+ "Host: [::1]\n"+ "x-forwarded-for: remote\n"+ @@ -633,7 +639,7 @@ public class RequestTest results.clear(); - response=_connector.getResponses( + response=_connector.getResponse( "GET / HTTP/1.1\n"+ "Host: [::1]:8888\n"+ "Connection: close\n"+ @@ -687,7 +693,7 @@ public class RequestTest "\r\n"+ content; Log.getRootLogger().debug("test l={}",l); - String response = _connector.getResponses(request); + String response = _connector.getResponse(request); Log.getRootLogger().debug(response); assertThat(response, Matchers.containsString(" 200 OK")); assertEquals(l,length.get()); @@ -717,7 +723,7 @@ public class RequestTest "Connection: close\r\n"+ "\r\n"+ content; - String response = _connector.getResponses(request); + String response = _connector.getResponse(request); assertThat(response,Matchers.containsString(" 200 OK")); } @@ -741,7 +747,7 @@ public class RequestTest "Connection: close\r\n"+ "\r\n"+ content; - String response = _connector.getResponses(request); + String response = _connector.getResponse(request); assertThat(response,Matchers.containsString(" 200 OK")); } @@ -767,7 +773,7 @@ public class RequestTest "Connection: close\r\n"+ "\r\n"+ content; - String response = _connector.getResponses(request); + String response = _connector.getResponse(request); assertThat(response,Matchers.containsString(" 200 OK")); } @@ -795,7 +801,7 @@ public class RequestTest "Connection: close\r\n"+ "\r\n"+ content; - String response = _connector.getResponses(request); + String response = _connector.getResponse(request); assertThat(response,Matchers.containsString(" 200 OK")); } @@ -823,7 +829,7 @@ public class RequestTest "Connection: close\r\n"+ "\r\n"+ content; - String response = _connector.getResponses(request); + String response = _connector.getResponse(request); assertThat(response,Matchers.containsString(" 200 OK")); } @@ -850,7 +856,7 @@ public class RequestTest _server.setHandler(handler); _server.start(); - String request="GET / HTTP/1.1\r\n"+ + String requests="GET / HTTP/1.1\r\n"+ "Host: whatever\r\n"+ "Content-Type: text/plane\r\n"+ "Content-Length: "+10+"\r\n"+ @@ -864,12 +870,13 @@ public class RequestTest "\r\n"+ "ABCDEFGHIJ\r\n"; - String responses = _connector.getResponses(request); + LocalEndPoint endp = _connector.executeRequest(requests); + String response = endp.getResponse()+endp.getResponse(); - int index=responses.indexOf("read="+(int)'0'); + int index=response.indexOf("read="+(int)'0'); assertTrue(index>0); - index=responses.indexOf("read="+(int)'A',index+7); + index=response.indexOf("read="+(int)'A',index+7); assertTrue(index>0); } @@ -906,7 +913,7 @@ public class RequestTest "\r\n"+ "param=wrong\r\n"; - String responses = _connector.getResponses(request); + String responses = _connector.getResponse(request); assertTrue(responses.indexOf("read='param=wrong' param=right")>0); @@ -941,7 +948,7 @@ public class RequestTest _server.stop(); _server.setHandler(handler); _server.start(); - String response=_connector.getResponses("GET / HTTP/1.1\n"+ + String response=_connector.getResponse("GET / HTTP/1.1\n"+ "Host: myhost\n"+ "Connection: close\n"+ "\n"); @@ -971,7 +978,7 @@ public class RequestTest _server.setHandler(handler); _server.start(); - String request="GET / HTTP/1.1\r\n"+ + String requests="GET / HTTP/1.1\r\n"+ "Host: whatever\r\n"+ "Content-Type: text/plane\r\n"+ "Content-Length: "+10+"\r\n"+ @@ -985,7 +992,8 @@ public class RequestTest "\r\n"+ "ABCDEFGHIJ\r\n"; - String responses = _connector.getResponses(request); + LocalEndPoint endp = _connector.executeRequest(requests); + String responses = endp.getResponse()+endp.getResponse(); int index=responses.indexOf("read="+(int)'0'); assertTrue(index>0); @@ -1009,7 +1017,7 @@ public class RequestTest } }; - response=_connector.getResponses( + response=_connector.getResponse( "GET / HTTP/1.1\n"+ "Host: whatever\n"+ "\n", @@ -1019,7 +1027,7 @@ public class RequestTest assertThat(response, Matchers.not(Matchers.containsString("Connection: close"))); assertThat(response, Matchers.containsString("Hello World")); - response=_connector.getResponses( + response=_connector.getResponse( "GET / HTTP/1.1\n"+ "Host: whatever\n"+ "Connection: close\n"+ @@ -1029,7 +1037,7 @@ public class RequestTest assertThat(response, Matchers.containsString("Connection: close")); assertThat(response, Matchers.containsString("Hello World")); - response=_connector.getResponses( + response=_connector.getResponse( "GET / HTTP/1.1\n"+ "Host: whatever\n"+ "Connection: Other, close\n"+ @@ -1040,7 +1048,7 @@ public class RequestTest assertThat(response, Matchers.containsString("Connection: close")); assertThat(response, Matchers.containsString("Hello World")); - response=_connector.getResponses( + response=_connector.getResponse( "GET / HTTP/1.0\n"+ "Host: whatever\n"+ "\n" @@ -1049,7 +1057,7 @@ public class RequestTest assertThat(response, Matchers.not(Matchers.containsString("Connection: close"))); assertThat(response, Matchers.containsString("Hello World")); - response=_connector.getResponses( + response=_connector.getResponse( "GET / HTTP/1.0\n"+ "Host: whatever\n"+ "Connection: Other, close\n"+ @@ -1058,7 +1066,7 @@ public class RequestTest assertThat(response, Matchers.containsString("200")); assertThat(response, Matchers.containsString("Hello World")); - response=_connector.getResponses( + response=_connector.getResponse( "GET / HTTP/1.0\n"+ "Host: whatever\n"+ "Connection: Other,,keep-alive\n"+ @@ -1081,7 +1089,7 @@ public class RequestTest } }; - response=_connector.getResponses( + response=_connector.getResponse( "GET / HTTP/1.1\n"+ "Host: whatever\n"+ "\n", @@ -1091,7 +1099,7 @@ public class RequestTest assertThat(response, Matchers.containsString("Connection: TE,Other")); assertThat(response, Matchers.containsString("Hello World")); - response=_connector.getResponses( + response=_connector.getResponse( "GET / HTTP/1.1\n"+ "Host: whatever\n"+ "Connection: close\n"+ @@ -1123,7 +1131,7 @@ public class RequestTest String response; cookies.clear(); - response=_connector.getResponses( + response=_connector.getResponse( "GET / HTTP/1.1\n"+ "Host: whatever\n"+ "Connection: close\n"+ @@ -1134,7 +1142,7 @@ public class RequestTest cookies.clear(); - response=_connector.getResponses( + response=_connector.getResponse( "GET / HTTP/1.1\n"+ "Host: whatever\n"+ "Cookie: name=quoted=\"\\\"value\\\"\"\n" + @@ -1147,7 +1155,7 @@ public class RequestTest assertEquals("quoted=\"value\"", cookies.get(0).getValue()); cookies.clear(); - response=_connector.getResponses( + response=_connector.getResponse( "GET / HTTP/1.1\n"+ "Host: whatever\n"+ "Cookie: name=value; other=\"quoted=;value\"\n" + @@ -1162,7 +1170,7 @@ public class RequestTest assertEquals("quoted=;value", cookies.get(1).getValue()); cookies.clear(); - response=_connector.getResponses( + LocalEndPoint endp = _connector.executeRequest( "GET /other HTTP/1.1\n"+ "Host: whatever\n"+ "Other: header\n"+ @@ -1175,8 +1183,11 @@ public class RequestTest "Connection: close\n"+ "\n" ); + response = endp.getResponse(); assertThat(response, Matchers.startsWith("HTTP/1.1 200 OK")); - assertThat(response.substring(15), Matchers.containsString("HTTP/1.1 200 OK")); + response = endp.getResponse(); + assertThat(response, Matchers.startsWith("HTTP/1.1 200 OK")); + assertEquals(4,cookies.size()); assertEquals("name", cookies.get(0).getName()); assertEquals("value", cookies.get(0).getValue()); @@ -1187,7 +1198,7 @@ public class RequestTest assertSame(cookies.get(1), cookies.get(3)); cookies.clear(); - response=_connector.getResponses( + endp = _connector.executeRequest( "GET /other HTTP/1.1\n"+ "Host: whatever\n"+ "Other: header\n"+ @@ -1200,8 +1211,10 @@ public class RequestTest "Connection: close\n"+ "\n" ); + response = endp.getResponse(); + assertThat(response, Matchers.startsWith("HTTP/1.1 200 OK")); + response = endp.getResponse(); assertThat(response, Matchers.startsWith("HTTP/1.1 200 OK")); - assertThat(response.substring(15), Matchers.containsString("HTTP/1.1 200 OK")); assertEquals(4,cookies.size()); assertEquals("name", cookies.get(0).getName()); assertEquals("value", cookies.get(0).getValue()); @@ -1212,9 +1225,9 @@ public class RequestTest assertNotSame(cookies.get(1), cookies.get(3)); cookies.clear(); -//NOTE: the javax.servlet.http.Cookie class sets the system property org.glassfish.web.rfc2109_cookie_names_enforced -//to TRUE by default, and rejects all cookie names containing punctuation.Therefore this test cannot use "name2". - response=_connector.getResponses( + //NOTE: the javax.servlet.http.Cookie class sets the system property org.glassfish.web.rfc2109_cookie_names_enforced + //to TRUE by default, and rejects all cookie names containing punctuation.Therefore this test cannot use "name2". + response=_connector.getResponse( "POST / HTTP/1.1\r\n"+ "Host: whatever\r\n"+ "Cookie: name0=value0; name1 = value1 ; \"name2\" = \"\\\"value2\\\"\" \n" + @@ -1245,7 +1258,7 @@ public class RequestTest assertEquals("value7", cookies.get(7).getValue()); cookies.clear(); - response=_connector.getResponses( + response=_connector.getResponse( "GET /other HTTP/1.1\n"+ "Host: whatever\n"+ "Other: header\n"+ @@ -1294,7 +1307,7 @@ public class RequestTest "Connection: close\r\n"+ "\r\n"; - _connector.getResponses(request); + _connector.getResponse(request); assertEquals("value",cookie[0]); assertEquals(null,cookie[1]); @@ -1310,7 +1323,7 @@ public class RequestTest "Connection: close\r\n"+ "\r\n"; - _connector.getResponses(request); + _connector.getResponse(request); assertEquals(null,cookie[0]); assertEquals(null,cookie[1]); @@ -1327,7 +1340,7 @@ public class RequestTest "Connection: close\r\n"+ "\r\n"; - _connector.getResponses(request); + _connector.getResponse(request); assertEquals("value",cookie[0]); assertEquals(null,cookie[1]); @@ -1386,7 +1399,7 @@ public class RequestTest buf; long start=System.currentTimeMillis(); - String response = _connector.getResponses(request); + String response = _connector.getResponse(request); assertThat(response,Matchers.containsString("IllegalStateException")); long now=System.currentTimeMillis(); assertTrue((now-start)<5000); @@ -1427,7 +1440,7 @@ public class RequestTest buf; long start=System.currentTimeMillis(); - String response = _connector.getResponses(request); + String response = _connector.getResponse(request); assertTrue(response.contains("IllegalStateException")); long now=System.currentTimeMillis(); assertTrue((now-start)<5000); diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/handler/ContextHandlerCollectionTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/handler/ContextHandlerCollectionTest.java index 15cb8074432..984303d4f7c 100644 --- a/jetty-server/src/test/java/org/eclipse/jetty/server/handler/ContextHandlerCollectionTest.java +++ b/jetty-server/src/test/java/org/eclipse/jetty/server/handler/ContextHandlerCollectionTest.java @@ -222,7 +222,7 @@ public class ContextHandlerCollectionTest { // System.err.printf("host=%s in %s%n",host,contextHosts==null?Collections.emptyList():Arrays.asList(contextHosts)); - String response=connector.getResponses("GET / HTTP/1.0\n" + "Host: "+host+"\nConnection:close\n\n"); + String response=connector.getResponse("GET / HTTP/1.0\n" + "Host: "+host+"\nConnection:close\n\n"); // System.err.println(response); if(succeed) assertTrue("'"+host+"' should have been handled.",handler.isHandled()); diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/handler/ContextHandlerTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/handler/ContextHandlerTest.java index 53763ab6a66..f2054c9c83e 100644 --- a/jetty-server/src/test/java/org/eclipse/jetty/server/handler/ContextHandlerTest.java +++ b/jetty-server/src/test/java/org/eclipse/jetty/server/handler/ContextHandlerTest.java @@ -497,7 +497,7 @@ public class ContextHandlerTest IsHandledHandler handler = (IsHandledHandler)context.getHandler(); for(String host : requestHosts) { - connector.getResponses("GET / HTTP/1.1\n" + "Host: "+host+"\nConnection:close\n\n"); + connector.getResponse("GET / HTTP/1.1\n" + "Host: "+host+"\nConnection:close\n\n"); if(succeed) Assert.assertTrue("'" + host + "' should have been handled.", handler.isHandled()); else diff --git a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/AsyncListenerTest.java b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/AsyncListenerTest.java index 0b1ce590c22..f50b2ef9417 100644 --- a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/AsyncListenerTest.java +++ b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/AsyncListenerTest.java @@ -69,7 +69,7 @@ public class AsyncListenerTest public void test_StartAsync_Throw_OnError_Dispatch() throws Exception { test_StartAsync_Throw_OnError(event -> event.getAsyncContext().dispatch("/dispatch")); - String httpResponse = connector.getResponses("" + + String httpResponse = connector.getResponse("" + "GET /ctx/path HTTP/1.1\r\n" + "Host: localhost\r\n" + "Connection: close\r\n" + @@ -91,7 +91,7 @@ public class AsyncListenerTest output.println("COMPLETE"); event.getAsyncContext().complete(); }); - String httpResponse = connector.getResponses("" + + String httpResponse = connector.getResponse("" + "GET /ctx/path HTTP/1.1\r\n" + "Host: localhost\r\n" + "Connection: close\r\n" + @@ -108,7 +108,7 @@ public class AsyncListenerTest { throw new IOException(); }); - String httpResponse = connector.getResponses("" + + String httpResponse = connector.getResponse("" + "GET /ctx/path HTTP/1.1\r\n" + "Host: localhost\r\n" + "Connection: close\r\n" + @@ -121,7 +121,7 @@ public class AsyncListenerTest public void test_StartAsync_Throw_OnError_Nothing() throws Exception { test_StartAsync_Throw_OnError(event -> {}); - String httpResponse = connector.getResponses("" + + String httpResponse = connector.getResponse("" + "GET /ctx/path HTTP/1.1\r\n" + "Host: localhost\r\n" + "Connection: close\r\n" + @@ -138,7 +138,7 @@ public class AsyncListenerTest HttpServletResponse response = (HttpServletResponse)event.getAsyncContext().getResponse(); response.sendError(HttpStatus.BAD_GATEWAY_502); }); - String httpResponse = connector.getResponses("" + + String httpResponse = connector.getResponse("" + "GET /ctx/path HTTP/1.1\r\n" + "Host: localhost\r\n" + "Connection: close\r\n" + @@ -169,7 +169,7 @@ public class AsyncListenerTest }; server.setErrorHandler(errorHandler); - String httpResponse = connector.getResponses("" + + String httpResponse = connector.getResponse("" + "GET /ctx/path HTTP/1.1\r\n" + "Host: localhost\r\n" + "Connection: close\r\n" + @@ -224,7 +224,7 @@ public class AsyncListenerTest public void test_StartAsync_OnTimeout_Dispatch() throws Exception { test_StartAsync_OnTimeout(500, event -> event.getAsyncContext().dispatch("/dispatch")); - String httpResponse = connector.getResponses("" + + String httpResponse = connector.getResponse("" + "GET / HTTP/1.1\r\n" + "Host: localhost\r\n" + "Connection: close\r\n" + @@ -244,7 +244,7 @@ public class AsyncListenerTest event.getAsyncContext().complete(); }); - String httpResponse = connector.getResponses("" + + String httpResponse = connector.getResponse("" + "GET / HTTP/1.1\r\n" + "Host: localhost\r\n" + "Connection: close\r\n" + @@ -260,7 +260,7 @@ public class AsyncListenerTest { throw new TestRuntimeException(); }); - String httpResponse = connector.getResponses("" + + String httpResponse = connector.getResponse("" + "GET / HTTP/1.1\r\n" + "Host: localhost\r\n" + "Connection: close\r\n" + @@ -274,7 +274,7 @@ public class AsyncListenerTest { test_StartAsync_OnTimeout(500, event -> { }); - String httpResponse = connector.getResponses("" + + String httpResponse = connector.getResponse("" + "GET / HTTP/1.1\r\n" + "Host: localhost\r\n" + "Connection: close\r\n" + @@ -290,7 +290,7 @@ public class AsyncListenerTest HttpServletResponse response = (HttpServletResponse)event.getAsyncContext().getResponse(); response.sendError(HttpStatus.BAD_GATEWAY_502); }); - String httpResponse = connector.getResponses("" + + String httpResponse = connector.getResponse("" + "GET / HTTP/1.1\r\n" + "Host: localhost\r\n" + "Connection: close\r\n" + @@ -323,7 +323,7 @@ public class AsyncListenerTest errorHandler.setServer(server); server.setErrorHandler(errorHandler); - String httpResponse = connector.getResponses("" + + String httpResponse = connector.getResponse("" + "GET / HTTP/1.1\r\n" + "Host: localhost\r\n" + "Connection: close\r\n" + @@ -398,7 +398,7 @@ public class AsyncListenerTest startServer(context); - String httpResponse = connector.getResponses("" + + String httpResponse = connector.getResponse("" + "GET / HTTP/1.1\r\n" + "Host: localhost\r\n" + "Connection: close\r\n" + diff --git a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/ServletTester.java b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/ServletTester.java index 6b9d1b4873f..0a7c28c38c6 100644 --- a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/ServletTester.java +++ b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/ServletTester.java @@ -196,7 +196,7 @@ public class ServletTester extends ContainerLifeCycle { LOG.debug("Request: {}",request); } - return _connector.getResponses(request); + return _connector.getResponse(request); } public String getResponses(String request, long idleFor,TimeUnit units) throws Exception @@ -205,7 +205,7 @@ public class ServletTester extends ContainerLifeCycle { LOG.debug("Request: {}",request); } - return _connector.getResponses(request, idleFor, units); + return _connector.getResponse(request, idleFor, units); } public ByteBuffer getResponses(ByteBuffer request) throws Exception @@ -214,7 +214,7 @@ public class ServletTester extends ContainerLifeCycle { LOG.debug("Request (Buffer): {}",BufferUtil.toUTF8String(request)); } - return _connector.getResponses(request); + return _connector.getResponse(request); } public ByteBuffer getResponses(ByteBuffer requestsBuffer,long idleFor,TimeUnit units) throws Exception @@ -223,7 +223,7 @@ public class ServletTester extends ContainerLifeCycle { LOG.debug("Requests (Buffer): {}",BufferUtil.toUTF8String(requestsBuffer)); } - return _connector.getResponses(requestsBuffer, idleFor, units); + return _connector.getResponse(requestsBuffer, idleFor, units); } /** Create a port based connector. diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/ThreadStarvationTest.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/ThreadStarvationTest.java index 620dc7350d9..3e24f0a646b 100644 --- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/ThreadStarvationTest.java +++ b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/ThreadStarvationTest.java @@ -48,7 +48,7 @@ import javax.servlet.http.HttpServletResponse; import org.eclipse.jetty.io.ChannelEndPoint; import org.eclipse.jetty.io.ManagedSelector; -import org.eclipse.jetty.io.SelectChannelEndPoint; +import org.eclipse.jetty.io.SocketChannelEndPoint; import org.eclipse.jetty.server.HttpChannel; import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.Server; @@ -109,7 +109,7 @@ public class ThreadStarvationTest @Override protected ChannelEndPoint newEndPoint(SocketChannel channel, ManagedSelector selectSet, SelectionKey key) throws IOException { - return new SelectChannelEndPoint(channel, selectSet, key, getScheduler(), getIdleTimeout()) + return new SocketChannelEndPoint(channel, selectSet, key, getScheduler()) { @Override protected void onIncompleteFlush() @@ -261,16 +261,14 @@ public class ThreadStarvationTest @Override protected ChannelEndPoint newEndPoint(SocketChannel channel, ManagedSelector selectSet, SelectionKey key) throws IOException { - return new SelectChannelEndPoint(channel, selectSet, key, getScheduler(), getIdleTimeout()) + return new SocketChannelEndPoint(channel, selectSet, key, getScheduler()) { - @Override public boolean flush(ByteBuffer... buffers) throws IOException { super.flush(buffers[0]); throw new IOException("TEST FAILURE"); } - }; } }; From 4ca62d8995879f3d0772a141b76493d1ae00032d Mon Sep 17 00:00:00 2001 From: Greg Wilkins Date: Fri, 8 Jul 2016 00:12:04 +1000 Subject: [PATCH 3/5] updated starvation test for extra low resources thread --- .../java/org/eclipse/jetty/servlets/ThreadStarvationTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/ThreadStarvationTest.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/ThreadStarvationTest.java index 3e24f0a646b..7445af2915e 100644 --- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/ThreadStarvationTest.java +++ b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/ThreadStarvationTest.java @@ -247,7 +247,7 @@ public class ThreadStarvationTest int acceptors = 0; int selectors = 1; int maxThreads = 10; - final int barried=maxThreads-acceptors-selectors; + final int barried=maxThreads-acceptors-selectors*2; final CyclicBarrier barrier = new CyclicBarrier(barried); @@ -318,7 +318,6 @@ public class ThreadStarvationTest output.flush(); } - byte[] buffer = new byte[48 * 1024]; List> totals = new ArrayList<>(); for (Socket socket : sockets) From 5d77bb4d8fc587eaf3a6bde9d16adb5f9ca9c450 Mon Sep 17 00:00:00 2001 From: Greg Wilkins Date: Fri, 8 Jul 2016 00:30:53 +1000 Subject: [PATCH 4/5] fixed bad unit test --- .../java/org/eclipse/jetty/server/PartialRFC2616Test.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/PartialRFC2616Test.java b/jetty-server/src/test/java/org/eclipse/jetty/server/PartialRFC2616Test.java index b65e6c79b1b..e74ce4bafa3 100644 --- a/jetty-server/src/test/java/org/eclipse/jetty/server/PartialRFC2616Test.java +++ b/jetty-server/src/test/java/org/eclipse/jetty/server/PartialRFC2616Test.java @@ -500,15 +500,13 @@ public class PartialRFC2616Test "Content-Type: text/plain\n"+ "Content-Length: 8\n"+ "\n"); - Thread.sleep(200); - String infomational= endp.takeOutputString(); + String infomational= endp.getResponse(); offset=checkContains(infomational,offset,"HTTP/1.1 100 ","8.2.3 expect 100")+1; checkNotContained(infomational,offset,"HTTP/1.1 200","8.2.3 expect 100"); endp.addInput("654321\015\012"); - Thread.sleep(200); - String response= endp.takeOutputString(); + String response= endp.getResponse(); offset=0; offset=checkContains(response,offset,"HTTP/1.1 200","8.2.3 expect 100")+1; offset=checkContains(response,offset,"654321","8.2.3 expect 100")+1; From a6276c30177c61965a4bcf6daa86e0e3cbbef9f1 Mon Sep 17 00:00:00 2001 From: Joakim Erdfelt Date: Thu, 7 Jul 2016 09:11:19 -0700 Subject: [PATCH 5/5] Issue #687 - Adding AllowSymLinkAliasCheckerTest + Replicated, in test case form, the example present in the filed issue. All tests pass. --- jetty-server/pom.xml | 17 +- .../handler/AllowSymLinkAliasCheckerTest.java | 182 ++++++++++++++++++ 2 files changed, 194 insertions(+), 5 deletions(-) create mode 100644 jetty-server/src/test/java/org/eclipse/jetty/server/handler/AllowSymLinkAliasCheckerTest.java diff --git a/jetty-server/pom.xml b/jetty-server/pom.xml index 30ce675ce27..5e23b2dbbce 100644 --- a/jetty-server/pom.xml +++ b/jetty-server/pom.xml @@ -36,11 +36,6 @@ - - org.eclipse.jetty.toolchain - jetty-test-helper - test - javax.servlet javax.servlet-api @@ -71,6 +66,18 @@ ${project.version} true + + org.eclipse.jetty.toolchain + jetty-test-helper + test + + + org.eclipse.jetty + jetty-http + ${project.version} + tests + test + org.mockito mockito-core diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/handler/AllowSymLinkAliasCheckerTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/handler/AllowSymLinkAliasCheckerTest.java new file mode 100644 index 00000000000..9655a44d829 --- /dev/null +++ b/jetty-server/src/test/java/org/eclipse/jetty/server/handler/AllowSymLinkAliasCheckerTest.java @@ -0,0 +1,182 @@ +// +// ======================================================================== +// Copyright (c) 1995-2016 Mort Bay Consulting Pty. Ltd. +// ------------------------------------------------------------------------ +// All rights reserved. This program and the accompanying materials +// are made available under the terms of the Eclipse Public License v1.0 +// and Apache License v2.0 which accompanies this distribution. +// +// The Eclipse Public License is available at +// http://www.eclipse.org/legal/epl-v10.html +// +// The Apache License v2.0 is available at +// http://www.opensource.org/licenses/apache2.0.php +// +// You may elect to redistribute this code under either of these licenses. +// ======================================================================== +// + +package org.eclipse.jetty.server.handler; + +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.startsWith; +import static org.junit.Assert.assertThat; +import static org.junit.Assume.assumeNoException; + +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; +import java.nio.file.FileSystemException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.jetty.http.HttpTester; +import org.eclipse.jetty.server.LocalConnector; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.toolchain.test.FS; +import org.eclipse.jetty.toolchain.test.MavenTestingUtils; +import org.eclipse.jetty.util.BufferUtil; +import org.eclipse.jetty.util.resource.PathResource; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +@RunWith(Parameterized.class) +public class AllowSymLinkAliasCheckerTest +{ + @Parameterized.Parameters(name = "{0}") + public static List params() + { + List data = new ArrayList<>(); + + data.add(new Object[]{"/testdir/", 200, "text/html", "Directory: /testdir/"}); + data.add(new Object[]{"/testdirlnk/", 200, "text/html", "Directory: /testdirlnk/"}); + data.add(new Object[]{"/testdir/testfile.txt", 200, "text/plain", "Hello TestFile"}); + data.add(new Object[]{"/testdir/testfilelnk.txt", 200, "text/plain", "Hello TestFile"}); + data.add(new Object[]{"/testdirlnk/testfile.txt", 200, "text/plain", "Hello TestFile"}); + data.add(new Object[]{"/testdirlnk/testfilelnk.txt", 200, "text/plain", "Hello TestFile"}); + + return data; + } + + private Server server; + private LocalConnector localConnector; + private Path rootPath; + + @Before + public void setup() throws Exception + { + setupRoot(); + setupServer(); + } + + @After + public void teardown() throws Exception + { + server.stop(); + } + + private void setupRoot() throws IOException + { + rootPath = MavenTestingUtils.getTargetTestingPath(AllowSymLinkAliasCheckerTest.class.getSimpleName()); + FS.ensureEmpty(rootPath); + + Path testdir = rootPath.resolve("testdir"); + FS.ensureDirExists(testdir); + + try + { + Path testdirlnk = rootPath.resolve("testdirlnk"); + // Create a relative symlink testdirlnk -> testdir. + // If we used testdir (Path) from above, this symlink + // would point to an absolute path. + Files.createSymbolicLink(testdirlnk, new File("testdir").toPath()); + } + catch (UnsupportedOperationException | FileSystemException e) + { + // If unable to create symlink, no point testing the rest. + // This is the path that Microsoft Windows takes. + assumeNoException(e); + } + + Path testfileTxt = testdir.resolve("testfile.txt"); + Files.createFile(testfileTxt); + try (OutputStream out = Files.newOutputStream(testfileTxt)) + { + out.write("Hello TestFile".getBytes(StandardCharsets.UTF_8)); + } + + try + { + Path testfileTxtLnk = testdir.resolve("testfilelnk.txt"); + // Create a relative symlink testfilelnk.txt -> testfile.txt. + // If we used testfileTxt (Path) from above, this symlink + // would point to an absolute path. + Files.createSymbolicLink(testfileTxtLnk, new File("testfile.txt").toPath()); + } + catch (UnsupportedOperationException | FileSystemException e) + { + // If unable to create symlink, no point testing the rest. + // This is the path that Microsoft Windows takes. + assumeNoException(e); + } + } + + private void setupServer() throws Exception + { + // Setup server + server = new Server(); + localConnector = new LocalConnector(server); + server.addConnector(localConnector); + + ResourceHandler fileResourceHandler = new ResourceHandler(); + fileResourceHandler.setDirectoriesListed(true); + fileResourceHandler.setWelcomeFiles(new String[]{"index.html"}); + fileResourceHandler.setEtags(true); + + ContextHandler fileResourceContext = new ContextHandler(); + fileResourceContext.setContextPath("/"); + fileResourceContext.setAllowNullPathInfo(true); + fileResourceContext.setHandler(fileResourceHandler); + fileResourceContext.setBaseResource(new PathResource(rootPath)); + + fileResourceContext.clearAliasChecks(); + fileResourceContext.addAliasCheck(new AllowSymLinkAliasChecker()); + + server.setHandler(fileResourceContext); + server.start(); + } + + @Parameterized.Parameter(0) + public String requestURI; + @Parameterized.Parameter(1) + public int expectedResponseStatus; + @Parameterized.Parameter(2) + public String expectedResponseContentType; + @Parameterized.Parameter(3) + public String expectedResponseContentContains; + + public AllowSymLinkAliasCheckerTest() + { + } + + @Test(timeout = 5000) + public void testAccess() throws Exception + { + HttpTester.Request request = HttpTester.newRequest(); + + request.setMethod("GET"); + request.setHeader("Host", "tester"); + request.setURI(requestURI); + + String responseString = localConnector.getResponse(BufferUtil.toString(request.generate())); + assertThat("Response status code", responseString, startsWith("HTTP/1.1 " + expectedResponseStatus + " ")); + assertThat("Response Content-Type", responseString, containsString("\nContent-Type: " + expectedResponseContentType)); + assertThat("Response", responseString, containsString(expectedResponseContentContains)); + } +}