From eafe88cef1b0670c3fd56337916dd85b9eee4df8 Mon Sep 17 00:00:00 2001 From: antao Date: Thu, 27 Jun 2019 12:51:32 +0800 Subject: [PATCH] Modify the parser of HTTP requests --- lib/src/HttpRequestParser.cc | 132 ++++++++++++++++++----------------- lib/src/Utilities.cc | 3 +- 2 files changed, 68 insertions(+), 67 deletions(-) diff --git a/lib/src/HttpRequestParser.cc b/lib/src/HttpRequestParser.cc index f4107bab..557283bc 100644 --- a/lib/src/HttpRequestParser.cc +++ b/lib/src/HttpRequestParser.cc @@ -37,9 +37,10 @@ void HttpRequestParser::shutdownConnection(HttpStatusCode code) auto connPtr = _conn.lock(); if (connPtr) { - connPtr->send(utils::formattedString("HTTP/1.1 %d %s\r\n\r\n", - code, - statusCodeToString(code).data())); + connPtr->send(utils::formattedString( + "HTTP/1.1 %d %s\r\nConnection: close\r\n\r\n", + code, + statusCodeToString(code).data())); connPtr->shutdown(); } } @@ -170,76 +171,77 @@ bool HttpRequestParser::parseRequest(MsgBuffer *buf) LOG_TRACE << "content len=" << len; if (!len.empty()) { - _request->_contentLen = atoi(len.c_str()); + _request->_contentLen = std::stoull(len.c_str()); _state = HttpRequestParseState_ExpectBody; - auto &expect = _request->getHeaderBy("expect"); - if (expect == "100-continue" && - _request->getVersion() >= HttpRequest::kHttp11) - { - if (_request->_contentLen == 0) - { - buf->retrieveAll(); - shutdownConnection(k400BadRequest); - return false; - } - // rfc2616-8.2.3 - auto connPtr = _conn.lock(); - if (connPtr) - { - auto resp = HttpResponse::newHttpResponse(); - if (_request->_contentLen > - HttpAppFrameworkImpl::instance() - .getClientMaxBodySize()) - { - resp->setStatusCode( - k413RequestEntityTooLarge); - auto httpString = - std::dynamic_pointer_cast< - HttpResponseImpl>(resp) - ->renderToString(); - reset(); - connPtr->send(httpString); - } - else - { - resp->setStatusCode(k100Continue); - auto httpString = - std::dynamic_pointer_cast< - HttpResponseImpl>(resp) - ->renderToString(); - connPtr->send(httpString); - } - } - } - else if (!expect.empty()) - { - LOG_WARN << "417ExpectationFailed for \"" << expect - << "\""; - auto connPtr = _conn.lock(); - if (connPtr) - { - buf->retrieveAll(); - shutdownConnection(k417ExpectationFailed); - return false; - } - } - else if (_request->_contentLen > - HttpAppFrameworkImpl::instance() - .getClientMaxBodySize()) - { - buf->retrieveAll(); - shutdownConnection(k413RequestEntityTooLarge); - return false; - } - _request->reserveBodySize(); } - else + if (_request->_contentLen == 0) { _state = HttpRequestParseState_GotAll; _requestsCounter++; hasMore = false; } + + auto &expect = _request->getHeaderBy("expect"); + if (expect == "100-continue" && + _request->getVersion() >= HttpRequest::kHttp11) + { + if (_request->_contentLen == 0) + { + buf->retrieveAll(); + shutdownConnection(k400BadRequest); + return false; + } + // rfc2616-8.2.3 + auto connPtr = _conn.lock(); + if (connPtr) + { + auto resp = HttpResponse::newHttpResponse(); + if (_request->_contentLen > + HttpAppFrameworkImpl::instance() + .getClientMaxBodySize()) + { + resp->setStatusCode(k413RequestEntityTooLarge); + auto httpString = + std::dynamic_pointer_cast( + resp) + ->renderToString(); + reset(); + connPtr->send(httpString); + } + else + { + resp->setStatusCode(k100Continue); + auto httpString = + std::dynamic_pointer_cast( + resp) + ->renderToString(); + connPtr->send(httpString); + } + } + } + else if (!expect.empty()) + { + LOG_WARN << "417ExpectationFailed for \"" << expect + << "\""; + auto connPtr = _conn.lock(); + if (connPtr) + { + buf->retrieveAll(); + shutdownConnection(k417ExpectationFailed); + return false; + } + } + else if (_request->_contentLen > + HttpAppFrameworkImpl::instance() + .getClientMaxBodySize()) + { + buf->retrieveAll(); + shutdownConnection(k413RequestEntityTooLarge); + return false; + } + _request->reserveBodySize(); } + buf->retrieveUntil(crlf + 2); } else diff --git a/lib/src/Utilities.cc b/lib/src/Utilities.cc index 16799287..55a31d89 100644 --- a/lib/src/Utilities.cc +++ b/lib/src/Utilities.cc @@ -648,8 +648,7 @@ trantor::Date getHttpDate(const std::string &httpFullDateString) } std::string formattedString(const char *format, ...) { - std::string strBuffer; - strBuffer.resize(1024); + std::string strBuffer(128, 0); va_list ap, backup_ap; va_start(ap, format); va_copy(backup_ap, ap);