https://github.com/eclipse/jetty.project/issues/2081
On 28 December 2017 at 11:01, Greg Wilkins <[email protected]> wrote: > Actually, never mind I will open the issue. > > stand by... > > > On 28 December 2017 at 10:53, Greg Wilkins <[email protected]> wrote: > >> Daniel, >> >> well that looks wrong! I can confirm your test fails for me! >> >> I find it hard to believe we don't have a test for this... but we have >> changed some close handling recently so obviously we have stuffed up >> somehow. investigating.... >> >> Please open this as an issue. >> >> regards >> >> >> >> >> On 28 December 2017 at 01:41, Daniel Gredler <[email protected]> wrote: >> >>> Hi, >>> >>> I'm upgrading dependencies in a JAX-RS project, and have reached the >>> point where I need to upgrade Jersey, which (via transitive dependencies) >>> involves upgrading Jetty from 9.2.x to 9.4.x. >>> >>> One of our regression tests verifies that in the case of a request >>> timeout we are sending an HTTP 408 error back to the client. Ignoring all >>> of the JAX-RS layers, the code basically expects that the request handler >>> is able to catch an IOException with getCause() instanceof TimeoutException >>> (see code below for a minimal test case). This was the behavior in Jetty >>> 9.2.x. >>> >>> This appears to have changed in Jetty 9.3.0 and all subsequent 9.3.x and >>> 9.4.x releases: no IOException is thrown in the request handler when the >>> request timeout expires. Connections and so on seem to be cleaned up on the >>> server side correctly, but we no longer have a hook to send the 408 >>> response back to the client. >>> >>> What is the best practice in Jetty 9.4.x for hooking into the request >>> timeout mechanism in order to customize the response that is sent back to >>> the client in case of timeouts? >>> >>> Thanks!! >>> >>> Daniel >>> >>> >>> >>> [code sample] >>> >>> import static java.nio.charset.StandardCharsets.UTF_8; >>> >>> import java.io.IOException; >>> import java.io.OutputStreamWriter; >>> import java.net.InetAddress; >>> import java.net.Socket; >>> import java.util.concurrent.TimeoutException; >>> >>> import javax.servlet.http.HttpServletRequest; >>> import javax.servlet.http.HttpServletResponse; >>> >>> import org.apache.commons.io.IOUtils; >>> import org.eclipse.jetty.server.Request; >>> import org.eclipse.jetty.server.Server; >>> import org.eclipse.jetty.server.handler.AbstractHandler; >>> >>> public class JettyTimeoutTest { >>> >>> public static void main(String... args) throws Exception { >>> >>> int port = 8181; >>> Server jetty = new Server(port); >>> jetty.setHandler(new TestHandler()); >>> jetty.start(); >>> >>> try (Socket s = new Socket(InetAddress.getByName("localhost"), >>> port)) { >>> >>> String body = "abcdefghijklmnopqrstuvwxyz"; >>> >>> OutputStreamWriter sw = new >>> OutputStreamWriter(s.getOutputStream(), >>> UTF_8); >>> sw.write("POST /foo HTTP/1.0\r\n"); >>> sw.write("Content-Length: " + body.length() + "\r\n"); >>> sw.write("Content-Type: application/x-www-form-urlenco >>> ded\r\n"); >>> sw.write("\r\n"); >>> sw.flush(); >>> sw.write(body.substring(0, 10)); >>> Thread.sleep(40_000); // a little longer than the server >>> timeout, which is 30 seconds >>> sw.write(body.substring(10)); >>> sw.flush(); >>> >>> String response = IOUtils.toString(s.getInputStream(), >>> UTF_8); >>> System.out.println("Response:"); >>> System.out.println(response); // 408 response in Jetty <= >>> 9.2.23, empty response in Jetty >= 9.3.0 >>> >>> } finally { >>> jetty.stop(); >>> } >>> } >>> >>> private static class TestHandler extends AbstractHandler { >>> >>> @Override >>> public void handle(String target, Request baseRequest, >>> HttpServletRequest request, HttpServletResponse response) >>> throws IOException { >>> >>> int status; >>> String body; >>> >>> try { >>> status = HttpServletResponse.SC_OK; >>> body = IOUtils.toString(request.getInputStream(), >>> UTF_8); // tries to read the entire POST body >>> } catch (IOException e) { >>> if (e.getCause() instanceof TimeoutException) { >>> status = HttpServletResponse.SC_REQUEST_TIMEOUT; >>> body = "HTTP ERROR 408"; >>> } else { >>> status = HttpServletResponse.SC_INTERNA >>> L_SERVER_ERROR; >>> body = "HTTP ERROR 500"; >>> } >>> } >>> >>> response.setContentType("text/plain"); >>> response.setStatus(status); >>> response.getWriter().write(body); >>> baseRequest.setHandled(true); >>> } >>> } >>> } >>> >>> >>> _______________________________________________ >>> jetty-users mailing list >>> [email protected] >>> To change your delivery options, retrieve your password, or unsubscribe >>> from this list, visit >>> https://dev.eclipse.org/mailman/listinfo/jetty-users >>> >> >> >> >> -- >> Greg Wilkins <[email protected]> CTO http://webtide.com >> > > > > -- > Greg Wilkins <[email protected]> CTO http://webtide.com > -- Greg Wilkins <[email protected]> CTO http://webtide.com
_______________________________________________ jetty-users mailing list [email protected] To change your delivery options, retrieve your password, or unsubscribe from this list, visit https://dev.eclipse.org/mailman/listinfo/jetty-users
