From 97366bf55c91e568b555c39c029bca82920a36ab Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Fri, 10 Apr 2015 22:10:51 +0900 Subject: [PATCH] nghttpx: Set content-length after complete request/response headers --- src/shrpx_http2_session.cc | 14 ++++++++------ src/shrpx_http2_upstream.cc | 14 ++++++++------ 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/shrpx_http2_session.cc b/src/shrpx_http2_session.cc index a73c91c5..0e31a0f9 100644 --- a/src/shrpx_http2_session.cc +++ b/src/shrpx_http2_session.cc @@ -757,12 +757,6 @@ int on_header_callback(nghttp2_session *session, const nghttp2_frame *frame, auto token = http2::lookup_token(name, namelen); - if (token == http2::HD_CONTENT_LENGTH) { - // libnghttp2 guarantees this can be parsed - auto len = util::parse_uint(value, valuelen); - downstream->set_response_content_length(len); - } - downstream->add_response_header(name, namelen, value, valuelen, flags & NGHTTP2_NV_FLAG_NO_INDEX, token); return 0; @@ -844,6 +838,14 @@ int on_response_headers(Http2Session *http2session, Downstream *downstream, return 0; } + auto content_length = + downstream->get_response_header(http2::HD_CONTENT_LENGTH); + if (content_length) { + // libnghttp2 guarantees this can be parsed + auto len = util::parse_uint(content_length->value); + downstream->set_response_content_length(len); + } + if (downstream->get_response_content_length() == -1 && downstream->expect_response_body()) { // Here we have response body but Content-Length is not known in diff --git a/src/shrpx_http2_upstream.cc b/src/shrpx_http2_upstream.cc index a3179b9f..fcb91829 100644 --- a/src/shrpx_http2_upstream.cc +++ b/src/shrpx_http2_upstream.cc @@ -233,12 +233,6 @@ int on_header_callback(nghttp2_session *session, const nghttp2_frame *frame, auto token = http2::lookup_token(name, namelen); - if (token == http2::HD_CONTENT_LENGTH) { - // libnghttp2 guarantees this can be parsed - auto len = util::parse_uint(value, valuelen); - downstream->set_request_content_length(len); - } - downstream->add_request_header(name, namelen, value, valuelen, flags & NGHTTP2_NV_FLAG_NO_INDEX, token); return 0; @@ -300,6 +294,14 @@ int Http2Upstream::on_request_headers(Downstream *downstream, http2::dump_nv(get_config()->http2_upstream_dump_request_header, nva); } + auto content_length = + downstream->get_request_header(http2::HD_CONTENT_LENGTH); + if (content_length) { + // libnghttp2 guarantees this can be parsed + auto len = util::parse_uint(content_length->value); + downstream->set_request_content_length(len); + } + auto authority = downstream->get_request_header(http2::HD__AUTHORITY); auto path = downstream->get_request_header(http2::HD__PATH); auto method = downstream->get_request_header(http2::HD__METHOD);