[ 
https://issues.apache.org/jira/browse/HTTPCORE-481?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16118883#comment-16118883
 ] 

Tuomas Kiviaho commented on HTTPCORE-481:
-----------------------------------------

The best I can do is to give steps-to-reproduce

# Send headers and keep on producing request body
# When receiving request respond immediately with OK status and start producing 
response body

This will lead to situation where whatever has been written out to the socket 
will appear at the server side but once client resets and suspends the output 
nothing will appear on the server side.


> Early response suspends output even when response status is not error
> ---------------------------------------------------------------------
>
>                 Key: HTTPCORE-481
>                 URL: https://issues.apache.org/jira/browse/HTTPCORE-481
>             Project: HttpComponents HttpCore
>          Issue Type: Bug
>          Components: HttpCore NIO
>    Affects Versions: 4.4.5
>            Reporter: Tuomas Kiviaho
>
> I have a {{text/event-stream}} response where status code 200 is sent 
> immediately back even when there is still request body streaming in process. 
> This works well with Jetty client but for some reason I could only receive 
> the first full buffer at server side when switching over to HttpAsyncClient. 
> The only visible notion that something went wrong was Jetty doing an idle 
> timeout cleanup. Luckily there is a notion of connection state which got 
> invalidated when response was received but only when request body streaming 
> was still in progress.
> I found out via this link 
> https://stackoverflow.com/questions/14250991/is-it-acceptable-for-a-server-to-send-a-http-response-before-the-entire-request
>  that probably the reason behind the behavior is to prevent flooding the 
> server in case of an error.
> {quote}
> An HTTP/1.1 (or later) client sending a message-body SHOULD monitor the 
> network connection for an error status while it is transmitting the request. 
> If the client sees an error status, it SHOULD immediately cease transmitting 
> the body.
> {quote}
> Below is a patch that currently functions as a work-a-round for me. I'd still 
> prefer the current behavior in case of unauthorized authentication etc. 
> because the request body can be quite large.
> {code:title=org/apache/http/nio/protocol/HttpAsyncRequestExecutor.java:295}
>          } else if (state.getRequestState() == MessageState.BODY_STREAM) {
>              // Early response
> +            if (statusCode >= 400) {
>                 conn.resetOutput();
>                 conn.suspendOutput();
>                 state.setRequestState(MessageState.COMPLETED);
>                 state.invalidate();
> +            }
>          }
> {code}



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@hc.apache.org
For additional commands, e-mail: dev-h...@hc.apache.org

Reply via email to