diff --git a/src/shrpx_http2_session.cc b/src/shrpx_http2_session.cc index 4009ea74..71bdbfa3 100644 --- a/src/shrpx_http2_session.cc +++ b/src/shrpx_http2_session.cc @@ -737,46 +737,44 @@ int on_stream_close_callback(nghttp2_session *session, int32_t stream_id, auto dconn = sd->dconn; if (dconn) { auto downstream = dconn->get_downstream(); - if (downstream) { - auto upstream = downstream->get_upstream(); + auto upstream = downstream->get_upstream(); - if (downstream->get_downstream_stream_id() % 2 == 0 && - downstream->get_request_state() == Downstream::INITIAL) { - // Downstream is canceled in backend before it is submitted in - // frontend session. + if (downstream->get_downstream_stream_id() % 2 == 0 && + downstream->get_request_state() == Downstream::INITIAL) { + // Downstream is canceled in backend before it is submitted in + // frontend session. - // This will avoid to send RST_STREAM to backend - downstream->set_response_state(Downstream::MSG_RESET); - upstream->cancel_premature_downstream(downstream); - } else { - if (downstream->get_upgraded() && - downstream->get_response_state() == Downstream::HEADER_COMPLETE) { - // For tunneled connection, we have to submit RST_STREAM to - // upstream *after* whole response body is sent. We just set - // MSG_COMPLETE here. Upstream will take care of that. - downstream->get_upstream()->on_downstream_body_complete(downstream); - downstream->set_response_state(Downstream::MSG_COMPLETE); - } else if (error_code == NGHTTP2_NO_ERROR) { - switch (downstream->get_response_state()) { - case Downstream::MSG_COMPLETE: - case Downstream::MSG_BAD_HEADER: - break; - default: - downstream->set_response_state(Downstream::MSG_RESET); - } - } else if (downstream->get_response_state() != - Downstream::MSG_BAD_HEADER) { + // This will avoid to send RST_STREAM to backend + downstream->set_response_state(Downstream::MSG_RESET); + upstream->cancel_premature_downstream(downstream); + } else { + if (downstream->get_upgraded() && + downstream->get_response_state() == Downstream::HEADER_COMPLETE) { + // For tunneled connection, we have to submit RST_STREAM to + // upstream *after* whole response body is sent. We just set + // MSG_COMPLETE here. Upstream will take care of that. + downstream->get_upstream()->on_downstream_body_complete(downstream); + downstream->set_response_state(Downstream::MSG_COMPLETE); + } else if (error_code == NGHTTP2_NO_ERROR) { + switch (downstream->get_response_state()) { + case Downstream::MSG_COMPLETE: + case Downstream::MSG_BAD_HEADER: + break; + default: downstream->set_response_state(Downstream::MSG_RESET); } - if (downstream->get_response_state() == Downstream::MSG_RESET && - downstream->get_response_rst_stream_error_code() == - NGHTTP2_NO_ERROR) { - downstream->set_response_rst_stream_error_code(error_code); - } - call_downstream_readcb(http2session, downstream); + } else if (downstream->get_response_state() != + Downstream::MSG_BAD_HEADER) { + downstream->set_response_state(Downstream::MSG_RESET); } - // dconn may be deleted + if (downstream->get_response_state() == Downstream::MSG_RESET && + downstream->get_response_rst_stream_error_code() == + NGHTTP2_NO_ERROR) { + downstream->set_response_rst_stream_error_code(error_code); + } + call_downstream_readcb(http2session, downstream); } + // dconn may be deleted } // The life time of StreamData ends here http2session->remove_stream_data(sd); @@ -806,9 +804,6 @@ int on_header_callback2(nghttp2_session *session, const nghttp2_frame *frame, return 0; } auto downstream = sd->dconn->get_downstream(); - if (!downstream) { - return 0; - } auto namebuf = nghttp2_rcbuf_get_buf(name); auto valuebuf = nghttp2_rcbuf_get_buf(value); @@ -918,10 +913,6 @@ int on_invalid_header_callback2(nghttp2_session *session, if (!sd || !sd->dconn) { return 0; } - auto downstream = sd->dconn->get_downstream(); - if (!downstream) { - return 0; - } int32_t stream_id; @@ -966,12 +957,6 @@ int on_begin_headers_callback(nghttp2_session *session, NGHTTP2_INTERNAL_ERROR); return 0; } - auto downstream = sd->dconn->get_downstream(); - if (!downstream) { - http2session->submit_rst_stream(frame->hd.stream_id, - NGHTTP2_INTERNAL_ERROR); - return 0; - } return 0; } case NGHTTP2_PUSH_PROMISE: { @@ -1132,10 +1117,6 @@ int on_frame_recv_callback(nghttp2_session *session, const nghttp2_frame *frame, return 0; } auto downstream = sd->dconn->get_downstream(); - if (!downstream) { - return 0; - } - auto upstream = downstream->get_upstream(); rv = upstream->on_downstream_body(downstream, nullptr, 0, true); if (rv != 0) { @@ -1170,10 +1151,6 @@ int on_frame_recv_callback(nghttp2_session *session, const nghttp2_frame *frame, } auto downstream = sd->dconn->get_downstream(); - if (!downstream) { - return 0; - } - if (frame->headers.cat == NGHTTP2_HCAT_RESPONSE || frame->headers.cat == NGHTTP2_HCAT_PUSH_RESPONSE) { rv = on_response_headers(http2session, downstream, session, frame); @@ -1219,11 +1196,9 @@ int on_frame_recv_callback(nghttp2_session *session, const nghttp2_frame *frame, nghttp2_session_get_stream_user_data(session, frame->hd.stream_id)); if (sd && sd->dconn) { auto downstream = sd->dconn->get_downstream(); - if (downstream) { - downstream->set_response_rst_stream_error_code( - frame->rst_stream.error_code); - call_downstream_readcb(http2session, downstream); - } + downstream->set_response_rst_stream_error_code( + frame->rst_stream.error_code); + call_downstream_readcb(http2session, downstream); } return 0; } @@ -1325,7 +1300,7 @@ int on_data_chunk_recv_callback(nghttp2_session *session, uint8_t flags, return 0; } auto downstream = sd->dconn->get_downstream(); - if (!downstream || !downstream->expect_response_body()) { + if (!downstream->expect_response_body()) { http2session->submit_rst_stream(stream_id, NGHTTP2_INTERNAL_ERROR); if (http2session->consume(stream_id, len) != 0) { @@ -1386,10 +1361,6 @@ int on_frame_send_callback(nghttp2_session *session, const nghttp2_frame *frame, auto downstream = sd->dconn->get_downstream(); - if (!downstream) { - return 0; - } - if (frame->hd.type == NGHTTP2_HEADERS && frame->headers.cat == NGHTTP2_HCAT_REQUEST) { downstream->set_request_header_sent(true); @@ -1438,9 +1409,6 @@ int on_frame_not_send_callback(nghttp2_session *session, return 0; } auto downstream = sd->dconn->get_downstream(); - if (!downstream) { - return 0; - } if (lib_error_code == NGHTTP2_ERR_START_STREAM_NOT_ALLOWED) { // Migrate to another downstream connection. @@ -1829,7 +1797,7 @@ void Http2Session::submit_pending_requests() { for (auto dconn = dconns_.head; dconn; dconn = dconn->dlnext) { auto downstream = dconn->get_downstream(); - if (!downstream || !downstream->get_request_pending() || + if (!downstream->get_request_pending() || !downstream->request_submission_ready()) { continue; }