nghttpx: Stream error if mandatory HTTP/2 request header field is missing

This commit is contained in:
Tatsuhiro Tsujikawa 2013-08-25 23:21:07 +09:00
parent 39611f6f7f
commit 5d7b7a1691
1 changed files with 12 additions and 20 deletions

View File

@ -252,19 +252,17 @@ void on_frame_recv_callback
break; break;
} }
} }
if(!bad_req && }
!util::strieq("CONNECT", if(!bad_req &&
nva[req_hdidx[1]].value, !util::strieq("CONNECT",
nva[req_hdidx[1]].valuelen) && nva[req_hdidx[1]].value,
(frame->hd.flags & NGHTTP2_FLAG_END_STREAM) == 0 && nva[req_hdidx[1]].valuelen) &&
req_hdidx[4] == -1) { (frame->hd.flags & NGHTTP2_FLAG_END_STREAM) == 0 &&
// If content-length is missing, req_hdidx[4] == -1) {
// Downstream::push_upload_data_chunk will fail and // If content-length is missing,
// RST_STREAM will be sent. Therefore, error reply in // Downstream::push_upload_data_chunk will fail and
// HEADERS may not be sent. So just issue RST_STREAM here. // RST_STREAM will be sent.
upstream->rst_stream(downstream, NGHTTP2_PROTOCOL_ERROR); bad_req = true;
return;
}
} }
if(!bad_req) { if(!bad_req) {
for(; i < frame->headers.nvlen; ++i) { for(; i < frame->headers.nvlen; ++i) {
@ -279,13 +277,7 @@ void on_frame_recv_callback
} }
} }
if(bad_req) { if(bad_req) {
downstream->set_request_state(Downstream::HEADER_COMPLETE); upstream->rst_stream(downstream, NGHTTP2_PROTOCOL_ERROR);
if(frame->hd.flags & NGHTTP2_FLAG_END_STREAM) {
downstream->set_request_state(Downstream::MSG_COMPLETE);
}
if(upstream->error_reply(downstream, 400) != 0) {
upstream->rst_stream(downstream, NGHTTP2_PROTOCOL_ERROR);
}
return; return;
} }