From ce098c67deb25b2bf19a81413405f22ed12722d6 Mon Sep 17 00:00:00 2001 From: Greg Wilkins Date: Thu, 5 Sep 2013 12:09:22 +1000 Subject: [PATCH] 416477 Improved consumeAll error handling --- .../org/eclipse/jetty/server/HttpInput.java | 5 +- .../org/eclipse/jetty/server/DumpHandler.java | 32 ++++++--- .../jetty/server/HttpConnectionTest.java | 68 +++++++++++++++++++ 3 files changed, 92 insertions(+), 13 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 7b3808d451e..bbed8bd2fac 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 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 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 4e590fb720c..27440fa815b 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("\n

Content:

\n
");
 
-        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)
+        if (read!=null)
         {
-            writer.write(e.toString());
+            writer.write(read.toString());
+        }
+        else
+        {
+            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("
\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 6e7a6d5e338..b2b56bd14dc 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(); @@ -371,6 +372,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 {