diff --git a/src/shrpx_http2_upstream.cc b/src/shrpx_http2_upstream.cc index b1882abf..ebb762d5 100644 --- a/src/shrpx_http2_upstream.cc +++ b/src/shrpx_http2_upstream.cc @@ -1854,6 +1854,11 @@ int Http2Upstream::on_downstream_reset(Downstream *downstream, bool no_retry) { } if (!downstream->request_submission_ready()) { + if (downstream->get_response_state() == Downstream::MSG_COMPLETE) { + // We have got all response body already. Send it off. + downstream->pop_downstream_connection(); + return 0; + } // pushed stream is handled here rst_stream(downstream, NGHTTP2_INTERNAL_ERROR); downstream->pop_downstream_connection(); diff --git a/src/shrpx_https_upstream.cc b/src/shrpx_https_upstream.cc index 4ea06aba..bc939f2f 100644 --- a/src/shrpx_https_upstream.cc +++ b/src/shrpx_https_upstream.cc @@ -1223,13 +1223,23 @@ int HttpsUpstream::on_downstream_reset(Downstream *downstream, bool no_retry) { assert(downstream == downstream_.get()); + downstream_->pop_downstream_connection(); + if (!downstream_->request_submission_ready()) { + switch (downstream_->get_response_state()) { + case Downstream::MSG_COMPLETE: + // We have got all response body already. Send it off. + return 0; + case Downstream::INITIAL: + if (on_downstream_abort_request(downstream_.get(), 503) != 0) { + return -1; + } + return 0; + } // Return error so that caller can delete handler return -1; } - downstream_->pop_downstream_connection(); - downstream_->add_retry(); if (no_retry || downstream_->no_more_retry()) { diff --git a/src/shrpx_spdy_upstream.cc b/src/shrpx_spdy_upstream.cc index eff888be..3e50a62d 100644 --- a/src/shrpx_spdy_upstream.cc +++ b/src/shrpx_spdy_upstream.cc @@ -1314,6 +1314,11 @@ int SpdyUpstream::on_downstream_reset(Downstream *downstream, bool no_retry) { } if (!downstream->request_submission_ready()) { + if (downstream->get_response_state() == Downstream::MSG_COMPLETE) { + // We have got all response body already. Send it off. + downstream->pop_downstream_connection(); + return 0; + } rst_stream(downstream, SPDYLAY_INTERNAL_ERROR); downstream->pop_downstream_connection();