Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(138)

Side by Side Diff: net/http/http_network_transaction_unittest.cc

Issue 197283012: Retry requests on reused sockets that receive ERR_EMPTY_RESPONSE. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 27 matching lines...) Expand all
38 #include "net/http/http_auth_challenge_tokenizer.h" 38 #include "net/http/http_auth_challenge_tokenizer.h"
39 #include "net/http/http_auth_handler_digest.h" 39 #include "net/http/http_auth_handler_digest.h"
40 #include "net/http/http_auth_handler_mock.h" 40 #include "net/http/http_auth_handler_mock.h"
41 #include "net/http/http_auth_handler_ntlm.h" 41 #include "net/http/http_auth_handler_ntlm.h"
42 #include "net/http/http_basic_stream.h" 42 #include "net/http/http_basic_stream.h"
43 #include "net/http/http_network_session.h" 43 #include "net/http/http_network_session.h"
44 #include "net/http/http_network_session_peer.h" 44 #include "net/http/http_network_session_peer.h"
45 #include "net/http/http_server_properties_impl.h" 45 #include "net/http/http_server_properties_impl.h"
46 #include "net/http/http_stream.h" 46 #include "net/http/http_stream.h"
47 #include "net/http/http_stream_factory.h" 47 #include "net/http/http_stream_factory.h"
48 #include "net/http/http_stream_factory_test_util.h"
48 #include "net/http/http_transaction_unittest.h" 49 #include "net/http/http_transaction_unittest.h"
49 #include "net/proxy/proxy_config_service_fixed.h" 50 #include "net/proxy/proxy_config_service_fixed.h"
50 #include "net/proxy/proxy_info.h" 51 #include "net/proxy/proxy_info.h"
51 #include "net/proxy/proxy_resolver.h" 52 #include "net/proxy/proxy_resolver.h"
52 #include "net/proxy/proxy_service.h" 53 #include "net/proxy/proxy_service.h"
53 #include "net/socket/client_socket_factory.h" 54 #include "net/socket/client_socket_factory.h"
54 #include "net/socket/client_socket_pool_manager.h" 55 #include "net/socket/client_socket_pool_manager.h"
55 #include "net/socket/mock_client_socket_pool_manager.h" 56 #include "net/socket/mock_client_socket_pool_manager.h"
56 #include "net/socket/next_proto.h" 57 #include "net/socket/next_proto.h"
57 #include "net/socket/socket_test_util.h" 58 #include "net/socket/socket_test_util.h"
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
276 "\r\n\r\n"; 277 "\r\n\r\n";
277 } 278 }
278 279
279 // Either |write_failure| specifies a write failure or |read_failure| 280 // Either |write_failure| specifies a write failure or |read_failure|
280 // specifies a read failure when using a reused socket. In either case, the 281 // specifies a read failure when using a reused socket. In either case, the
281 // failure should cause the network transaction to resend the request, and the 282 // failure should cause the network transaction to resend the request, and the
282 // other argument should be NULL. 283 // other argument should be NULL.
283 void KeepAliveConnectionResendRequestTest(const MockWrite* write_failure, 284 void KeepAliveConnectionResendRequestTest(const MockWrite* write_failure,
284 const MockRead* read_failure); 285 const MockRead* read_failure);
285 286
287 // Either |write_failure| specifies a write failure or |read_failure|
288 // specifies a read failure when using a reused socket. In either case, the
289 // failure should cause the network transaction to resend the request, and the
290 // other argument should be NULL.
291 void PreconnectMissResendRequestTest(const MockWrite* write_failure,
292 const MockRead* read_failure);
293
286 SimpleGetHelperResult SimpleGetHelperForData(StaticSocketDataProvider* data[], 294 SimpleGetHelperResult SimpleGetHelperForData(StaticSocketDataProvider* data[],
287 size_t data_count) { 295 size_t data_count) {
288 SimpleGetHelperResult out; 296 SimpleGetHelperResult out;
289 297
290 HttpRequestInfo request; 298 HttpRequestInfo request;
291 request.method = "GET"; 299 request.method = "GET";
292 request.url = GURL("http://www.google.com/"); 300 request.url = GURL("http://www.google.com/");
293 request.load_flags = 0; 301 request.load_flags = 0;
294 302
295 CapturingBoundNetLog log; 303 CapturingBoundNetLog log;
(...skipping 995 matching lines...) Expand 10 before | Expand all | Expand 10 after
1291 EXPECT_TRUE(response->headers.get() != NULL); 1299 EXPECT_TRUE(response->headers.get() != NULL);
1292 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); 1300 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
1293 1301
1294 std::string response_data; 1302 std::string response_data;
1295 rv = ReadTransaction(trans.get(), &response_data); 1303 rv = ReadTransaction(trans.get(), &response_data);
1296 EXPECT_EQ(OK, rv); 1304 EXPECT_EQ(OK, rv);
1297 EXPECT_EQ(kExpectedResponseData[i], response_data); 1305 EXPECT_EQ(kExpectedResponseData[i], response_data);
1298 } 1306 }
1299 } 1307 }
1300 1308
1309 void HttpNetworkTransactionTest::PreconnectMissResendRequestTest(
mmenke 2014/03/14 16:38:06 Not sure if "PreconnectMiss" is quite the right na
davidben 2014/03/14 18:35:03 Done.
1310 const MockWrite* write_failure,
1311 const MockRead* read_failure) {
1312 HttpRequestInfo request;
1313 request.method = "GET";
1314 request.url = GURL("http://www.foo.com/");
1315 request.load_flags = 0;
1316
1317 CapturingNetLog net_log;
1318 session_deps_.net_log = &net_log;
1319 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_));
1320
1321 // Swap out the HttpStreamFactory.
1322 HttpNetworkSessionPeer peer(session.get());
1323 MockHttpStreamFactoryImplForPreconnect* mock_factory =
1324 new MockHttpStreamFactoryImplForPreconnect(session.get(), false);
1325 peer.SetHttpStreamFactory(scoped_ptr<HttpStreamFactory>(mock_factory));
1326
1327 // Written data for successfully sending a request.
1328 MockWrite data1_writes[] = {
1329 MockWrite("GET / HTTP/1.1\r\n"
1330 "Host: www.foo.com\r\n"
1331 "Connection: keep-alive\r\n\r\n"),
1332 };
1333
1334 // Read results for the first request.
1335 MockRead data1_reads[] = {
1336 MockRead(ASYNC, OK),
1337 };
1338
1339 if (write_failure) {
1340 ASSERT_TRUE(!read_failure);
mmenke 2014/03/14 16:38:06 Hrm...ASSERT_FALSE? Guess this was just copied fr
davidben 2014/03/14 18:35:03 Eh. Flipped both of them.
1341 data1_writes[0] = *write_failure;
1342 } else {
1343 ASSERT_TRUE(read_failure);
1344 data1_reads[0] = *read_failure;
1345 }
1346
1347 StaticSocketDataProvider data1(data1_reads, arraysize(data1_reads),
1348 data1_writes, arraysize(data1_writes));
1349 session_deps_.socket_factory->AddSocketDataProvider(&data1);
1350
1351 MockRead data2_reads[] = {
1352 MockRead("HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\n"),
1353 MockRead("hello"),
1354 MockRead(ASYNC, OK),
1355 };
1356 StaticSocketDataProvider data2(data2_reads, arraysize(data2_reads), NULL, 0);
1357 session_deps_.socket_factory->AddSocketDataProvider(&data2);
1358
1359 // Preconnect a socket.
1360 net::SSLConfig ssl_config;
1361 session->ssl_config_service()->GetSSLConfig(&ssl_config);
1362 if (session->http_stream_factory()->has_next_protos())
1363 ssl_config.next_protos = session->http_stream_factory()->next_protos();
1364 session->http_stream_factory()->PreconnectStreams(
1365 1, request, DEFAULT_PRIORITY, ssl_config, ssl_config);
1366 mock_factory->WaitForPreconnects();
1367 EXPECT_EQ(1, GetIdleSocketCountInTransportSocketPool(session.get()));
1368
1369 // Make the request.
1370 TestCompletionCallback callback;
1371
1372 scoped_ptr<HttpTransaction> trans(
1373 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get()));
1374
1375 int rv = trans->Start(&request, callback.callback(), BoundNetLog());
1376 EXPECT_EQ(ERR_IO_PENDING, rv);
1377
1378 rv = callback.WaitForResult();
1379 EXPECT_EQ(OK, rv);
1380
1381 LoadTimingInfo load_timing_info;
1382 EXPECT_TRUE(trans->GetLoadTimingInfo(&load_timing_info));
1383 TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES);
1384
1385 const HttpResponseInfo* response = trans->GetResponseInfo();
1386 ASSERT_TRUE(response != NULL);
1387
1388 EXPECT_TRUE(response->headers.get() != NULL);
1389 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
1390
1391 std::string response_data;
1392 rv = ReadTransaction(trans.get(), &response_data);
1393 EXPECT_EQ(OK, rv);
1394 EXPECT_EQ("hello", response_data);
1395 }
1396
1301 TEST_P(HttpNetworkTransactionTest, 1397 TEST_P(HttpNetworkTransactionTest,
1302 KeepAliveConnectionNotConnectedOnWrite) { 1398 KeepAliveConnectionNotConnectedOnWrite) {
1303 MockWrite write_failure(ASYNC, ERR_SOCKET_NOT_CONNECTED); 1399 MockWrite write_failure(ASYNC, ERR_SOCKET_NOT_CONNECTED);
1304 KeepAliveConnectionResendRequestTest(&write_failure, NULL); 1400 KeepAliveConnectionResendRequestTest(&write_failure, NULL);
1305 } 1401 }
1306 1402
1307 TEST_P(HttpNetworkTransactionTest, KeepAliveConnectionReset) { 1403 TEST_P(HttpNetworkTransactionTest, KeepAliveConnectionReset) {
1308 MockRead read_failure(ASYNC, ERR_CONNECTION_RESET); 1404 MockRead read_failure(ASYNC, ERR_CONNECTION_RESET);
1309 KeepAliveConnectionResendRequestTest(NULL, &read_failure); 1405 KeepAliveConnectionResendRequestTest(NULL, &read_failure);
1310 } 1406 }
1311 1407
1312 TEST_P(HttpNetworkTransactionTest, KeepAliveConnectionEOF) { 1408 TEST_P(HttpNetworkTransactionTest, KeepAliveConnectionEOF) {
1313 MockRead read_failure(SYNCHRONOUS, OK); // EOF 1409 MockRead read_failure(SYNCHRONOUS, OK); // EOF
1314 KeepAliveConnectionResendRequestTest(NULL, &read_failure); 1410 KeepAliveConnectionResendRequestTest(NULL, &read_failure);
1315 } 1411 }
1316 1412
1413 TEST_P(HttpNetworkTransactionTest,
1414 PreconnectMissNotConnectedOnWrite) {
1415 MockWrite write_failure(ASYNC, ERR_SOCKET_NOT_CONNECTED);
1416 PreconnectMissResendRequestTest(&write_failure, NULL);
1417 }
1418
1419 TEST_P(HttpNetworkTransactionTest, PreconnectMissReset) {
1420 MockRead read_failure(ASYNC, ERR_CONNECTION_RESET);
1421 PreconnectMissResendRequestTest(NULL, &read_failure);
1422 }
1423
1424 TEST_P(HttpNetworkTransactionTest, PreconnectMissEOF) {
1425 MockRead read_failure(SYNCHRONOUS, OK); // EOF
1426 PreconnectMissResendRequestTest(NULL, &read_failure);
1427 }
1428
1317 TEST_P(HttpNetworkTransactionTest, NonKeepAliveConnectionReset) { 1429 TEST_P(HttpNetworkTransactionTest, NonKeepAliveConnectionReset) {
1318 HttpRequestInfo request; 1430 HttpRequestInfo request;
1319 request.method = "GET"; 1431 request.method = "GET";
1320 request.url = GURL("http://www.google.com/"); 1432 request.url = GURL("http://www.google.com/");
1321 request.load_flags = 0; 1433 request.load_flags = 0;
1322 1434
1323 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); 1435 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_));
1324 scoped_ptr<HttpTransaction> trans( 1436 scoped_ptr<HttpTransaction> trans(
1325 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); 1437 new HttpNetworkTransaction(DEFAULT_PRIORITY, session));
1326 1438
(...skipping 11108 matching lines...) Expand 10 before | Expand all | Expand 10 after
12435 // established, to let the HTTP request start. 12547 // established, to let the HTTP request start.
12436 ASSERT_EQ(OK, http_callback.WaitForResult()); 12548 ASSERT_EQ(OK, http_callback.WaitForResult());
12437 std::string response_data; 12549 std::string response_data;
12438 ASSERT_EQ(OK, ReadTransaction(http_trans.get(), &response_data)); 12550 ASSERT_EQ(OK, ReadTransaction(http_trans.get(), &response_data));
12439 EXPECT_EQ("falafel", response_data); 12551 EXPECT_EQ("falafel", response_data);
12440 12552
12441 EXPECT_EQ(1, GetIdleSocketCountInTransportSocketPool(session)); 12553 EXPECT_EQ(1, GetIdleSocketCountInTransportSocketPool(session));
12442 } 12554 }
12443 12555
12444 } // namespace net 12556 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698