From f980afacbd94d569a73af2142030b016ab7afaa6 Mon Sep 17 00:00:00 2001 From: Mathieu Carbou Date: Thu, 1 Jan 2026 16:36:37 +0100 Subject: [PATCH] Fix bug introduced in #349 See: https://github.com/ESP32Async/ESPAsyncWebServer/pull/349 Fix bug for non-chucked responses without a known content-length (see LargeResponse example) --- src/WebResponses.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/WebResponses.cpp b/src/WebResponses.cpp index 16776036..15ddb6c2 100644 --- a/src/WebResponses.cpp +++ b/src/WebResponses.cpp @@ -470,8 +470,16 @@ size_t AsyncAbstractResponse::write_send_buffs(AsyncWebServerRequest *request, s } } } else { - size_t const readLen = - _fillBufferAndProcessTemplates(_send_buffer->data(), std::min(std::min(_send_buffer->size(), tcp_win), _contentLength - _sentLength)); + // Non-chunked data. We can either have a response: + // - with a known content-length (example: Json response), in that case we pass the remaining length if lower than tcp_win + // - or with unknown content-length (see LargeResponse example, like ESP32Cam with streaming), in that case we just fill as much as tcp_win allows + size_t maxLen = std::min(_send_buffer->size(), tcp_win); + if (_contentLength) { + maxLen = _contentLength > _sentLength ? std::min(maxLen, _contentLength - _sentLength) : 0; + } + + size_t const readLen = _fillBufferAndProcessTemplates(_send_buffer->data(), maxLen); + if (readLen == 0) { // no more data to send _state = RESPONSE_END;