[
https://issues.apache.org/jira/browse/HTTPCORE-481?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Oleg Kalnichevski reassigned HTTPCORE-481:
------------------------------------------
Assignee: Oleg Kalnichevski
Fix Version/s: 4.4.7
> 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
> Assignee: Oleg Kalnichevski
> Fix For: 4.4.7
>
>
> 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: [email protected]
For additional commands, e-mail: [email protected]