nghttpx: Reject multiple Content-Length even if their values are identical
This commit is contained in:
parent
0fcfe16dc5
commit
9a89db575a
|
@ -62,7 +62,7 @@ func TestH1H1MultipleRequestCL(t *testing.T) {
|
||||||
Host: %v
|
Host: %v
|
||||||
Test-Case: TestH1H1MultipleRequestCL
|
Test-Case: TestH1H1MultipleRequestCL
|
||||||
Content-Length: 0
|
Content-Length: 0
|
||||||
Content-Length: 1
|
Content-Length: 0
|
||||||
|
|
||||||
`, st.authority)); err != nil {
|
`, st.authority)); err != nil {
|
||||||
t.Fatalf("Error io.WriteString() = %v", err)
|
t.Fatalf("Error io.WriteString() = %v", err)
|
||||||
|
|
|
@ -234,7 +234,7 @@ func TestH2H1MultipleRequestCL(t *testing.T) {
|
||||||
name: "TestH2H1MultipleRequestCL",
|
name: "TestH2H1MultipleRequestCL",
|
||||||
header: []hpack.HeaderField{
|
header: []hpack.HeaderField{
|
||||||
pair("content-length", "1"),
|
pair("content-length", "1"),
|
||||||
pair("content-length", "2"),
|
pair("content-length", "1"),
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -372,7 +372,7 @@ func TestH2H1GracefulShutdown(t *testing.T) {
|
||||||
func TestH2H2MultipleResponseCL(t *testing.T) {
|
func TestH2H2MultipleResponseCL(t *testing.T) {
|
||||||
st := newServerTester([]string{"--http2-bridge"}, t, func(w http.ResponseWriter, r *http.Request) {
|
st := newServerTester([]string{"--http2-bridge"}, t, func(w http.ResponseWriter, r *http.Request) {
|
||||||
w.Header().Add("content-length", "1")
|
w.Header().Add("content-length", "1")
|
||||||
w.Header().Add("content-length", "2")
|
w.Header().Add("content-length", "1")
|
||||||
})
|
})
|
||||||
defer st.Close()
|
defer st.Close()
|
||||||
|
|
||||||
|
|
|
@ -64,7 +64,7 @@ func TestS3H1MultipleRequestCL(t *testing.T) {
|
||||||
name: "TestS3H1MultipleRequestCL",
|
name: "TestS3H1MultipleRequestCL",
|
||||||
header: []hpack.HeaderField{
|
header: []hpack.HeaderField{
|
||||||
pair("content-length", "1"),
|
pair("content-length", "1"),
|
||||||
pair("content-length", "2"),
|
pair("content-length", "1"),
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -306,7 +306,7 @@ int index_headers(int *hdidx, Headers &headers, int64_t &content_length) {
|
||||||
if (len == -1) {
|
if (len == -1) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (content_length != -1 && content_length != len) {
|
if (content_length != -1) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
content_length = len;
|
content_length = len;
|
||||||
|
|
|
@ -742,8 +742,7 @@ int on_header_callback(nghttp2_session *session, const nghttp2_frame *frame,
|
||||||
downstream->set_response_state(Downstream::MSG_BAD_HEADER);
|
downstream->set_response_state(Downstream::MSG_BAD_HEADER);
|
||||||
return NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE;
|
return NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE;
|
||||||
}
|
}
|
||||||
auto cl = downstream->get_response_content_length();
|
if (downstream->get_response_content_length() != -1) {
|
||||||
if (cl != -1 && cl != len) {
|
|
||||||
http2session->submit_rst_stream(frame->hd.stream_id,
|
http2session->submit_rst_stream(frame->hd.stream_id,
|
||||||
NGHTTP2_PROTOCOL_ERROR);
|
NGHTTP2_PROTOCOL_ERROR);
|
||||||
downstream->set_response_state(Downstream::MSG_BAD_HEADER);
|
downstream->set_response_state(Downstream::MSG_BAD_HEADER);
|
||||||
|
|
|
@ -206,8 +206,7 @@ int on_header_callback(nghttp2_session *session, const nghttp2_frame *frame,
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
auto cl = downstream->get_request_content_length();
|
if (downstream->get_request_content_length() != -1) {
|
||||||
if (cl != -1 && cl != len) {
|
|
||||||
if (upstream->error_reply(downstream, 400) != 0) {
|
if (upstream->error_reply(downstream, 400) != 0) {
|
||||||
return NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE;
|
return NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue