diff --git a/src/shrpx_downstream.cc b/src/shrpx_downstream.cc index 87e8ff58..60428783 100644 --- a/src/shrpx_downstream.cc +++ b/src/shrpx_downstream.cc @@ -1211,4 +1211,8 @@ void Downstream::detach_blocked_link(BlockedLink *l) { blocked_link_ = nullptr; } +void Downstream::add_request_headers_sum(size_t amount) { + request_headers_sum_ += amount; +} + } // namespace shrpx diff --git a/src/shrpx_downstream.h b/src/shrpx_downstream.h index 0388adea..f761b6a0 100644 --- a/src/shrpx_downstream.h +++ b/src/shrpx_downstream.h @@ -143,6 +143,7 @@ public: void set_request_method(std::string method); const std::string &get_request_method() const; void set_request_path(std::string path); + void add_request_headers_sum(size_t amount); void set_request_start_time(std::chrono::high_resolution_clock::time_point time); const std::chrono::high_resolution_clock::time_point & diff --git a/src/shrpx_https_upstream.cc b/src/shrpx_https_upstream.cc index b3f1a029..e620a5da 100644 --- a/src/shrpx_https_upstream.cc +++ b/src/shrpx_https_upstream.cc @@ -78,6 +78,17 @@ namespace { int htp_uricb(http_parser *htp, const char *data, size_t len) { auto upstream = static_cast(htp->data); auto downstream = upstream->get_downstream(); + if (downstream->get_request_headers_sum() + len > + get_config()->header_field_buffer) { + if (LOG_ENABLED(INFO)) { + ULOG(INFO, upstream) << "Too large URI size=" + << downstream->get_request_headers_sum() + len; + } + assert(downstream->get_request_state() == Downstream::INITIAL); + downstream->set_request_state(Downstream::HTTP1_REQUEST_HEADER_TOO_LARGE); + return -1; + } + downstream->add_request_headers_sum(len); downstream->append_request_path(data, len); return 0; }