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
_______________________________________________ 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
