Daniel, check the issue. I have an explanation and a work around. Not yet sure about the fix or even if it should be fixed.
cheers On 28 December 2017 at 11:34, Greg Wilkins <[email protected]> wrote: > 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 > -- 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
