From d78b2a569f3b30dfe08bc906fec20a6ade0a7407 Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Sun, 21 Nov 2021 11:48:49 +0800 Subject: [PATCH] Fix handling when Content-Length field is absent Closes #15754. PR #15757. --- src/base/http/requestparser.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/base/http/requestparser.cpp b/src/base/http/requestparser.cpp index 7f8af9a66..254a583a7 100644 --- a/src/base/http/requestparser.cpp +++ b/src/base/http/requestparser.cpp @@ -109,9 +109,18 @@ RequestParser::ParseResult RequestParser::doParse(const QByteArray &data) return {ParseStatus::OK, m_request, headerLength}; if (m_request.method == HEADER_REQUEST_METHOD_POST) { - bool ok = false; - const int contentLength = m_request.headers[HEADER_CONTENT_LENGTH].toInt(&ok); - if (!ok || (contentLength < 0)) + const auto parseContentLength = [this]() -> int + { + // [rfc7230] 3.3.2. Content-Length + + const QString rawValue = m_request.headers.value(HEADER_CONTENT_LENGTH); + if (rawValue.isNull()) // `HEADER_CONTENT_LENGTH` does not exist + return 0; + return Utils::String::parseInt(rawValue).value_or(-1); + }; + + const int contentLength = parseContentLength(); + if (contentLength < 0) { qWarning() << Q_FUNC_INFO << "bad request: content-length invalid"; return {ParseStatus::BadRequest, Request(), 0};