diff --git a/trunk/src/app/srs_app_http_conn.cpp b/trunk/src/app/srs_app_http_conn.cpp index f210df847..ff20f78fc 100644 --- a/trunk/src/app/srs_app_http_conn.cpp +++ b/trunk/src/app/srs_app_http_conn.cpp @@ -243,8 +243,8 @@ srs_error_t SrsResponseOnlyHttpConn::on_got_http_message(ISrsHttpMessage* msg) } // drop all request body. + char body[4096]; while (!br->eof()) { - char body[4096]; if ((err = br->read(body, 4096, NULL)) != srs_success) { return srs_error_wrap(err, "read response"); } diff --git a/trunk/src/utest/srs_utest_protocol.cpp b/trunk/src/utest/srs_utest_protocol.cpp index ec50d29e9..5a32a6ba2 100644 --- a/trunk/src/utest/srs_utest_protocol.cpp +++ b/trunk/src/utest/srs_utest_protocol.cpp @@ -33,6 +33,7 @@ using namespace std; #include #include #include +#include MockEmptyIO::MockEmptyIO() { @@ -105,6 +106,12 @@ MockBufferIO::~MockBufferIO() { } +MockBufferIO* MockBufferIO::append(string data) +{ + in_buffer.append(data.data(), data.length()); + return this; +} + bool MockBufferIO::is_never_timeout(int64_t tm) { return tm == SRS_CONSTS_NO_TMMS; @@ -5523,5 +5530,91 @@ VOID TEST(ProtocolRTMPTest, RTMPHandshakeBytes) EXPECT_TRUE(bytes.s0s1s2 != NULL); } +VOID TEST(ProtocolHTTPTest, ParseHTTPMessage) +{ + if (true) { + MockBufferIO bio; + SrsHttpParser hp; + + bio.append("GET /gslb/v1/versions HTTP/1.1\r\nContent-Length: 5\r\n\r\nHello"); + EXPECT_TRUE(0 == hp.initialize(HTTP_REQUEST, false)); + + if (true) { + ISrsHttpMessage* req = NULL; + SrsAutoFree(ISrsHttpMessage, req); + ASSERT_TRUE(0 == hp.parse_message(&bio, &req)); + + // We should read body, or next parsing message will fail. + // @see https://github.com/ossrs/srs/issues/1181 + EXPECT_FALSE(req->body_reader()->eof()); + } + + if (true) { + bio.append("GET /gslb/v1/versions HTTP/1.1\r\nContent-Length: 5\r\n\r\nHello"); + + // Should fail because there is body which not read. + // @see https://github.com/ossrs/srs/issues/1181 + + ISrsHttpMessage* req = NULL; + SrsAutoFree(ISrsHttpMessage, req); + ASSERT_FALSE(0 == hp.parse_message(&bio, &req)); + } + } + + if (true) { + MockBufferIO bio; + SrsHttpParser hp; + + bio.append("GET /gslb/v1/versions HTTP/1.1\r\nContent-Length: 5\r\n\r\nHello"); + ASSERT_TRUE(0 == hp.initialize(HTTP_REQUEST, false)); + + ISrsHttpMessage* req = NULL; + SrsAutoFree(ISrsHttpMessage, req); + ASSERT_TRUE(0 == hp.parse_message(&bio, &req)); + + char v[64] = {0}; + EXPECT_TRUE(0 == req->body_reader()->read(v, sizeof(v), NULL)); + EXPECT_TRUE(string("Hello") == string(v)); + + EXPECT_TRUE(req->body_reader()->eof()); + } + + if (true) { + MockBufferIO bio; + SrsHttpParser hp; + + bio.append("GET /gslb/v1/versions HTTP/1.1\r\nContent-Length: 0\r\n\r\n"); + ASSERT_TRUE(0 == hp.initialize(HTTP_REQUEST, false)); + + ISrsHttpMessage* req = NULL; + SrsAutoFree(ISrsHttpMessage, req); + EXPECT_TRUE(0 == hp.parse_message(&bio, &req)); + } + + if (true) { + MockBufferIO bio; + SrsHttpParser hp; + + bio.append("GET /gslb/v1/versions HTTP/1.1\r\n\r\n"); + ASSERT_TRUE(0 == hp.initialize(HTTP_REQUEST, false)); + + ISrsHttpMessage* req = NULL; + SrsAutoFree(ISrsHttpMessage, req); + EXPECT_TRUE(0 == hp.parse_message(&bio, &req)); + } + + if (true) { + MockBufferIO bio; + SrsHttpParser hp; + + bio.append("GET /gslb/v1/versions HTTP/1.1\r\n\r\n"); + ASSERT_TRUE(0 == hp.initialize(HTTP_REQUEST, false)); + + ISrsHttpMessage* req = NULL; + SrsAutoFree(ISrsHttpMessage, req); + EXPECT_TRUE(0 == hp.parse_message(&bio, &req)); + } +} + #endif diff --git a/trunk/src/utest/srs_utest_protocol.hpp b/trunk/src/utest/srs_utest_protocol.hpp index 5b3a0b080..6b66826f5 100644 --- a/trunk/src/utest/srs_utest_protocol.hpp +++ b/trunk/src/utest/srs_utest_protocol.hpp @@ -86,6 +86,8 @@ public: public: MockBufferIO(); virtual ~MockBufferIO(); +public: + virtual MockBufferIO* append(std::string data); // for protocol public: virtual bool is_never_timeout(int64_t tm);