Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Wilkins2013-11-01 02:37:44 +0000
committerGreg Wilkins2013-11-01 02:37:44 +0000
commit56fcfa45fb642825db38b8197467a63ee2aeffd6 (patch)
treebf1c9903737d7f58c8541a72099f9b8805f333f1
parenta76ddc1c6a11ebc63c3ab8beccecd92d23b6604e (diff)
downloadorg.eclipse.jetty.project-56fcfa45fb642825db38b8197467a63ee2aeffd6.tar.gz
org.eclipse.jetty.project-56fcfa45fb642825db38b8197467a63ee2aeffd6.tar.xz
org.eclipse.jetty.project-56fcfa45fb642825db38b8197467a63ee2aeffd6.zip
420844 Connection:close on exceptional errors
-rw-r--r--jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannel.java6
-rw-r--r--jetty-server/src/test/java/org/eclipse/jetty/server/HttpConnectionTest.java4
-rw-r--r--jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHandler.java26
-rw-r--r--tests/test-continuation/src/test/java/org/eclipse/jetty/continuation/ContinuationBase.java16
-rw-r--r--tests/test-continuation/src/test/java/org/eclipse/jetty/continuation/ContinuationTest.java3
5 files changed, 31 insertions, 24 deletions
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannel.java b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannel.java
index 9c94256400..47ab43395a 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannel.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannel.java
@@ -373,9 +373,12 @@ public class HttpChannel<T> implements HttpParser.RequestHandler<T>, Runnable
{
try
{
+ _request.setAttribute(RequestDispatcher.ERROR_EXCEPTION,x);
+ _request.setAttribute(RequestDispatcher.ERROR_EXCEPTION_TYPE,x.getClass());
if (_state.isSuspended())
{
HttpFields fields = new HttpFields();
+ fields.add(HttpHeader.CONNECTION,HttpHeaderValue.CLOSE);
ResponseInfo info = new ResponseInfo(_request.getHttpVersion(), fields, 0, HttpStatus.INTERNAL_SERVER_ERROR_500, null, _request.isHead());
boolean committed = sendResponse(info, null, true);
if (!committed)
@@ -389,8 +392,7 @@ public class HttpChannel<T> implements HttpParser.RequestHandler<T>, Runnable
}
else
{
- _request.setAttribute(RequestDispatcher.ERROR_EXCEPTION,x);
- _request.setAttribute(RequestDispatcher.ERROR_EXCEPTION_TYPE,x.getClass());
+ _response.setHeader(HttpHeader.CONNECTION.asString(),HttpHeaderValue.CLOSE.asString());
_response.sendError(500, x.getMessage());
}
}
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 b2b56bd14d..1adaf4a399 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
@@ -448,7 +448,7 @@ public class HttpConnectionTest
offset=0;
requests=
- "GET /R1?read=1&error=500 HTTP/1.1\n"+
+ "GET /R1?read=1&error=499 HTTP/1.1\n"+
"Host: localhost\n"+
"Transfer-Encoding: chunked\n"+
"Content-Type: text/plain; charset=utf-8\n"+
@@ -468,7 +468,7 @@ public class HttpConnectionTest
response=connector.getResponses(requests);
- offset = checkContains(response,offset,"HTTP/1.1 500");
+ offset = checkContains(response,offset,"HTTP/1.1 499");
offset = checkContains(response,offset,"HTTP/1.1 200");
offset = checkContains(response,offset,"/R2");
offset = checkContains(response,offset,"encoding=UTF-8");
diff --git a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHandler.java b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHandler.java
index c9ccb06944..4d210c2470 100644
--- a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHandler.java
+++ b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHandler.java
@@ -49,6 +49,8 @@ import javax.servlet.UnavailableException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.eclipse.jetty.http.HttpHeader;
+import org.eclipse.jetty.http.HttpHeaderValue;
import org.eclipse.jetty.http.PathMap;
import org.eclipse.jetty.io.EofException;
import org.eclipse.jetty.io.RuntimeIOException;
@@ -492,7 +494,7 @@ public class ServletHandler extends ScopedHandler
}
LOG.debug("chain={}",chain);
-
+ Throwable th=null;
try
{
if (servlet_holder==null)
@@ -540,7 +542,7 @@ public class ServletHandler extends ScopedHandler
}
// unwrap cause
- Throwable th=e;
+ th=e;
if (th instanceof ServletException)
{
if (th instanceof QuietServletException)
@@ -573,6 +575,7 @@ public class ServletHandler extends ScopedHandler
request.setAttribute(RequestDispatcher.ERROR_EXCEPTION,th);
if (!response.isCommitted())
{
+ baseRequest.getResponse().getHttpFields().put(HttpHeader.CONNECTION,HttpHeaderValue.CLOSE);
if (th instanceof UnavailableException)
{
UnavailableException ue = (UnavailableException)th;
@@ -586,33 +589,34 @@ public class ServletHandler extends ScopedHandler
}
else
LOG.debug("Response already committed for handling "+th);
-
- // Complete async requests
- if (request.isAsyncStarted())
- request.getAsyncContext().complete();
}
catch(Error e)
{
if ("ContinuationThrowable".equals(e.getClass().getSimpleName()))
throw e;
+ th=e;
if (!(DispatcherType.REQUEST.equals(type) || DispatcherType.ASYNC.equals(type)))
throw e;
LOG.warn("Error for "+request.getRequestURI(),e);
- if(LOG.isDebugEnabled())LOG.debug(request.toString());
+ if(LOG.isDebugEnabled())
+ LOG.debug(request.toString());
request.setAttribute(RequestDispatcher.ERROR_EXCEPTION_TYPE,e.getClass());
request.setAttribute(RequestDispatcher.ERROR_EXCEPTION,e);
if (!response.isCommitted())
+ {
+ baseRequest.getResponse().getHttpFields().put(HttpHeader.CONNECTION,HttpHeaderValue.CLOSE);
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ }
else
LOG.debug("Response already committed for handling ",e);
-
- // Complete async requests
- if (request.isAsyncStarted())
- request.getAsyncContext().complete();
}
finally
{
+ // Complete async errored requests
+ if (th!=null && request.isAsyncStarted())
+ request.getAsyncContext().complete();
+
if (servlet_holder!=null)
baseRequest.setHandled(true);
}
diff --git a/tests/test-continuation/src/test/java/org/eclipse/jetty/continuation/ContinuationBase.java b/tests/test-continuation/src/test/java/org/eclipse/jetty/continuation/ContinuationBase.java
index e93f0baf29..5369abe2d3 100644
--- a/tests/test-continuation/src/test/java/org/eclipse/jetty/continuation/ContinuationBase.java
+++ b/tests/test-continuation/src/test/java/org/eclipse/jetty/continuation/ContinuationBase.java
@@ -239,9 +239,8 @@ public abstract class ContinuationBase
int port=_port;
String response=null;
- try
+ try (Socket socket = new Socket("localhost",port);)
{
- Socket socket = new Socket("localhost",port);
socket.setSoTimeout(10000);
socket.getOutputStream().write(request.getBytes("UTF-8"));
socket.getOutputStream().flush();
@@ -269,6 +268,7 @@ public abstract class ContinuationBase
{}
/* ------------------------------------------------------------ */
+ @Override
protected void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException
{
final Continuation continuation = ContinuationSupport.getContinuation(request);
@@ -306,7 +306,7 @@ public abstract class ContinuationBase
if (continuation.isInitial())
{
- ((HttpServletResponse)response).addHeader("history","initial");
+ response.addHeader("history","initial");
if (read_before>0)
{
byte[] buf=new byte[read_before];
@@ -325,7 +325,7 @@ public abstract class ContinuationBase
if (suspend_for>0)
continuation.setTimeout(suspend_for);
continuation.addContinuationListener(__listener);
- ((HttpServletResponse)response).addHeader("history","suspend");
+ response.addHeader("history","suspend");
continuation.suspend(response);
if (complete_after>0)
@@ -404,7 +404,7 @@ public abstract class ContinuationBase
}
else
{
- ((HttpServletResponse)response).addHeader("history","!initial");
+ response.addHeader("history","!initial");
if (suspend2_for>=0 && request.getAttribute("2nd")==null)
{
request.setAttribute("2nd","cycle");
@@ -412,7 +412,7 @@ public abstract class ContinuationBase
if (suspend2_for>0)
continuation.setTimeout(suspend2_for);
// continuation.addContinuationListener(__listener);
- ((HttpServletResponse)response).addHeader("history","suspend");
+ response.addHeader("history","suspend");
continuation.suspend(response);
if (complete2_after>0)
@@ -452,7 +452,7 @@ public abstract class ContinuationBase
@Override
public void run()
{
- ((HttpServletResponse)response).addHeader("history","resume");
+ response.addHeader("history","resume");
continuation.resume();
}
};
@@ -463,7 +463,7 @@ public abstract class ContinuationBase
}
else if (resume2_after==0)
{
- ((HttpServletResponse)response).addHeader("history","resume");
+ response.addHeader("history","resume");
continuation.resume();
}
if (undispatch)
diff --git a/tests/test-continuation/src/test/java/org/eclipse/jetty/continuation/ContinuationTest.java b/tests/test-continuation/src/test/java/org/eclipse/jetty/continuation/ContinuationTest.java
index 2ca10a0a94..8b1b3f57f0 100644
--- a/tests/test-continuation/src/test/java/org/eclipse/jetty/continuation/ContinuationTest.java
+++ b/tests/test-continuation/src/test/java/org/eclipse/jetty/continuation/ContinuationTest.java
@@ -23,7 +23,7 @@ import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
-import junit.framework.Assert;
+import org.junit.Assert;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.Request;
@@ -194,6 +194,7 @@ public class ContinuationTest extends ContinuationBase
class Log extends AbstractLifeCycle implements RequestLog
{
+ @Override
public void log(Request request, Response response)
{
_log.add(response.getStatus()+" "+response.getContentCount()+" "+request.getRequestURI());

Back to the top