From: Razvan Becheriu Date: Tue, 16 Jul 2019 19:52:08 +0000 (+0300) Subject: [#708,!423] make request and response parser accept Content-Length set to 0 X-Git-Tag: Kea-1.6.0~41^2~153 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=09d75804e050083b502a96c8e77b0e98c735ae3d;p=thirdparty%2Fkea.git [#708,!423] make request and response parser accept Content-Length set to 0 --- diff --git a/src/lib/http/request_parser.cc b/src/lib/http/request_parser.cc index 98547040bd..d413a60336 100644 --- a/src/lib/http/request_parser.cc +++ b/src/lib/http/request_parser.cc @@ -293,6 +293,8 @@ HttpRequestParser::expectingNewLineHandler(const unsigned int next_state) { if (content_length > 0) { // There is body in this request, so let's parse it. transition(HTTP_BODY_ST, DATA_READ_OK_EVT); + } else { + transition(HTTP_PARSE_OK_ST, HTTP_PARSE_OK_EVT); } } catch (const std::exception& ex) { // There is no body in this message. If the body is required diff --git a/src/lib/http/response_parser.cc b/src/lib/http/response_parser.cc index 9bbace0d74..46657b15de 100644 --- a/src/lib/http/response_parser.cc +++ b/src/lib/http/response_parser.cc @@ -295,6 +295,8 @@ HttpResponseParser::expectingNewLineHandler(const unsigned int next_state) { if (content_length > 0) { // There is body in this request, so let's parse it. transition(HTTP_BODY_ST, DATA_READ_OK_EVT); + } else { + transition(HTTP_PARSE_OK_ST, HTTP_PARSE_OK_EVT); } } catch (const std::exception& ex) { // There is no body in this message. If the body is required diff --git a/src/lib/http/tests/request_parser_unittests.cc b/src/lib/http/tests/request_parser_unittests.cc index 57e183ab20..cf8d40684b 100644 --- a/src/lib/http/tests/request_parser_unittests.cc +++ b/src/lib/http/tests/request_parser_unittests.cc @@ -368,4 +368,20 @@ TEST_F(HttpRequestParserTest, getBufferAsString) { parser.getBufferAsString(3)); } +TEST_F(HttpRequestParserTest, parseEmptyRequest) { + std::string http_req = "POST / HTTP/1.1\r\n" + "Content-Type: application/json\r\n"; + std::string json = ""; + + http_req = createRequestString(http_req, json); + + ASSERT_NO_FATAL_FAILURE(doParse(http_req)); + + EXPECT_EQ(HttpRequest::Method::HTTP_POST, request_.getMethod()); + EXPECT_EQ("/", request_.getUri()); + EXPECT_EQ("", request_.getBody()); + EXPECT_EQ(1, request_.getHttpVersion().major_); + EXPECT_EQ(1, request_.getHttpVersion().minor_); +} + } diff --git a/src/lib/http/tests/response_parser_unittests.cc b/src/lib/http/tests/response_parser_unittests.cc index 10e23b46e5..5461c5080c 100644 --- a/src/lib/http/tests/response_parser_unittests.cc +++ b/src/lib/http/tests/response_parser_unittests.cc @@ -330,5 +330,22 @@ TEST_F(HttpResponseParserTest, logFormatHttpMessage) { HttpResponseParser::logFormatHttpMessage(message, 3)); } +TEST_F(HttpResponseParserTest, parseEmptyResponse) { + std::string http_resp = "HTTP/1.1 200 OK\r\n" + "Content-Type: application/json\r\n"; + std::string json = ""; + + http_resp = createResponseString(http_resp, json); + + ASSERT_NO_FATAL_FAILURE(doParse(http_resp)); + + HttpResponseJson response = testResponseWithJson(http_resp, json); + + EXPECT_EQ("", response_.getBody()); + EXPECT_EQ(1, response_.getHttpVersion().major_); + EXPECT_EQ(1, response_.getHttpVersion().minor_); + EXPECT_EQ(HttpStatusCode::OK, response_.getStatusCode()); + EXPECT_EQ("OK", response_.getStatusPhrase()); +} }