From 8410f7ee6b5ac6acc9fd28c2abdcd728648c18de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Wiercho=C5=82a?= Date: Mon, 6 Mar 2023 11:36:19 +0100 Subject: [PATCH] Fix chunked body handling in fallback routine (#1585) --- src/HttpParser.h | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/src/HttpParser.h b/src/HttpParser.h index 967d235..3455c45 100644 --- a/src/HttpParser.h +++ b/src/HttpParser.h @@ -580,21 +580,34 @@ public: length -= consumed.first - had; if (remainingStreamingBytes) { - // this is exactly the same as above! - if (remainingStreamingBytes >= (unsigned int) length) { - void *returnedUser = dataHandler(user, std::string_view(data, length), remainingStreamingBytes == (unsigned int) length); - remainingStreamingBytes -= length; - return returnedUser; + /* It's either chunked or with a content-length */ + if (isParsingChunkedEncoding(remainingStreamingBytes)) { + std::string_view dataToConsume(data, length); + for (auto chunk : uWS::ChunkIterator(&dataToConsume, &remainingStreamingBytes)) { + dataHandler(user, chunk, chunk.length() == 0); + } + if (isParsingInvalidChunkedEncoding(remainingStreamingBytes)) { + return FULLPTR; + } + data = (char *) dataToConsume.data(); + length = (unsigned int) dataToConsume.length(); } else { - void *returnedUser = dataHandler(user, std::string_view(data, remainingStreamingBytes), true); - - data += remainingStreamingBytes; - length -= remainingStreamingBytes; - - remainingStreamingBytes = 0; - - if (returnedUser != user) { + // this is exactly the same as above! + if (remainingStreamingBytes >= (unsigned int) length) { + void *returnedUser = dataHandler(user, std::string_view(data, length), remainingStreamingBytes == (unsigned int) length); + remainingStreamingBytes -= length; return returnedUser; + } else { + void *returnedUser = dataHandler(user, std::string_view(data, remainingStreamingBytes), true); + + data += remainingStreamingBytes; + length -= remainingStreamingBytes; + + remainingStreamingBytes = 0; + + if (returnedUser != user) { + return returnedUser; + } } } }