From 02e4c5368539cb0655fa6396ccf7be8fc45f6fb3 Mon Sep 17 00:00:00 2001 From: yhirose Date: Tue, 10 Feb 2026 23:21:43 -1000 Subject: [PATCH] Fix 'no TLS' problem with RequestWithoutContentLengthOrTransferEncoding --- httplib.h | 31 ++++++++++++++++++------------- justfile | 3 +++ 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/httplib.h b/httplib.h index 5470285..b909f39 100644 --- a/httplib.h +++ b/httplib.h @@ -9869,20 +9869,25 @@ inline bool Server::read_content_core( payload_max_length_ < (std::numeric_limits::max)()) { socket_t s = strm.socket(); if (s != INVALID_SOCKET) { - // Peek to check if there is any pending data - char peekbuf[1]; - ssize_t n = ::recv(s, peekbuf, 1, MSG_PEEK); - if (n > 0) { - // There is data, so read it with payload limit enforcement - auto result = detail::read_content_without_length( - strm, payload_max_length_, out); - if (result == detail::ReadContentResult::PayloadTooLarge) { - res.status = StatusCode::PayloadTooLarge_413; - return false; - } else if (result != detail::ReadContentResult::Success) { - return false; + // Use a non-blocking check to see if there is any pending data. + // A blocking recv(MSG_PEEK) would deadlock when the client is + // waiting for the response (e.g. POST with Connection: close and + // no body). + if (detail::select_read(s, 0, 0) > 0) { + char peekbuf[1]; + ssize_t n = ::recv(s, peekbuf, 1, MSG_PEEK); + if (n > 0) { + // There is data, so read it with payload limit enforcement + auto result = detail::read_content_without_length( + strm, payload_max_length_, out); + if (result == detail::ReadContentResult::PayloadTooLarge) { + res.status = StatusCode::PayloadTooLarge_413; + return false; + } else if (result != detail::ReadContentResult::Success) { + return false; + } + return true; } - return true; } } } diff --git a/justfile b/justfile index c1153b4..0745a78 100644 --- a/justfile +++ b/justfile @@ -13,6 +13,9 @@ mbedtls: @(cd test && make test_mbedtls && LSAN_OPTIONS=suppressions=lsan_suppressions.txt ./test_mbedtls) @(cd test && make proxy_mbedtls) +no_tls: + @(cd test && make test_no_tls && ./test_no_tls) + fuzz: @(cd test && make fuzz_test)