Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Wilkins2014-07-23 06:31:19 +0000
committerGreg Wilkins2014-07-23 06:31:19 +0000
commite199b671bb486432498a55b83e5ede89f75d212c (patch)
tree56bc38cc7b3d3d734549c49d553d379b3ad59d9d
parent564ffca5dceb9bd54388770533a0f6065a5583ca (diff)
downloadorg.eclipse.jetty.project-e199b671bb486432498a55b83e5ede89f75d212c.tar.gz
org.eclipse.jetty.project-e199b671bb486432498a55b83e5ede89f75d212c.tar.xz
org.eclipse.jetty.project-e199b671bb486432498a55b83e5ede89f75d212c.zip
440020 Abort bad proxy responses with sendError(-1)
-rw-r--r--jetty-proxy/src/main/java/org/eclipse/jetty/proxy/ProxyServlet.java12
-rw-r--r--jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannel.java22
-rw-r--r--jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnection.java4
-rw-r--r--jetty-server/src/main/java/org/eclipse/jetty/server/HttpOutput.java4
-rw-r--r--jetty-server/src/main/java/org/eclipse/jetty/server/Response.java16
5 files changed, 32 insertions, 26 deletions
diff --git a/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/ProxyServlet.java b/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/ProxyServlet.java
index 115b5544d8..367badf876 100644
--- a/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/ProxyServlet.java
+++ b/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/ProxyServlet.java
@@ -32,6 +32,7 @@ import java.util.Set;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
+
import javax.servlet.AsyncContext;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
@@ -51,6 +52,7 @@ import org.eclipse.jetty.http.HttpField;
import org.eclipse.jetty.http.HttpHeader;
import org.eclipse.jetty.http.HttpHeaderValue;
import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.server.HttpConnection;
import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.HttpCookieStore;
import org.eclipse.jetty.util.log.Log;
@@ -558,7 +560,15 @@ public class ProxyServlet extends HttpServlet
_log.debug(getRequestId(request) + " proxying failed", failure);
if (response.isCommitted())
{
- request.setAttribute("org.eclipse.jetty.server.Response.failure", failure);
+ // Use Jetty specific behavior to close connection
+ try
+ {
+ response.sendError(-1);
+ }
+ catch (IOException e)
+ {
+ getServletContext().log("close failed", e);
+ }
AsyncContext asyncContext = request.getAsyncContext();
asyncContext.complete();
}
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 e6abb98311..9248d9f874 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
@@ -402,21 +402,8 @@ public class HttpChannel<T> implements HttpParser.RequestHandler<T>, Runnable, H
}
else
{
- // There is no way in the Servlet API to directly close a connection,
- // so we rely on applications to pass this attribute to signal they
- // want to hard close the connection, without even closing the output.
- Object failure = _request.getAttribute("org.eclipse.jetty.server.Response.failure");
- if (failure != null)
- {
- if (LOG.isDebugEnabled())
- LOG.debug("Explicit response failure", failure);
- failed();
- }
- else
- {
- // Complete generating the response
- _response.closeOutput();
- }
+ // Complete generating the response
+ _response.closeOutput();
}
}
catch(EofException|ClosedChannelException e)
@@ -812,10 +799,11 @@ public class HttpChannel<T> implements HttpParser.RequestHandler<T>, Runnable, H
/**
* If a write or similar to this channel fails this method should be called. The standard implementation
- * of {@link #failed()} is a noop. But the different implementations of HttpChannel might want to take actions.
+ * is to call {@link HttpTransport#abort()}
*/
- public void failed()
+ public void abort()
{
+ _transport.abort();
}
private class CommitCallback implements Callback
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnection.java b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnection.java
index c88e08b679..cec4058cf6 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnection.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnection.java
@@ -537,10 +537,10 @@ public class HttpConnection extends AbstractConnection implements Runnable, Http
}
@Override
- public void failed()
+ public void abort()
{
+ super.abort();
_generator.setPersistent(false);
- getEndPoint().shutdownOutput();
}
@Override
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpOutput.java b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpOutput.java
index 1879dbb689..12a23d5fb3 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpOutput.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpOutput.java
@@ -157,7 +157,7 @@ public class HttpOutput extends ServletOutputStream implements Runnable
catch(IOException e)
{
LOG.debug(e);
- _channel.failed();
+ _channel.abort();
}
releaseBuffer();
return;
@@ -192,7 +192,7 @@ public class HttpOutput extends ServletOutputStream implements Runnable
catch(IOException e)
{
LOG.debug(e);
- _channel.failed();
+ _channel.abort();
}
releaseBuffer();
return;
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/Response.java b/jetty-server/src/main/java/org/eclipse/jetty/server/Response.java
index eb95e20401..79f4e4989c 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/Response.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/Response.java
@@ -541,10 +541,7 @@ public class Response implements HttpServletResponse
@Override
public void sendError(int sc) throws IOException
{
- if (sc == 102)
- sendProcessing();
- else
- sendError(sc, null);
+ sendError(sc, null);
}
@Override
@@ -553,6 +550,17 @@ public class Response implements HttpServletResponse
if (isIncluding())
return;
+ switch(code)
+ {
+ case -1:
+ _channel.abort();
+ return;
+ case 102:
+ sendProcessing();
+ return;
+ default:
+ }
+
if (isCommitted())
LOG.warn("Committed before "+code+" "+message);

Back to the top