nghttpx: Fix stream hang with request body

The end of request stream is not detected correct place.
Also Downstream::end_upload_data() is not called.
This commit is contained in:
Tatsuhiro Tsujikawa 2013-10-30 00:00:58 +09:00
parent 0ced4741d2
commit 9b6a0e5875
2 changed files with 30 additions and 6 deletions

View File

@ -310,9 +310,21 @@ int on_data_chunk_recv_callback(nghttp2_session *session,
if(upstream->get_flow_control()) { if(upstream->get_flow_control()) {
downstream->inc_recv_window_size(len); downstream->inc_recv_window_size(len);
} }
if(flags & NGHTTP2_FLAG_END_STREAM) {
downstream->set_request_state(Downstream::MSG_COMPLETE);
} }
return 0;
}
} // namespace
namespace {
int on_data_recv_callback(nghttp2_session *session,
uint16_t length, uint8_t flags, int32_t stream_id,
void *user_data)
{
auto upstream = reinterpret_cast<Http2Upstream*>(user_data);
auto downstream = upstream->find_downstream(stream_id);
if(downstream && (flags & NGHTTP2_FLAG_END_STREAM)) {
downstream->end_upload_data();
downstream->set_request_state(Downstream::MSG_COMPLETE);
} }
return 0; return 0;
} }
@ -402,6 +414,7 @@ Http2Upstream::Http2Upstream(ClientHandler *handler)
callbacks.on_stream_close_callback = on_stream_close_callback; callbacks.on_stream_close_callback = on_stream_close_callback;
callbacks.on_frame_recv_callback = on_frame_recv_callback; callbacks.on_frame_recv_callback = on_frame_recv_callback;
callbacks.on_data_chunk_recv_callback = on_data_chunk_recv_callback; callbacks.on_data_chunk_recv_callback = on_data_chunk_recv_callback;
callbacks.on_data_recv_callback = on_data_recv_callback;
callbacks.on_frame_not_send_callback = on_frame_not_send_callback; callbacks.on_frame_not_send_callback = on_frame_not_send_callback;
callbacks.on_frame_recv_parse_error_callback = callbacks.on_frame_recv_parse_error_callback =
on_frame_recv_parse_error_callback; on_frame_recv_parse_error_callback;

View File

@ -267,9 +267,19 @@ void on_data_chunk_recv_callback(spdylay_session *session,
return; return;
} }
} }
if(flags & SPDYLAY_DATA_FLAG_FIN) {
downstream->set_request_state(Downstream::MSG_COMPLETE);
} }
}
} // namespace
namespace {
void on_data_recv_callback(spdylay_session *session, uint8_t flags,
int32_t stream_id, int32_t length, void *user_data)
{
auto upstream = reinterpret_cast<SpdyUpstream*>(user_data);
auto downstream = upstream->find_downstream(stream_id);
if(downstream && (flags & SPDYLAY_DATA_FLAG_FIN)) {
downstream->end_upload_data();
downstream->set_request_state(Downstream::MSG_COMPLETE);
} }
} }
} // namespace } // namespace
@ -357,6 +367,7 @@ SpdyUpstream::SpdyUpstream(uint16_t version, ClientHandler *handler)
callbacks.on_stream_close_callback = on_stream_close_callback; callbacks.on_stream_close_callback = on_stream_close_callback;
callbacks.on_ctrl_recv_callback = on_ctrl_recv_callback; callbacks.on_ctrl_recv_callback = on_ctrl_recv_callback;
callbacks.on_data_chunk_recv_callback = on_data_chunk_recv_callback; callbacks.on_data_chunk_recv_callback = on_data_chunk_recv_callback;
callbacks.on_data_recv_callback = on_data_recv_callback;
callbacks.on_ctrl_not_send_callback = on_ctrl_not_send_callback; callbacks.on_ctrl_not_send_callback = on_ctrl_not_send_callback;
callbacks.on_ctrl_recv_parse_error_callback = callbacks.on_ctrl_recv_parse_error_callback =
on_ctrl_recv_parse_error_callback; on_ctrl_recv_parse_error_callback;