hc-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Tuomas Kiviaho (JIRA)" <j...@apache.org>
Subject [jira] [Created] (HTTPCORE-481) Early response suspends output even when response status is not error
Date Tue, 08 Aug 2017 09:10:00 GMT
Tuomas Kiviaho created HTTPCORE-481:
---------------------------------------

             Summary: 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-unsubscribe@hc.apache.org
For additional commands, e-mail: dev-help@hc.apache.org


Mime
View raw message