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

Reply via email to