Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Wilkins2013-09-05 02:09:22 +0000
committerGreg Wilkins2013-09-05 02:09:22 +0000
commitce098c67deb25b2bf19a81413405f22ed12722d6 (patch)
tree6a2f3a642c3632dacf1dc84424b0c47fd8f0b2b0
parent9b9c7ba8d11a120a92f679a1648f925441a18bba (diff)
downloadorg.eclipse.jetty.project-ce098c67deb25b2bf19a81413405f22ed12722d6.tar.gz
org.eclipse.jetty.project-ce098c67deb25b2bf19a81413405f22ed12722d6.tar.xz
org.eclipse.jetty.project-ce098c67deb25b2bf19a81413405f22ed12722d6.zip
416477 Improved consumeAll error handling
-rw-r--r--jetty-server/src/main/java/org/eclipse/jetty/server/HttpInput.java5
-rw-r--r--jetty-server/src/test/java/org/eclipse/jetty/server/DumpHandler.java30
-rw-r--r--jetty-server/src/test/java/org/eclipse/jetty/server/HttpConnectionTest.java68
3 files changed, 91 insertions, 12 deletions
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpInput.java b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpInput.java
index 7b3808d451..bbed8bd2fa 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpInput.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpInput.java
@@ -265,7 +265,7 @@ public abstract class HttpInput<T> extends ServletInputStream
synchronized (lock())
{
T item = _inputQ.peekUnsafe();
- while (!isShutdown() && !isEarlyEOF())
+ loop: while (!isShutdown() && !isEarlyEOF())
{
while (item != null)
{
@@ -286,7 +286,8 @@ public abstract class HttpInput<T> extends ServletInputStream
}
catch (IOException e)
{
- throw new RuntimeIOException(e);
+ LOG.warn(e);
+ break loop;
}
}
}
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/DumpHandler.java b/jetty-server/src/test/java/org/eclipse/jetty/server/DumpHandler.java
index 4e590fb720..27440fa815 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/DumpHandler.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/DumpHandler.java
@@ -71,11 +71,14 @@ public class DumpHandler extends AbstractHandler
if (!isStarted())
return;
+ StringBuilder read = null;
if (request.getParameter("read")!=null)
{
+ read=new StringBuilder();
+ int len=Integer.parseInt(request.getParameter("read"));
Reader in = request.getReader();
- for (int i=Integer.parseInt(request.getParameter("read"));i-->0;)
- in.read();
+ for (int i=len;i-->0;)
+ read.append((char)in.read());
}
if (request.getParameter("ISE")!=null)
@@ -190,16 +193,23 @@ public class DumpHandler extends AbstractHandler
writer.write("</pre>\n<h3>Content:</h3>\n<pre>");
- char[] content= new char[4096];
- int len;
- try{
- Reader in=request.getReader();
- while((len=in.read(content))>=0)
- writer.write(new String(content,0,len));
+ if (read!=null)
+ {
+ writer.write(read.toString());
}
- catch(IOException e)
+ else
{
- writer.write(e.toString());
+ char[] content= new char[4096];
+ int len;
+ try{
+ Reader in=request.getReader();
+ while((len=in.read(content))>=0)
+ writer.write(new String(content,0,len));
+ }
+ catch(IOException e)
+ {
+ writer.write(e.toString());
+ }
}
writer.write("</pre>\n");
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 6e7a6d5e33..b2b56bd14d 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
@@ -68,6 +68,7 @@ public class HttpConnectionTest
http.getHttpConfiguration().setResponseHeaderSize(1024);
connector = new LocalConnector(server,http,null);
+ connector.setIdleTimeout(500);
server.addConnector(connector);
server.setHandler(new DumpHandler());
server.start();
@@ -372,6 +373,73 @@ public class HttpConnectionTest
}
@Test
+ public void testUnconsumed() throws Exception
+ {
+ String response=null;
+ String requests=null;
+ int offset=0;
+
+ offset=0;
+ requests=
+ "GET /R1?read=4 HTTP/1.1\n"+
+ "Host: localhost\n"+
+ "Transfer-Encoding: chunked\n"+
+ "Content-Type: text/plain; charset=utf-8\n"+
+ "\015\012"+
+ "5;\015\012"+
+ "12345\015\012"+
+ "5;\015\012"+
+ "67890\015\012"+
+ "0;\015\012\015\012"+
+ "GET /R2 HTTP/1.1\n"+
+ "Host: localhost\n"+
+ "Content-Type: text/plain; charset=utf-8\n"+
+ "Content-Length: 10\n"+
+ "Connection: close\n"+
+ "\n"+
+ "abcdefghij\n";
+
+ response=connector.getResponses(requests);
+
+ offset = checkContains(response,offset,"HTTP/1.1 200");
+ offset = checkContains(response,offset,"pathInfo=/R1");
+ offset = checkContains(response,offset,"1234");
+ checkNotContained(response,offset,"56789");
+ offset = checkContains(response,offset,"HTTP/1.1 200");
+ offset = checkContains(response,offset,"pathInfo=/R2");
+ offset = checkContains(response,offset,"encoding=UTF-8");
+ offset = checkContains(response,offset,"abcdefghij");
+ }
+
+ @Test
+ public void testUnconsumedTimeout() throws Exception
+ {
+ String response=null;
+ String requests=null;
+ int offset=0;
+
+ offset=0;
+ requests=
+ "GET /R1?read=4 HTTP/1.1\n"+
+ "Host: localhost\n"+
+ "Transfer-Encoding: chunked\n"+
+ "Content-Type: text/plain; charset=utf-8\n"+
+ "\015\012"+
+ "5;\015\012"+
+ "12345\015\012";
+
+ long start=System.currentTimeMillis();
+ response=connector.getResponses(requests,2000,TimeUnit.MILLISECONDS);
+ if ((System.currentTimeMillis()-start)>=2000)
+ Assert.fail();
+
+ offset = checkContains(response,offset,"HTTP/1.1 200");
+ offset = checkContains(response,offset,"pathInfo=/R1");
+ offset = checkContains(response,offset,"1234");
+ checkNotContained(response,offset,"56789");
+ }
+
+ @Test
public void testUnconsumedError() throws Exception
{
String response=null;

Back to the top