| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/http/http_network_transaction.h" | 5 #include "net/http/http_network_transaction.h" |
| 6 | 6 |
| 7 #include <math.h> // ceil | 7 #include <math.h> // ceil |
| 8 #include <stdarg.h> | 8 #include <stdarg.h> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 1200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1211 EXPECT_TRUE(response->headers.get() != NULL); | 1211 EXPECT_TRUE(response->headers.get() != NULL); |
| 1212 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); | 1212 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
| 1213 | 1213 |
| 1214 std::string response_data; | 1214 std::string response_data; |
| 1215 rv = ReadTransaction(trans.get(), &response_data); | 1215 rv = ReadTransaction(trans.get(), &response_data); |
| 1216 EXPECT_EQ(OK, rv); | 1216 EXPECT_EQ(OK, rv); |
| 1217 EXPECT_EQ("hello world", response_data); | 1217 EXPECT_EQ("hello world", response_data); |
| 1218 } | 1218 } |
| 1219 | 1219 |
| 1220 TEST_P(HttpNetworkTransactionTest, Incomplete100ThenEOF) { | 1220 TEST_P(HttpNetworkTransactionTest, Incomplete100ThenEOF) { |
| 1221 struct TestCase { | 1221 HttpRequestInfo request; |
| 1222 const char* response; | 1222 request.method = "POST"; |
| 1223 net::Error expected_error_code; | 1223 request.url = GURL("http://www.foo.com/"); |
| 1224 request.load_flags = 0; |
| 1225 |
| 1226 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
| 1227 scoped_ptr<HttpTransaction> trans( |
| 1228 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
| 1229 |
| 1230 MockRead data_reads[] = { |
| 1231 MockRead(SYNCHRONOUS, "HTTP/1.0 100 Continue\r\n"), |
| 1232 MockRead(ASYNC, 0), |
| 1224 }; | 1233 }; |
| 1225 const TestCase kTestCases[] = { | 1234 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); |
| 1226 {"HTTP/1.0 100 Continue\r\n", net::ERR_RESPONSE_HEADERS_TRUNCATED}, | 1235 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 1227 {"HTTP/1.0 100 Continue\r\n\r\n", net::ERR_EMPTY_RESPONSE}, | |
| 1228 }; | |
| 1229 | 1236 |
| 1230 for (const TestCase& test_case : kTestCases) { | 1237 TestCompletionCallback callback; |
| 1231 SCOPED_TRACE(test_case.response); | |
| 1232 | 1238 |
| 1233 HttpRequestInfo request; | 1239 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
| 1234 request.method = "POST"; | 1240 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 1235 request.url = GURL("http://www.foo.com/"); | |
| 1236 request.load_flags = 0; | |
| 1237 | 1241 |
| 1238 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 1242 rv = callback.WaitForResult(); |
| 1239 scoped_ptr<HttpTransaction> trans( | 1243 EXPECT_EQ(OK, rv); |
| 1240 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | |
| 1241 | 1244 |
| 1242 MockRead data_reads[] = { | 1245 std::string response_data; |
| 1243 MockRead(SYNCHRONOUS, test_case.response), MockRead(ASYNC, 0), | 1246 rv = ReadTransaction(trans.get(), &response_data); |
| 1244 }; | 1247 EXPECT_EQ(OK, rv); |
| 1245 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); | 1248 EXPECT_EQ("", response_data); |
| 1246 session_deps_.socket_factory->AddSocketDataProvider(&data); | |
| 1247 | |
| 1248 TestCompletionCallback callback; | |
| 1249 | |
| 1250 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | |
| 1251 EXPECT_EQ(ERR_IO_PENDING, rv); | |
| 1252 | |
| 1253 rv = callback.WaitForResult(); | |
| 1254 EXPECT_EQ(test_case.expected_error_code, rv); | |
| 1255 } | |
| 1256 } | 1249 } |
| 1257 | 1250 |
| 1258 TEST_P(HttpNetworkTransactionTest, EmptyResponse) { | 1251 TEST_P(HttpNetworkTransactionTest, EmptyResponse) { |
| 1259 HttpRequestInfo request; | 1252 HttpRequestInfo request; |
| 1260 request.method = "POST"; | 1253 request.method = "POST"; |
| 1261 request.url = GURL("http://www.foo.com/"); | 1254 request.url = GURL("http://www.foo.com/"); |
| 1262 request.load_flags = 0; | 1255 request.load_flags = 0; |
| 1263 | 1256 |
| 1264 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 1257 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
| 1265 scoped_ptr<HttpTransaction> trans( | 1258 scoped_ptr<HttpTransaction> trans( |
| (...skipping 4856 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6122 "Host: www.example.org\r\n" | 6115 "Host: www.example.org\r\n" |
| 6123 "Connection: keep-alive\r\n" | 6116 "Connection: keep-alive\r\n" |
| 6124 "Authorization: Digest username=\"foo\", realm=\"digestive\", " | 6117 "Authorization: Digest username=\"foo\", realm=\"digestive\", " |
| 6125 "nonce=\"OU812\", uri=\"/x/y/z\", algorithm=MD5, " | 6118 "nonce=\"OU812\", uri=\"/x/y/z\", algorithm=MD5, " |
| 6126 "response=\"03ffbcd30add722589c1de345d7a927f\", qop=auth, " | 6119 "response=\"03ffbcd30add722589c1de345d7a927f\", qop=auth, " |
| 6127 "nc=00000001, cnonce=\"0123456789abcdef\"\r\n\r\n"), | 6120 "nc=00000001, cnonce=\"0123456789abcdef\"\r\n\r\n"), |
| 6128 }; | 6121 }; |
| 6129 | 6122 |
| 6130 // Sever accepts the authorization. | 6123 // Sever accepts the authorization. |
| 6131 MockRead data_reads2[] = { | 6124 MockRead data_reads2[] = { |
| 6132 MockRead("HTTP/1.0 200 OK\r\n\r\n"), MockRead(SYNCHRONOUS, OK), | 6125 MockRead("HTTP/1.0 200 OK\r\n"), |
| 6126 MockRead(SYNCHRONOUS, OK), |
| 6133 }; | 6127 }; |
| 6134 | 6128 |
| 6135 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 6129 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), |
| 6136 data_writes1, arraysize(data_writes1)); | 6130 data_writes1, arraysize(data_writes1)); |
| 6137 StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2), | 6131 StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2), |
| 6138 data_writes2, arraysize(data_writes2)); | 6132 data_writes2, arraysize(data_writes2)); |
| 6139 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 6133 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
| 6140 session_deps_.socket_factory->AddSocketDataProvider(&data2); | 6134 session_deps_.socket_factory->AddSocketDataProvider(&data2); |
| 6141 | 6135 |
| 6142 TestCompletionCallback callback1; | 6136 TestCompletionCallback callback1; |
| (...skipping 2081 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8224 scoped_ptr<HttpTransaction> trans( | 8218 scoped_ptr<HttpTransaction> trans( |
| 8225 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 8219 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
| 8226 | 8220 |
| 8227 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 8221 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
| 8228 EXPECT_EQ(ERR_IO_PENDING, rv); | 8222 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 8229 | 8223 |
| 8230 rv = callback.WaitForResult(); | 8224 rv = callback.WaitForResult(); |
| 8231 EXPECT_EQ(ERR_CONNECTION_RESET, rv); | 8225 EXPECT_EQ(ERR_CONNECTION_RESET, rv); |
| 8232 } | 8226 } |
| 8233 | 8227 |
| 8234 // Integration test for when truncated headers are received. | 8228 // Check that a connection closed after the start of the headers finishes ok. |
| 8235 TEST_P(HttpNetworkTransactionTest, TruncatedHeaders) { | 8229 TEST_P(HttpNetworkTransactionTest, ConnectionClosedAfterStartOfHeaders) { |
| 8236 HttpRequestInfo request; | 8230 HttpRequestInfo request; |
| 8237 request.method = "GET"; | 8231 request.method = "GET"; |
| 8238 request.url = GURL("http://www.foo.com/"); | 8232 request.url = GURL("http://www.foo.com/"); |
| 8239 request.load_flags = 0; | 8233 request.load_flags = 0; |
| 8240 | 8234 |
| 8241 MockRead data_reads[] = { | 8235 MockRead data_reads[] = { |
| 8242 MockRead("HTTP/1."), | 8236 MockRead("HTTP/1."), |
| 8243 MockRead(SYNCHRONOUS, OK), | 8237 MockRead(SYNCHRONOUS, OK), |
| 8244 }; | 8238 }; |
| 8245 | 8239 |
| 8246 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); | 8240 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); |
| 8247 session_deps_.socket_factory->AddSocketDataProvider(&data); | 8241 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 8248 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 8242 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
| 8249 | 8243 |
| 8250 TestCompletionCallback callback; | 8244 TestCompletionCallback callback; |
| 8251 | 8245 |
| 8252 scoped_ptr<HttpTransaction> trans( | 8246 scoped_ptr<HttpTransaction> trans( |
| 8253 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 8247 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
| 8254 | 8248 |
| 8255 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 8249 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
| 8256 EXPECT_EQ(ERR_IO_PENDING, rv); | 8250 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 8257 | 8251 |
| 8258 rv = callback.WaitForResult(); | 8252 rv = callback.WaitForResult(); |
| 8259 EXPECT_EQ(ERR_RESPONSE_HEADERS_TRUNCATED, rv); | 8253 EXPECT_EQ(OK, rv); |
| 8254 |
| 8255 const HttpResponseInfo* response = trans->GetResponseInfo(); |
| 8256 ASSERT_TRUE(response != NULL); |
| 8257 |
| 8258 EXPECT_TRUE(response->headers.get() != NULL); |
| 8259 EXPECT_EQ("HTTP/1.0 200 OK", response->headers->GetStatusLine()); |
| 8260 |
| 8261 std::string response_data; |
| 8262 rv = ReadTransaction(trans.get(), &response_data); |
| 8263 EXPECT_EQ(OK, rv); |
| 8264 EXPECT_EQ("", response_data); |
| 8260 } | 8265 } |
| 8261 | 8266 |
| 8262 // Make sure that a dropped connection while draining the body for auth | 8267 // Make sure that a dropped connection while draining the body for auth |
| 8263 // restart does the right thing. | 8268 // restart does the right thing. |
| 8264 TEST_P(HttpNetworkTransactionTest, DrainResetOK) { | 8269 TEST_P(HttpNetworkTransactionTest, DrainResetOK) { |
| 8265 HttpRequestInfo request; | 8270 HttpRequestInfo request; |
| 8266 request.method = "GET"; | 8271 request.method = "GET"; |
| 8267 request.url = GURL("http://www.example.org/"); | 8272 request.url = GURL("http://www.example.org/"); |
| 8268 request.load_flags = 0; | 8273 request.load_flags = 0; |
| 8269 | 8274 |
| (...skipping 5922 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14192 ASSERT_TRUE(response); | 14197 ASSERT_TRUE(response); |
| 14193 ASSERT_TRUE(response->headers.get()); | 14198 ASSERT_TRUE(response->headers.get()); |
| 14194 | 14199 |
| 14195 EXPECT_EQ(101, response->headers->response_code()); | 14200 EXPECT_EQ(101, response->headers->response_code()); |
| 14196 | 14201 |
| 14197 trans.reset(); | 14202 trans.reset(); |
| 14198 session->CloseAllConnections(); | 14203 session->CloseAllConnections(); |
| 14199 } | 14204 } |
| 14200 | 14205 |
| 14201 } // namespace net | 14206 } // namespace net |
| OLD | NEW |