diff --git a/src/shrpx_http2_session.cc b/src/shrpx_http2_session.cc index e2b4608c..24d9cbd5 100644 --- a/src/shrpx_http2_session.cc +++ b/src/shrpx_http2_session.cc @@ -2022,7 +2022,12 @@ int Http2Session::write_clear() { } if (nwrite < 0) { - return nwrite; + // We may have pending data in receive buffer which may + // contain part of response body. So keep reading. Invoke + // read event to get read(2) error just in case. + ev_feed_event(conn_.loop, &conn_.rev, EV_READ); + wb_.drain(wb_.rleft()); + break; } wb_.drain(nwrite); @@ -2132,7 +2137,12 @@ int Http2Session::write_tls() { } if (nwrite < 0) { - return nwrite; + // We may have pending data in receive buffer which may + // contain part of response body. So keep reading. Invoke + // read event to get read(2) error just in case. + ev_feed_event(conn_.loop, &conn_.rev, EV_READ); + wb_.drain(wb_.rleft()); + break; } wb_.drain(nwrite); diff --git a/src/shrpx_http_downstream_connection.cc b/src/shrpx_http_downstream_connection.cc index 70333a09..f6cf7998 100644 --- a/src/shrpx_http_downstream_connection.cc +++ b/src/shrpx_http_downstream_connection.cc @@ -1116,7 +1116,12 @@ int HttpDownstreamConnection::write_clear() { } if (nwrite < 0) { - return nwrite; + // We may have pending data in receive buffer which may contain + // part of response body. So keep reading. Invoke read event + // to get read(2) error just in case. + ev_feed_event(conn_.loop, &conn_.rev, EV_READ); + input->drain(input->rleft()); + break; } input->drain(nwrite); @@ -1236,7 +1241,12 @@ int HttpDownstreamConnection::write_tls() { } if (nwrite < 0) { - return nwrite; + // We may have pending data in receive buffer which may contain + // part of response body. So keep reading. Invoke read event + // to get read(2) error just in case. + ev_feed_event(conn_.loop, &conn_.rev, EV_READ); + input->drain(input->rleft()); + break; } input->drain(nwrite); diff --git a/src/shrpx_https_upstream.cc b/src/shrpx_https_upstream.cc index a12d1a40..4ea06aba 100644 --- a/src/shrpx_https_upstream.cc +++ b/src/shrpx_https_upstream.cc @@ -1184,7 +1184,9 @@ int HttpsUpstream::on_downstream_body_complete(Downstream *downstream) { resp.connection_close = true; } - if (req.connection_close || resp.connection_close) { + if (req.connection_close || resp.connection_close || + // To avoid to stall upload body + downstream->get_request_state() != Downstream::MSG_COMPLETE) { auto handler = get_client_handler(); handler->set_should_close_after_write(true); }