From 290c3b95a5b443b409689ae24217b3af31dcb105 Mon Sep 17 00:00:00 2001 From: Haibo Chen Date: Thu, 3 Feb 2022 15:05:09 +0800 Subject: [PATCH] Fix bug when the value of http header is empty (#2888) * Fix bug when the value of http header is empty * add utest --- trunk/src/protocol/srs_service_http_conn.cpp | 10 +++++----- trunk/src/utest/srs_utest_http.cpp | 21 ++++++++++++++++++++ 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/trunk/src/protocol/srs_service_http_conn.cpp b/trunk/src/protocol/srs_service_http_conn.cpp index 785ef3f2d..81fad1565 100644 --- a/trunk/src/protocol/srs_service_http_conn.cpp +++ b/trunk/src/protocol/srs_service_http_conn.cpp @@ -263,12 +263,12 @@ int SrsHttpParser::on_header_value(http_parser* parser, const char* at, size_t l if (length > 0) { obj->field_value.append(at, (int)length); - } - // When header parsed, we must save the position of start for body, - // because we have to consume the header in buffer. - // @see https://github.com/ossrs/srs/issues/1508 - obj->p_header_tail = at; + // When header parsed, we must save the position of start for body, + // because we have to consume the header in buffer. + // @see https://github.com/ossrs/srs/issues/1508 + obj->p_header_tail = at; + } srs_info("Header value(%d bytes): %.*s", (int)length, (int)length, at); return 0; diff --git a/trunk/src/utest/srs_utest_http.cpp b/trunk/src/utest/srs_utest_http.cpp index 3968e958b..6167de5ff 100644 --- a/trunk/src/utest/srs_utest_http.cpp +++ b/trunk/src/utest/srs_utest_http.cpp @@ -143,6 +143,16 @@ string mock_http_response2(int status, string content) return ss.str(); } +string mock_http_response3(int status, string content) +{ + stringstream ss; + ss << "HTTP/1.1 " << status << " " << srs_generate_http_status_text(status) << "\r\n" + << "Server:" << "\r\n" + << "\r\n" + << content; + return ss.str(); +} + bool is_string_contain(string substr, string str) { return (string::npos != str.find(substr)); @@ -528,6 +538,17 @@ VOID TEST(ProtocolHTTPTest, ClientRequest) EXPECT_STREQ("Hello, world!", res.c_str()); srs_freep(msg); } + + // Normal case, with empty server. + if(true) { + MockBufferIO io; io.append(mock_http_response3(200, "Hello, world!")); + SrsHttpParser hp; HELPER_ASSERT_SUCCESS(hp.initialize(HTTP_RESPONSE)); + ISrsHttpMessage* msg = NULL; HELPER_ASSERT_SUCCESS(hp.parse_message(&io, &msg)); + string res; HELPER_ASSERT_SUCCESS(msg->body_read_all(res)); + EXPECT_EQ(200, msg->status_code()); + EXPECT_STREQ("Hello, world!", res.c_str()); + srs_freep(msg); + } } VOID TEST(ProtocolHTTPTest, ResponseHTTPError)