| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/test/embedded_test_server/http_request.h" | 5 #include "net/test/embedded_test_server/http_request.h" |
| 6 | 6 |
| 7 #include "base/memory/scoped_ptr.h" | 7 #include <memory> |
| 8 |
| 8 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
| 9 | 10 |
| 10 namespace net { | 11 namespace net { |
| 11 namespace test_server { | 12 namespace test_server { |
| 12 | 13 |
| 13 TEST(HttpRequestTest, ParseRequest) { | 14 TEST(HttpRequestTest, ParseRequest) { |
| 14 HttpRequestParser parser; | 15 HttpRequestParser parser; |
| 15 | 16 |
| 16 // Process request in chunks to check if the parser deals with border cases. | 17 // Process request in chunks to check if the parser deals with border cases. |
| 17 // Also, check multi-line headers as well as multiple requests in the same | 18 // Also, check multi-line headers as well as multiple requests in the same |
| 18 // chunk. This basically should cover all the simplest border cases. | 19 // chunk. This basically should cover all the simplest border cases. |
| 19 parser.ProcessChunk("POST /foobar.html HTTP/1.1\r\n"); | 20 parser.ProcessChunk("POST /foobar.html HTTP/1.1\r\n"); |
| 20 EXPECT_EQ(HttpRequestParser::WAITING, parser.ParseRequest()); | 21 EXPECT_EQ(HttpRequestParser::WAITING, parser.ParseRequest()); |
| 21 parser.ProcessChunk("Host: localhost:1234\r\n"); | 22 parser.ProcessChunk("Host: localhost:1234\r\n"); |
| 22 EXPECT_EQ(HttpRequestParser::WAITING, parser.ParseRequest()); | 23 EXPECT_EQ(HttpRequestParser::WAITING, parser.ParseRequest()); |
| 23 parser.ProcessChunk("Multi-line-header: abcd\r\n"); | 24 parser.ProcessChunk("Multi-line-header: abcd\r\n"); |
| 24 EXPECT_EQ(HttpRequestParser::WAITING, parser.ParseRequest()); | 25 EXPECT_EQ(HttpRequestParser::WAITING, parser.ParseRequest()); |
| 25 parser.ProcessChunk(" efgh\r\n"); | 26 parser.ProcessChunk(" efgh\r\n"); |
| 26 EXPECT_EQ(HttpRequestParser::WAITING, parser.ParseRequest()); | 27 EXPECT_EQ(HttpRequestParser::WAITING, parser.ParseRequest()); |
| 27 parser.ProcessChunk(" ijkl\r\n"); | 28 parser.ProcessChunk(" ijkl\r\n"); |
| 28 EXPECT_EQ(HttpRequestParser::WAITING, parser.ParseRequest()); | 29 EXPECT_EQ(HttpRequestParser::WAITING, parser.ParseRequest()); |
| 29 parser.ProcessChunk("Content-Length: 10\r\n\r\n"); | 30 parser.ProcessChunk("Content-Length: 10\r\n\r\n"); |
| 30 EXPECT_EQ(HttpRequestParser::WAITING, parser.ParseRequest()); | 31 EXPECT_EQ(HttpRequestParser::WAITING, parser.ParseRequest()); |
| 31 // Content data and another request in the same chunk (possible in http/1.1). | 32 // Content data and another request in the same chunk (possible in http/1.1). |
| 32 parser.ProcessChunk("1234567890GET /another.html HTTP/1.1\r\n\r\n"); | 33 parser.ProcessChunk("1234567890GET /another.html HTTP/1.1\r\n\r\n"); |
| 33 ASSERT_EQ(HttpRequestParser::ACCEPTED, parser.ParseRequest()); | 34 ASSERT_EQ(HttpRequestParser::ACCEPTED, parser.ParseRequest()); |
| 34 | 35 |
| 35 // Fetch the first request and validate it. | 36 // Fetch the first request and validate it. |
| 36 { | 37 { |
| 37 scoped_ptr<HttpRequest> request = parser.GetRequest(); | 38 std::unique_ptr<HttpRequest> request = parser.GetRequest(); |
| 38 EXPECT_EQ("/foobar.html", request->relative_url); | 39 EXPECT_EQ("/foobar.html", request->relative_url); |
| 39 EXPECT_EQ("POST", request->method_string); | 40 EXPECT_EQ("POST", request->method_string); |
| 40 EXPECT_EQ(METHOD_POST, request->method); | 41 EXPECT_EQ(METHOD_POST, request->method); |
| 41 EXPECT_EQ("1234567890", request->content); | 42 EXPECT_EQ("1234567890", request->content); |
| 42 ASSERT_EQ(3u, request->headers.size()); | 43 ASSERT_EQ(3u, request->headers.size()); |
| 43 | 44 |
| 44 EXPECT_EQ(1u, request->headers.count("Host")); | 45 EXPECT_EQ(1u, request->headers.count("Host")); |
| 45 EXPECT_EQ(1u, request->headers.count("Multi-line-header")); | 46 EXPECT_EQ(1u, request->headers.count("Multi-line-header")); |
| 46 EXPECT_EQ(1u, request->headers.count("Content-Length")); | 47 EXPECT_EQ(1u, request->headers.count("Content-Length")); |
| 47 | 48 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 63 EXPECT_EQ(HttpRequestParser::WAITING, parser.ParseRequest()); | 64 EXPECT_EQ(HttpRequestParser::WAITING, parser.ParseRequest()); |
| 64 } | 65 } |
| 65 | 66 |
| 66 TEST(HttpRequestTest, ParseRequestWithEmptyBody) { | 67 TEST(HttpRequestTest, ParseRequestWithEmptyBody) { |
| 67 HttpRequestParser parser; | 68 HttpRequestParser parser; |
| 68 | 69 |
| 69 parser.ProcessChunk("POST /foobar.html HTTP/1.1\r\n"); | 70 parser.ProcessChunk("POST /foobar.html HTTP/1.1\r\n"); |
| 70 parser.ProcessChunk("Content-Length: 0\r\n\r\n"); | 71 parser.ProcessChunk("Content-Length: 0\r\n\r\n"); |
| 71 ASSERT_EQ(HttpRequestParser::ACCEPTED, parser.ParseRequest()); | 72 ASSERT_EQ(HttpRequestParser::ACCEPTED, parser.ParseRequest()); |
| 72 | 73 |
| 73 scoped_ptr<HttpRequest> request = parser.GetRequest(); | 74 std::unique_ptr<HttpRequest> request = parser.GetRequest(); |
| 74 EXPECT_EQ("", request->content); | 75 EXPECT_EQ("", request->content); |
| 75 EXPECT_TRUE(request->has_content); | 76 EXPECT_TRUE(request->has_content); |
| 76 EXPECT_EQ(1u, request->headers.count("Content-Length")); | 77 EXPECT_EQ(1u, request->headers.count("Content-Length")); |
| 77 EXPECT_EQ("0", request->headers["Content-Length"]); | 78 EXPECT_EQ("0", request->headers["Content-Length"]); |
| 78 } | 79 } |
| 79 | 80 |
| 80 TEST(HttpRequestTest, ParseRequestWithChunkedBody) { | 81 TEST(HttpRequestTest, ParseRequestWithChunkedBody) { |
| 81 HttpRequestParser parser; | 82 HttpRequestParser parser; |
| 82 | 83 |
| 83 parser.ProcessChunk("POST /foobar.html HTTP/1.1\r\n"); | 84 parser.ProcessChunk("POST /foobar.html HTTP/1.1\r\n"); |
| 84 parser.ProcessChunk("Transfer-Encoding: chunked\r\n\r\n"); | 85 parser.ProcessChunk("Transfer-Encoding: chunked\r\n\r\n"); |
| 85 parser.ProcessChunk("5\r\nhello\r\n"); | 86 parser.ProcessChunk("5\r\nhello\r\n"); |
| 86 parser.ProcessChunk("1\r\n \r\n"); | 87 parser.ProcessChunk("1\r\n \r\n"); |
| 87 parser.ProcessChunk("5\r\nworld\r\n"); | 88 parser.ProcessChunk("5\r\nworld\r\n"); |
| 88 parser.ProcessChunk("0\r\n\r\n"); | 89 parser.ProcessChunk("0\r\n\r\n"); |
| 89 ASSERT_EQ(HttpRequestParser::ACCEPTED, parser.ParseRequest()); | 90 ASSERT_EQ(HttpRequestParser::ACCEPTED, parser.ParseRequest()); |
| 90 | 91 |
| 91 scoped_ptr<HttpRequest> request = parser.GetRequest(); | 92 std::unique_ptr<HttpRequest> request = parser.GetRequest(); |
| 92 EXPECT_EQ("hello world", request->content); | 93 EXPECT_EQ("hello world", request->content); |
| 93 EXPECT_TRUE(request->has_content); | 94 EXPECT_TRUE(request->has_content); |
| 94 EXPECT_EQ(1u, request->headers.count("Transfer-Encoding")); | 95 EXPECT_EQ(1u, request->headers.count("Transfer-Encoding")); |
| 95 EXPECT_EQ("chunked", request->headers["Transfer-Encoding"]); | 96 EXPECT_EQ("chunked", request->headers["Transfer-Encoding"]); |
| 96 } | 97 } |
| 97 | 98 |
| 98 TEST(HttpRequestTest, ParseRequestWithChunkedBodySlow) { | 99 TEST(HttpRequestTest, ParseRequestWithChunkedBodySlow) { |
| 99 HttpRequestParser parser; | 100 HttpRequestParser parser; |
| 100 | 101 |
| 101 parser.ProcessChunk("POST /foobar.html HTTP/1.1\r\n"); | 102 parser.ProcessChunk("POST /foobar.html HTTP/1.1\r\n"); |
| 102 parser.ProcessChunk("Transfer-Encoding: chunked\r\n\r\n"); | 103 parser.ProcessChunk("Transfer-Encoding: chunked\r\n\r\n"); |
| 103 std::string chunked_body = "5\r\nhello\r\n0\r\n\r\n"; | 104 std::string chunked_body = "5\r\nhello\r\n0\r\n\r\n"; |
| 104 | 105 |
| 105 // Send one character at a time, and make the parser parse the request. | 106 // Send one character at a time, and make the parser parse the request. |
| 106 for (size_t i = 0; i < chunked_body.size(); i++) { | 107 for (size_t i = 0; i < chunked_body.size(); i++) { |
| 107 parser.ProcessChunk(chunked_body.substr(i, 1)); | 108 parser.ProcessChunk(chunked_body.substr(i, 1)); |
| 108 // Except for the last pass, ParseRequest() should give WAITING. | 109 // Except for the last pass, ParseRequest() should give WAITING. |
| 109 if (i != chunked_body.size() - 1) { | 110 if (i != chunked_body.size() - 1) { |
| 110 ASSERT_EQ(HttpRequestParser::WAITING, parser.ParseRequest()); | 111 ASSERT_EQ(HttpRequestParser::WAITING, parser.ParseRequest()); |
| 111 } | 112 } |
| 112 } | 113 } |
| 113 // All chunked data has been sent, the last ParseRequest should give ACCEPTED. | 114 // All chunked data has been sent, the last ParseRequest should give ACCEPTED. |
| 114 ASSERT_EQ(HttpRequestParser::ACCEPTED, parser.ParseRequest()); | 115 ASSERT_EQ(HttpRequestParser::ACCEPTED, parser.ParseRequest()); |
| 115 scoped_ptr<HttpRequest> request = parser.GetRequest(); | 116 std::unique_ptr<HttpRequest> request = parser.GetRequest(); |
| 116 EXPECT_EQ("hello", request->content); | 117 EXPECT_EQ("hello", request->content); |
| 117 EXPECT_TRUE(request->has_content); | 118 EXPECT_TRUE(request->has_content); |
| 118 EXPECT_EQ(1u, request->headers.count("Transfer-Encoding")); | 119 EXPECT_EQ(1u, request->headers.count("Transfer-Encoding")); |
| 119 EXPECT_EQ("chunked", request->headers["Transfer-Encoding"]); | 120 EXPECT_EQ("chunked", request->headers["Transfer-Encoding"]); |
| 120 } | 121 } |
| 121 | 122 |
| 122 TEST(HttpRequestTest, ParseRequestWithoutBody) { | 123 TEST(HttpRequestTest, ParseRequestWithoutBody) { |
| 123 HttpRequestParser parser; | 124 HttpRequestParser parser; |
| 124 | 125 |
| 125 parser.ProcessChunk("POST /foobar.html HTTP/1.1\r\n\r\n"); | 126 parser.ProcessChunk("POST /foobar.html HTTP/1.1\r\n\r\n"); |
| 126 ASSERT_EQ(HttpRequestParser::ACCEPTED, parser.ParseRequest()); | 127 ASSERT_EQ(HttpRequestParser::ACCEPTED, parser.ParseRequest()); |
| 127 | 128 |
| 128 scoped_ptr<HttpRequest> request = parser.GetRequest(); | 129 std::unique_ptr<HttpRequest> request = parser.GetRequest(); |
| 129 EXPECT_EQ("", request->content); | 130 EXPECT_EQ("", request->content); |
| 130 EXPECT_FALSE(request->has_content); | 131 EXPECT_FALSE(request->has_content); |
| 131 } | 132 } |
| 132 | 133 |
| 133 TEST(HttpRequestTest, ParseGet) { | 134 TEST(HttpRequestTest, ParseGet) { |
| 134 HttpRequestParser parser; | 135 HttpRequestParser parser; |
| 135 | 136 |
| 136 parser.ProcessChunk("GET /foobar.html HTTP/1.1\r\n\r\n"); | 137 parser.ProcessChunk("GET /foobar.html HTTP/1.1\r\n\r\n"); |
| 137 ASSERT_EQ(HttpRequestParser::ACCEPTED, parser.ParseRequest()); | 138 ASSERT_EQ(HttpRequestParser::ACCEPTED, parser.ParseRequest()); |
| 138 | 139 |
| 139 scoped_ptr<HttpRequest> request = parser.GetRequest(); | 140 std::unique_ptr<HttpRequest> request = parser.GetRequest(); |
| 140 EXPECT_EQ("/foobar.html", request->relative_url); | 141 EXPECT_EQ("/foobar.html", request->relative_url); |
| 141 EXPECT_EQ("GET", request->method_string); | 142 EXPECT_EQ("GET", request->method_string); |
| 142 EXPECT_EQ(METHOD_GET, request->method); | 143 EXPECT_EQ(METHOD_GET, request->method); |
| 143 EXPECT_EQ("", request->content); | 144 EXPECT_EQ("", request->content); |
| 144 EXPECT_FALSE(request->has_content); | 145 EXPECT_FALSE(request->has_content); |
| 145 } | 146 } |
| 146 | 147 |
| 147 } // namespace test_server | 148 } // namespace test_server |
| 148 } // namespace net | 149 } // namespace net |
| OLD | NEW |