diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java b/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java index f71ae2a1bef..a431184250a 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java @@ -1800,6 +1800,7 @@ public class Request implements HttpServletRequest _cookies.reset(); _cookiesExtracted = false; _context = null; + _errorContext = null; _newContext = false; _queryEncoding = null; _requestedSessionId = null; diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/ErrorHandlerTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/ErrorHandlerTest.java index 13ec3543c70..a71d8910628 100644 --- a/jetty-server/src/test/java/org/eclipse/jetty/server/ErrorHandlerTest.java +++ b/jetty-server/src/test/java/org/eclipse/jetty/server/ErrorHandlerTest.java @@ -33,6 +33,10 @@ import org.eclipse.jetty.http.HttpHeader; import org.eclipse.jetty.http.HttpTester; import org.eclipse.jetty.logging.StacklessLogging; import org.eclipse.jetty.server.handler.AbstractHandler; +import org.eclipse.jetty.server.handler.ContextHandler; +import org.eclipse.jetty.server.handler.ContextHandlerCollection; +import org.eclipse.jetty.server.handler.ErrorHandler; +import org.eclipse.jetty.util.BufferUtil; import org.eclipse.jetty.util.ajax.JSON; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; @@ -566,4 +570,61 @@ public class ErrorHandlerTest // @checkstyle-enable-check : AvoidEscapedUnicodeCharacters } } + + @Test + public void testErrorContextRecycle() throws Exception + { + server.stop(); + ContextHandlerCollection contexts = new ContextHandlerCollection(); + server.setHandler(contexts); + ContextHandler context = new ContextHandler("/foo"); + contexts.addHandler(context); + context.setErrorHandler(new ErrorHandler() + { + @Override + public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException + { + baseRequest.setHandled(true); + response.getOutputStream().println("Context Error"); + } + }); + context.setHandler(new AbstractHandler() + { + @Override + public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException + { + response.sendError(444); + } + }); + + server.setErrorHandler(new ErrorHandler() + { + @Override + public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException + { + baseRequest.setHandled(true); + response.getOutputStream().println("Server Error"); + } + }); + + server.start(); + + LocalConnector.LocalEndPoint connection = connector.connect(); + connection.addInputAndExecute(BufferUtil.toBuffer( + "GET /foo/test HTTP/1.1\r\n" + + "Host: Localhost\r\n" + + "\r\n")); + String response = connection.getResponse(); + + assertThat(response, containsString("HTTP/1.1 444 444")); + assertThat(response, containsString("Context Error")); + + connection.addInputAndExecute(BufferUtil.toBuffer( + "GET /test HTTP/1.1\r\n" + + "Host: Localhost\r\n" + + "\r\n")); + response = connection.getResponse(); + assertThat(response, containsString("HTTP/1.1 404 Not Found")); + assertThat(response, containsString("Server Error")); + } }