diff --git a/src/shrpx_downstream.cc b/src/shrpx_downstream.cc index 32ef9f65..6a3f3ded 100644 --- a/src/shrpx_downstream.cc +++ b/src/shrpx_downstream.cc @@ -851,4 +851,12 @@ void Downstream::reset_response_datalen() response_datalen_ = 0; } +bool Downstream::expect_response_body() const +{ + return request_method_ != "HEAD" && + response_http_status_ / 100 != 1 && + response_http_status_ != 304 && + response_http_status_ != 204; +} + } // namespace shrpx diff --git a/src/shrpx_downstream.h b/src/shrpx_downstream.h index cc995255..080f798a 100644 --- a/src/shrpx_downstream.h +++ b/src/shrpx_downstream.h @@ -144,6 +144,7 @@ public: int end_upload_data(); size_t get_request_datalen() const; void reset_request_datalen(); + bool expect_response_body() const; enum { INITIAL, HEADER_COMPLETE, diff --git a/src/shrpx_http2_session.cc b/src/shrpx_http2_session.cc index b0372687..192495fc 100644 --- a/src/shrpx_http2_session.cc +++ b/src/shrpx_http2_session.cc @@ -1171,7 +1171,9 @@ int on_data_chunk_recv_callback(nghttp2_session *session, return 0; } auto downstream = sd->dconn->get_downstream(); - if(!downstream || downstream->get_downstream_stream_id() != stream_id) { + if(!downstream || downstream->get_downstream_stream_id() != stream_id || + !downstream->expect_response_body()) { + http2session->submit_rst_stream(stream_id, NGHTTP2_INTERNAL_ERROR); if(http2session->consume(stream_id, len) != 0) { diff --git a/src/shrpx_http2_upstream.cc b/src/shrpx_http2_upstream.cc index d2956ddc..df06901b 100644 --- a/src/shrpx_http2_upstream.cc +++ b/src/shrpx_http2_upstream.cc @@ -1219,8 +1219,16 @@ int Http2Upstream::on_downstream_header_complete(Downstream *downstream) data_prd.source.ptr = downstream; data_prd.read_callback = downstream_data_read_callback; + nghttp2_data_provider *data_prdptr; + + if(downstream->expect_response_body()) { + data_prdptr = &data_prd; + } else { + data_prdptr = nullptr; + } + rv = nghttp2_submit_response(session_, downstream->get_stream_id(), - nva.data(), nva.size(), &data_prd); + nva.data(), nva.size(),data_prdptr); if(rv != 0) { ULOG(FATAL, this) << "nghttp2_submit_response() failed"; return -1;