Thanks Greg. Just so I’m clear, what does Jetty key on to know whether to close 
the connection? Just the 4xx/5xx response code? I’m trying to understand the 
difference between this case and the “normal unconsumed input” case you 
describe. Also, I did notice that Jetty does not set the Connection: close 
header when it does this, is that intentional?


> On Sep 25, 2018, at 6:37 PM, Greg Wilkins <gr...@webtide.com> wrote:
> 
> 
> Thomas,
> 
> There is no configuration to avoid this behaviour.  If jetty sees and 
> exception in the application it will send the 400 and close the connection.
> 
> However, as Simone says, your application can be setup to avoid this 
> situation by catching the exception and consuming any input.  You can do this 
> in a filter that catches Throwable, it can then check the request input 
> stream (and/or reader) for unconsumed input and read & discard to end of 
> file.   If the response is not committed, it can then send a 400 or any other 
> response that you like.
> 
> Just remember that this may make your application somewhat vulnerable to DOS 
> attacks as it will be easy to hold a thread in that filter slowly consuming 
> data.  I would suggest imposing a total time and total data limit on the 
> input consumption.
> 
> Note that for normal unconsumed input, jetty 9.4 does make some attempt to 
> consume it... but if the reading of that data would block, it gives up and 
> closes the connection, as there is no point blocking for data that will be 
> discarded.
> 
> regards
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> On Wed, 26 Sep 2018 at 07:35, Thomas Becker <twbec...@gmail.com 
> <mailto:twbec...@gmail.com>> wrote:
> Thanks so much again for your response, this is great information. What you 
> say makes sense, but I now see I failed to mention the most critical part of 
> this problem. Which is that the client never actually sees the 400 response 
> we are sending from Jetty. When varnish sees the RST, it considers the 
> backend request failed and returns 503 Service Unavailable to the client, 
> effectively swallowing our application’s response. We can pursue a solution 
> to this on the Varnish side, but in the interim I’m guessing there is no way 
> to configure this behavior in Jetty?
> 
> 
> 
>> On Sep 25, 2018, at 4:28 PM, Simone Bordet <sbor...@webtide.com 
>> <mailto:sbor...@webtide.com>> wrote:
>> 
>> Hi,
>> 
>> On Tue, Sep 25, 2018 at 8:34 PM Tommy Becker <twbec...@gmail.com 
>> <mailto:twbec...@gmail.com>> wrote:
>>> 
>>> Update: we setup an environment with the old Jetty 9.2 code and this does 
>>> not occur. 9.2 does not send the FIN in #5 above, and seems happy to 
>>> receive the rest of the content, despite having sent a response already.
>>> 
>>> On Tue, Sep 25, 2018 at 10:01 AM Tommy Becker <twbec...@gmail.com 
>>> <mailto:twbec...@gmail.com>> wrote:
>>>> 
>>>> Thanks for your response. I managed to snag a tcp dump of what's going on 
>>>> in this scenario. From what I can see the sequence of events is the 
>>>> following. Recall that our Jetty server is fronted by a Varnish cache.
>>>> 
>>>> 1) Varnish sends the headers and initial part of the content for a large 
>>>> POST.
>>>> 2) On the Jetty server, we use a streaming parser and begin validating the 
>>>> content.
>>>> 3) We detect a problem with the content and throw an exception that 
>>>> results in a 400 Bad Request to the client (via JAX-RS exception mapper)
>>>> 4) An ACK is sent for the segment containing the 400 error.
>>>> 5) The Jetty server sends a FIN.
>>>> 6) An ACK is sent for the FIN
>>>> 7) Varnish sends another segment that continues the content from #1.
>>>> 8) The Jetty server sends a RST.
>>>> 
>>>> In the server logs, we see an Early EOF from our JAX-RS resource that is 
>>>> parsing the content. This all seems pretty ok from the Jetty side, and it 
>>>> certainly seems like Varnish is misbehaving here (I'm thinking it may be 
>>>> this bug https://github.com/varnishcache/varnish-cache/issues/2332 
>>>> <https://github.com/varnishcache/varnish-cache/issues/2332>).  But I'm 
>>>> still unclear as to why this started after our upgrade from Jetty 9.2 -> 
>>>> 9.4. Any thoughts?
>>>> 
>> 
>> This is normal.
>> In Jetty 9.4 we are more aggressive in closing the connection because
>> we don't want to be at the mercy of a possible nasty client sending us
>> GiB of data when we know the application does not want to handle them.
>> Varnish behavior is correct too: it sees the FIN from Jetty but does
>> not know that Jetty does not want to read until it tries to send more
>> content and gets a RST.
>> At that point, it should relay the RST (or FIN) back to the client.
>> 
>> So you have 2 choices: you catch the exception during your validation,
>> and finish to read (and discard) the content in the application; or
>> you ignore the early EOFs in the logs.
>> I don't think that those early EOFs are logged above DEBUG level, is
>> that correct?
>> 
>> -- 
>> Simone Bordet
>> ----
>> http://cometd.org <http://cometd.org/>
>> http://webtide.com <http://webtide.com/>
>> Developer advice, training, services and support
>> from the Jetty & CometD experts.
>> _______________________________________________
>> jetty-users mailing list
>> jetty-users@eclipse.org <mailto:jetty-users@eclipse.org>
>> To change your delivery options, retrieve your password, or unsubscribe from 
>> this list, visit
>> https://dev.eclipse.org/mailman/listinfo/jetty-users 
>> <https://dev.eclipse.org/mailman/listinfo/jetty-users>
> _______________________________________________
> jetty-users mailing list
> jetty-users@eclipse.org <mailto:jetty-users@eclipse.org>
> To change your delivery options, retrieve your password, or unsubscribe from 
> this list, visit
> https://dev.eclipse.org/mailman/listinfo/jetty-users 
> <https://dev.eclipse.org/mailman/listinfo/jetty-users>
> 
> -- 
> Greg Wilkins <gr...@webtide.com <mailto:gr...@webtide.com>> CTO 
> http://webtide.com <http://webtide.com/>
> _______________________________________________
> jetty-users mailing list
> jetty-users@eclipse.org
> To change your delivery options, retrieve your password, or unsubscribe from 
> this list, visit
> https://dev.eclipse.org/mailman/listinfo/jetty-users

_______________________________________________
jetty-users mailing list
jetty-users@eclipse.org
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