Chromium Code Reviews| 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 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 397 | 397 |
| 398 INSTANTIATE_TEST_CASE_P( | 398 INSTANTIATE_TEST_CASE_P( |
| 399 NextProto, | 399 NextProto, |
| 400 HttpNetworkTransactionTest, | 400 HttpNetworkTransactionTest, |
| 401 testing::Values(kProtoDeprecatedSPDY2, | 401 testing::Values(kProtoDeprecatedSPDY2, |
| 402 kProtoSPDY3, kProtoSPDY31, kProtoSPDY4a2, | 402 kProtoSPDY3, kProtoSPDY31, kProtoSPDY4a2, |
| 403 kProtoHTTP2Draft04)); | 403 kProtoHTTP2Draft04)); |
| 404 | 404 |
| 405 namespace { | 405 namespace { |
| 406 | 406 |
| 407 class BeforeNetworkStartHandler { | |
| 408 public: | |
| 409 BeforeNetworkStartHandler(bool defer) | |
|
mmenke
2014/01/07 15:26:23
explicit
jkarlin
2014/01/07 16:19:32
Done.
| |
| 410 : defer_on_before_network_start_(defer), | |
| 411 observed_before_network_start_(false) {} | |
| 412 | |
| 413 void OnBeforeNetworkStart(bool* defer) { | |
| 414 *defer = defer_on_before_network_start_; | |
| 415 observed_before_network_start_ = true; | |
| 416 } | |
| 417 | |
| 418 bool observed_before_network_start() const { | |
| 419 return observed_before_network_start_; | |
| 420 } | |
| 421 | |
| 422 private: | |
| 423 bool defer_on_before_network_start_; | |
|
mmenke
2014/01/07 15:26:23
const?
jkarlin
2014/01/07 16:19:32
Done.
| |
| 424 bool observed_before_network_start_; | |
|
mmenke
2014/01/07 15:26:23
DISALLOW_COPY_AND_ASSIGN?
jkarlin
2014/01/07 16:19:32
Done.
| |
| 425 }; | |
| 426 | |
| 407 // Fill |str| with a long header list that consumes >= |size| bytes. | 427 // Fill |str| with a long header list that consumes >= |size| bytes. |
| 408 void FillLargeHeadersString(std::string* str, int size) { | 428 void FillLargeHeadersString(std::string* str, int size) { |
| 409 const char* row = | 429 const char* row = |
| 410 "SomeHeaderName: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n"; | 430 "SomeHeaderName: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n"; |
| 411 const int sizeof_row = strlen(row); | 431 const int sizeof_row = strlen(row); |
| 412 const int num_rows = static_cast<int>( | 432 const int num_rows = static_cast<int>( |
| 413 ceil(static_cast<float>(size) / sizeof_row)); | 433 ceil(static_cast<float>(size) / sizeof_row)); |
| 414 const int sizeof_data = num_rows * sizeof_row; | 434 const int sizeof_data = num_rows * sizeof_row; |
| 415 DCHECK(sizeof_data >= size); | 435 DCHECK(sizeof_data >= size); |
| 416 str->reserve(sizeof_data); | 436 str->reserve(sizeof_data); |
| (...skipping 919 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1336 MockRead(SYNCHRONOUS, OK), // EOF | 1356 MockRead(SYNCHRONOUS, OK), // EOF |
| 1337 MockRead("HTTP/1.0 200 OK\r\n\r\n"), // Should not be used | 1357 MockRead("HTTP/1.0 200 OK\r\n\r\n"), // Should not be used |
| 1338 MockRead("hello world"), | 1358 MockRead("hello world"), |
| 1339 MockRead(SYNCHRONOUS, OK), | 1359 MockRead(SYNCHRONOUS, OK), |
| 1340 }; | 1360 }; |
| 1341 SimpleGetHelperResult out = SimpleGetHelper(data_reads, | 1361 SimpleGetHelperResult out = SimpleGetHelper(data_reads, |
| 1342 arraysize(data_reads)); | 1362 arraysize(data_reads)); |
| 1343 EXPECT_EQ(ERR_EMPTY_RESPONSE, out.rv); | 1363 EXPECT_EQ(ERR_EMPTY_RESPONSE, out.rv); |
| 1344 } | 1364 } |
| 1345 | 1365 |
| 1366 // Test that network access can be deferred and resumed. | |
| 1367 TEST_P(HttpNetworkTransactionTest, ThrottleBeforeNetworkStart) { | |
| 1368 HttpRequestInfo request; | |
| 1369 request.method = "GET"; | |
| 1370 request.url = GURL("http://www.google.com/"); | |
| 1371 request.load_flags = 0; | |
| 1372 | |
| 1373 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | |
| 1374 scoped_ptr<HttpTransaction> trans( | |
| 1375 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | |
| 1376 | |
| 1377 // Defer on OnBeforeNetworkStart. | |
| 1378 BeforeNetworkStartHandler net_start_handler(true); // defer | |
| 1379 trans->SetBeforeNetworkStartCallback( | |
| 1380 base::Bind(&BeforeNetworkStartHandler::OnBeforeNetworkStart, | |
| 1381 base::Unretained(&net_start_handler))); | |
| 1382 | |
| 1383 MockRead data_reads[] = {MockRead("HTTP/1.0 200 OK\r\n"), | |
| 1384 MockRead("Connection: keep-alive\r\n"), | |
| 1385 MockRead("Content-Length: 100\r\n\r\n"), | |
| 1386 MockRead("hello"), | |
| 1387 MockRead(SYNCHRONOUS, 0), }; | |
| 1388 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); | |
| 1389 session_deps_.socket_factory->AddSocketDataProvider(&data); | |
| 1390 | |
| 1391 TestCompletionCallback callback; | |
| 1392 | |
| 1393 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | |
| 1394 EXPECT_EQ(ERR_IO_PENDING, rv); | |
| 1395 base::MessageLoop::current()->RunUntilIdle(); | |
| 1396 | |
| 1397 // Should have deferred for network start. | |
| 1398 EXPECT_TRUE(net_start_handler.observed_before_network_start()); | |
| 1399 EXPECT_EQ(LOAD_STATE_WAITING_FOR_DELEGATE, trans->GetLoadState()); | |
| 1400 EXPECT_TRUE(trans->GetResponseInfo() == NULL); | |
| 1401 | |
| 1402 trans->ResumeNetworkStart(); | |
| 1403 rv = callback.WaitForResult(); | |
| 1404 EXPECT_EQ(OK, rv); | |
| 1405 EXPECT_TRUE(trans->GetResponseInfo() != NULL); | |
| 1406 | |
| 1407 scoped_refptr<IOBufferWithSize> io_buf(new IOBufferWithSize(100)); | |
| 1408 rv = trans->Read(io_buf.get(), io_buf->size(), callback.callback()); | |
| 1409 if (rv == ERR_IO_PENDING) | |
| 1410 rv = callback.WaitForResult(); | |
| 1411 EXPECT_EQ(5, rv); | |
| 1412 rv = trans->Read(io_buf.get(), io_buf->size(), callback.callback()); | |
| 1413 EXPECT_EQ(ERR_CONTENT_LENGTH_MISMATCH, rv); | |
| 1414 | |
| 1415 trans.reset(); | |
| 1416 base::MessageLoop::current()->RunUntilIdle(); | |
| 1417 EXPECT_EQ(0, GetIdleSocketCountInTransportSocketPool(session.get())); | |
| 1418 } | |
| 1419 | |
| 1420 // Test that network use can be deferred and canceled. | |
| 1421 TEST_P(HttpNetworkTransactionTest, ThrottleAndCancelBeforeNetworkStart) { | |
| 1422 HttpRequestInfo request; | |
| 1423 request.method = "GET"; | |
| 1424 request.url = GURL("http://www.google.com/"); | |
| 1425 request.load_flags = 0; | |
| 1426 | |
| 1427 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | |
| 1428 scoped_ptr<HttpTransaction> trans( | |
| 1429 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | |
| 1430 | |
| 1431 // Defer on OnBeforeNetworkStart. | |
| 1432 BeforeNetworkStartHandler net_start_handler(true); // defer | |
| 1433 trans->SetBeforeNetworkStartCallback( | |
| 1434 base::Bind(&BeforeNetworkStartHandler::OnBeforeNetworkStart, | |
| 1435 base::Unretained(&net_start_handler))); | |
| 1436 | |
| 1437 MockRead data_reads[] = {MockRead("HTTP/1.0 200 OK\r\n"), | |
| 1438 MockRead("Connection: keep-alive\r\n"), | |
| 1439 MockRead("Content-Length: 100\r\n\r\n"), | |
| 1440 MockRead("hello"), | |
| 1441 MockRead(SYNCHRONOUS, 0), }; | |
| 1442 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); | |
| 1443 session_deps_.socket_factory->AddSocketDataProvider(&data); | |
| 1444 | |
| 1445 TestCompletionCallback callback; | |
| 1446 | |
| 1447 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | |
| 1448 EXPECT_EQ(ERR_IO_PENDING, rv); | |
| 1449 base::MessageLoop::current()->RunUntilIdle(); | |
| 1450 | |
| 1451 // Should have deferred for network start. | |
| 1452 EXPECT_TRUE(net_start_handler.observed_before_network_start()); | |
| 1453 EXPECT_EQ(LOAD_STATE_WAITING_FOR_DELEGATE, trans->GetLoadState()); | |
| 1454 EXPECT_TRUE(trans->GetResponseInfo() == NULL); | |
| 1455 | |
| 1456 trans.reset(); // Cancel the transaction here. | |
| 1457 base::MessageLoop::current()->RunUntilIdle(); | |
|
mmenke
2014/01/07 15:26:23
Are these needed? TearDown() already does its fai
jkarlin
2014/01/07 16:19:32
Fair enough. Removed.
| |
| 1458 } | |
| 1459 | |
| 1346 // Next 2 cases (KeepAliveEarlyClose and KeepAliveEarlyClose2) are regression | 1460 // Next 2 cases (KeepAliveEarlyClose and KeepAliveEarlyClose2) are regression |
| 1347 // tests. There was a bug causing HttpNetworkTransaction to hang in the | 1461 // tests. There was a bug causing HttpNetworkTransaction to hang in the |
| 1348 // destructor in such situations. | 1462 // destructor in such situations. |
| 1349 // See http://crbug.com/154712 and http://crbug.com/156609. | 1463 // See http://crbug.com/154712 and http://crbug.com/156609. |
| 1350 TEST_P(HttpNetworkTransactionTest, KeepAliveEarlyClose) { | 1464 TEST_P(HttpNetworkTransactionTest, KeepAliveEarlyClose) { |
| 1351 HttpRequestInfo request; | 1465 HttpRequestInfo request; |
| 1352 request.method = "GET"; | 1466 request.method = "GET"; |
| 1353 request.url = GURL("http://www.google.com/"); | 1467 request.url = GURL("http://www.google.com/"); |
| 1354 request.load_flags = 0; | 1468 request.load_flags = 0; |
| 1355 | 1469 |
| (...skipping 10977 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 12333 // established, to let the HTTP request start. | 12447 // established, to let the HTTP request start. |
| 12334 ASSERT_EQ(OK, http_callback.WaitForResult()); | 12448 ASSERT_EQ(OK, http_callback.WaitForResult()); |
| 12335 std::string response_data; | 12449 std::string response_data; |
| 12336 ASSERT_EQ(OK, ReadTransaction(http_trans.get(), &response_data)); | 12450 ASSERT_EQ(OK, ReadTransaction(http_trans.get(), &response_data)); |
| 12337 EXPECT_EQ("falafel", response_data); | 12451 EXPECT_EQ("falafel", response_data); |
| 12338 | 12452 |
| 12339 EXPECT_EQ(1, GetIdleSocketCountInTransportSocketPool(session)); | 12453 EXPECT_EQ(1, GetIdleSocketCountInTransportSocketPool(session)); |
| 12340 } | 12454 } |
| 12341 | 12455 |
| 12342 } // namespace net | 12456 } // namespace net |
| OLD | NEW |