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 <stdint.h> | 9 #include <stdint.h> |
| 10 | 10 |
| (...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 258 old_max_group_sockets_(ClientSocketPoolManager::max_sockets_per_group( | 258 old_max_group_sockets_(ClientSocketPoolManager::max_sockets_per_group( |
| 259 HttpNetworkSession::NORMAL_SOCKET_POOL)), | 259 HttpNetworkSession::NORMAL_SOCKET_POOL)), |
| 260 old_max_pool_sockets_(ClientSocketPoolManager::max_sockets_per_pool( | 260 old_max_pool_sockets_(ClientSocketPoolManager::max_sockets_per_pool( |
| 261 HttpNetworkSession::NORMAL_SOCKET_POOL)) { | 261 HttpNetworkSession::NORMAL_SOCKET_POOL)) { |
| 262 } | 262 } |
| 263 | 263 |
| 264 struct SimpleGetHelperResult { | 264 struct SimpleGetHelperResult { |
| 265 int rv; | 265 int rv; |
| 266 std::string status_line; | 266 std::string status_line; |
| 267 std::string response_data; | 267 std::string response_data; |
| 268 int64 totalReceivedBytes; | 268 int64_t total_received_bytes; |
| 269 int64_t total_sent_bytes; | |
| 269 LoadTimingInfo load_timing_info; | 270 LoadTimingInfo load_timing_info; |
| 270 ConnectionAttempts connection_attempts; | 271 ConnectionAttempts connection_attempts; |
| 271 }; | 272 }; |
| 272 | 273 |
| 273 void SetUp() override { | 274 void SetUp() override { |
| 274 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); | 275 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); |
| 275 base::MessageLoop::current()->RunUntilIdle(); | 276 base::MessageLoop::current()->RunUntilIdle(); |
| 276 } | 277 } |
| 277 | 278 |
| 278 void TearDown() override { | 279 void TearDown() override { |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 334 session_deps_.socket_factory->AddSocketDataProvider(data[i]); | 335 session_deps_.socket_factory->AddSocketDataProvider(data[i]); |
| 335 } | 336 } |
| 336 | 337 |
| 337 TestCompletionCallback callback; | 338 TestCompletionCallback callback; |
| 338 | 339 |
| 339 EXPECT_TRUE(log.bound().IsCapturing()); | 340 EXPECT_TRUE(log.bound().IsCapturing()); |
| 340 int rv = trans->Start(&request, callback.callback(), log.bound()); | 341 int rv = trans->Start(&request, callback.callback(), log.bound()); |
| 341 EXPECT_EQ(ERR_IO_PENDING, rv); | 342 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 342 | 343 |
| 343 out.rv = callback.WaitForResult(); | 344 out.rv = callback.WaitForResult(); |
| 345 out.total_sent_bytes = trans->GetTotalSentBytes(); | |
| 346 out.total_received_bytes = trans->GetTotalReceivedBytes(); | |
|
mmenke
2015/09/04 15:21:49
Nit: Received is before sent everywhere else (In
sclittle
2015/09/04 22:03:10
Done.
| |
| 344 | 347 |
| 345 // Even in the failure cases that use this function, connections are always | 348 // Even in the failure cases that use this function, connections are always |
| 346 // successfully established before the error. | 349 // successfully established before the error. |
| 347 EXPECT_TRUE(trans->GetLoadTimingInfo(&out.load_timing_info)); | 350 EXPECT_TRUE(trans->GetLoadTimingInfo(&out.load_timing_info)); |
| 348 TestLoadTimingNotReused(out.load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES); | 351 TestLoadTimingNotReused(out.load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES); |
| 349 | 352 |
| 350 if (out.rv != OK) | 353 if (out.rv != OK) |
| 351 return out; | 354 return out; |
| 352 | 355 |
| 353 const HttpResponseInfo* response = trans->GetResponseInfo(); | 356 const HttpResponseInfo* response = trans->GetResponseInfo(); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 385 EXPECT_TRUE(request_headers.GetHeader("Host", &value)); | 388 EXPECT_TRUE(request_headers.GetHeader("Host", &value)); |
| 386 EXPECT_EQ("www.example.org", value); | 389 EXPECT_EQ("www.example.org", value); |
| 387 EXPECT_TRUE(request_headers.GetHeader("Connection", &value)); | 390 EXPECT_TRUE(request_headers.GetHeader("Connection", &value)); |
| 388 EXPECT_EQ("keep-alive", value); | 391 EXPECT_EQ("keep-alive", value); |
| 389 | 392 |
| 390 std::string response_headers; | 393 std::string response_headers; |
| 391 EXPECT_TRUE(GetHeaders(entries[pos].params.get(), &response_headers)); | 394 EXPECT_TRUE(GetHeaders(entries[pos].params.get(), &response_headers)); |
| 392 EXPECT_EQ("['Host: www.example.org','Connection: keep-alive']", | 395 EXPECT_EQ("['Host: www.example.org','Connection: keep-alive']", |
| 393 response_headers); | 396 response_headers); |
| 394 | 397 |
| 395 out.totalReceivedBytes = trans->GetTotalReceivedBytes(); | 398 EXPECT_EQ( |
| 399 static_cast<int64_t>(line.size() + request_headers.ToString().size()), | |
|
mmenke
2015/09/04 15:21:49
We really should not be depending on GetFullReques
sclittle
2015/09/04 22:03:10
You're right, removed this. I forgot to remove thi
| |
| 400 trans->GetTotalSentBytes()); | |
| 401 | |
| 402 // The total number of sent bytes should not have changed. | |
| 403 EXPECT_EQ(out.total_sent_bytes, trans->GetTotalSentBytes()); | |
| 404 | |
| 405 out.total_received_bytes = trans->GetTotalReceivedBytes(); | |
| 396 trans->GetConnectionAttempts(&out.connection_attempts); | 406 trans->GetConnectionAttempts(&out.connection_attempts); |
| 397 return out; | 407 return out; |
| 398 } | 408 } |
| 399 | 409 |
| 400 SimpleGetHelperResult SimpleGetHelper(MockRead data_reads[], | 410 SimpleGetHelperResult SimpleGetHelper(MockRead data_reads[], |
| 401 size_t reads_count) { | 411 size_t reads_count) { |
| 402 StaticSocketDataProvider reads(data_reads, reads_count, NULL, 0); | 412 MockWrite data_writes[] = { |
| 403 StaticSocketDataProvider* data[] = { &reads }; | 413 MockWrite("GET / HTTP/1.1\r\n" |
| 404 return SimpleGetHelperForData(data, 1); | 414 "Host: www.example.org\r\n" |
| 405 } | 415 "Connection: keep-alive\r\n\r\n"), |
| 416 }; | |
|
mmenke
2015/09/04 15:21:49
So I guess no tests that use this method use SPDY
sclittle
2015/09/04 22:03:10
That's correct.
| |
| 406 | 417 |
| 407 int64 ReadsSize(MockRead data_reads[], size_t reads_count) { | 418 StaticSocketDataProvider reads(data_reads, reads_count, data_writes, |
| 408 int64 size = 0; | 419 arraysize(data_writes)); |
| 409 for (size_t i = 0; i < reads_count; ++i) | 420 StaticSocketDataProvider* data[] = {&reads}; |
| 410 size += data_reads[i].data_len; | 421 SimpleGetHelperResult out = SimpleGetHelperForData(data, 1); |
| 411 return size; | 422 |
| 423 EXPECT_EQ(CountWriteBytes(data_writes, arraysize(data_writes)), | |
| 424 out.total_sent_bytes); | |
| 425 return out; | |
| 412 } | 426 } |
| 413 | 427 |
| 414 void ConnectStatusHelperWithExpectedStatus(const MockRead& status, | 428 void ConnectStatusHelperWithExpectedStatus(const MockRead& status, |
| 415 int expected_status); | 429 int expected_status); |
| 416 | 430 |
| 417 void ConnectStatusHelper(const MockRead& status); | 431 void ConnectStatusHelper(const MockRead& status); |
| 418 | 432 |
| 419 void BypassHostCacheOnRefreshHelper(int load_flags); | 433 void BypassHostCacheOnRefreshHelper(int load_flags); |
| 420 | 434 |
| 421 void CheckErrorIsPassedBack(int error, IoMode mode); | 435 void CheckErrorIsPassedBack(int error, IoMode mode); |
| (...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 672 MockRead data_reads[] = { | 686 MockRead data_reads[] = { |
| 673 MockRead("HTTP/1.0 200 OK\r\n\r\n"), | 687 MockRead("HTTP/1.0 200 OK\r\n\r\n"), |
| 674 MockRead("hello world"), | 688 MockRead("hello world"), |
| 675 MockRead(SYNCHRONOUS, OK), | 689 MockRead(SYNCHRONOUS, OK), |
| 676 }; | 690 }; |
| 677 SimpleGetHelperResult out = SimpleGetHelper(data_reads, | 691 SimpleGetHelperResult out = SimpleGetHelper(data_reads, |
| 678 arraysize(data_reads)); | 692 arraysize(data_reads)); |
| 679 EXPECT_EQ(OK, out.rv); | 693 EXPECT_EQ(OK, out.rv); |
| 680 EXPECT_EQ("HTTP/1.0 200 OK", out.status_line); | 694 EXPECT_EQ("HTTP/1.0 200 OK", out.status_line); |
| 681 EXPECT_EQ("hello world", out.response_data); | 695 EXPECT_EQ("hello world", out.response_data); |
| 682 int64 reads_size = ReadsSize(data_reads, arraysize(data_reads)); | 696 int64_t reads_size = CountReadBytes(data_reads, arraysize(data_reads)); |
| 683 EXPECT_EQ(reads_size, out.totalReceivedBytes); | 697 EXPECT_EQ(reads_size, out.total_received_bytes); |
| 684 EXPECT_EQ(0u, out.connection_attempts.size()); | 698 EXPECT_EQ(0u, out.connection_attempts.size()); |
| 685 } | 699 } |
| 686 | 700 |
| 687 // Response with no status line. | 701 // Response with no status line. |
| 688 TEST_P(HttpNetworkTransactionTest, SimpleGETNoHeaders) { | 702 TEST_P(HttpNetworkTransactionTest, SimpleGETNoHeaders) { |
| 689 MockRead data_reads[] = { | 703 MockRead data_reads[] = { |
| 690 MockRead("hello world"), | 704 MockRead("hello world"), |
| 691 MockRead(SYNCHRONOUS, OK), | 705 MockRead(SYNCHRONOUS, OK), |
| 692 }; | 706 }; |
| 693 SimpleGetHelperResult out = SimpleGetHelper(data_reads, | 707 SimpleGetHelperResult out = SimpleGetHelper(data_reads, |
| 694 arraysize(data_reads)); | 708 arraysize(data_reads)); |
| 695 EXPECT_EQ(OK, out.rv); | 709 EXPECT_EQ(OK, out.rv); |
| 696 EXPECT_EQ("HTTP/0.9 200 OK", out.status_line); | 710 EXPECT_EQ("HTTP/0.9 200 OK", out.status_line); |
| 697 EXPECT_EQ("hello world", out.response_data); | 711 EXPECT_EQ("hello world", out.response_data); |
| 698 int64 reads_size = ReadsSize(data_reads, arraysize(data_reads)); | 712 int64_t reads_size = CountReadBytes(data_reads, arraysize(data_reads)); |
| 699 EXPECT_EQ(reads_size, out.totalReceivedBytes); | 713 EXPECT_EQ(reads_size, out.total_received_bytes); |
| 700 } | 714 } |
| 701 | 715 |
| 702 // Allow up to 4 bytes of junk to precede status line. | 716 // Allow up to 4 bytes of junk to precede status line. |
| 703 TEST_P(HttpNetworkTransactionTest, StatusLineJunk3Bytes) { | 717 TEST_P(HttpNetworkTransactionTest, StatusLineJunk3Bytes) { |
| 704 MockRead data_reads[] = { | 718 MockRead data_reads[] = { |
| 705 MockRead("xxxHTTP/1.0 404 Not Found\nServer: blah\n\nDATA"), | 719 MockRead("xxxHTTP/1.0 404 Not Found\nServer: blah\n\nDATA"), |
| 706 MockRead(SYNCHRONOUS, OK), | 720 MockRead(SYNCHRONOUS, OK), |
| 707 }; | 721 }; |
| 708 SimpleGetHelperResult out = SimpleGetHelper(data_reads, | 722 SimpleGetHelperResult out = SimpleGetHelper(data_reads, |
| 709 arraysize(data_reads)); | 723 arraysize(data_reads)); |
| 710 EXPECT_EQ(OK, out.rv); | 724 EXPECT_EQ(OK, out.rv); |
| 711 EXPECT_EQ("HTTP/1.0 404 Not Found", out.status_line); | 725 EXPECT_EQ("HTTP/1.0 404 Not Found", out.status_line); |
| 712 EXPECT_EQ("DATA", out.response_data); | 726 EXPECT_EQ("DATA", out.response_data); |
| 713 int64 reads_size = ReadsSize(data_reads, arraysize(data_reads)); | 727 int64_t reads_size = CountReadBytes(data_reads, arraysize(data_reads)); |
| 714 EXPECT_EQ(reads_size, out.totalReceivedBytes); | 728 EXPECT_EQ(reads_size, out.total_received_bytes); |
| 715 } | 729 } |
| 716 | 730 |
| 717 // Allow up to 4 bytes of junk to precede status line. | 731 // Allow up to 4 bytes of junk to precede status line. |
| 718 TEST_P(HttpNetworkTransactionTest, StatusLineJunk4Bytes) { | 732 TEST_P(HttpNetworkTransactionTest, StatusLineJunk4Bytes) { |
| 719 MockRead data_reads[] = { | 733 MockRead data_reads[] = { |
| 720 MockRead("\n\nQJHTTP/1.0 404 Not Found\nServer: blah\n\nDATA"), | 734 MockRead("\n\nQJHTTP/1.0 404 Not Found\nServer: blah\n\nDATA"), |
| 721 MockRead(SYNCHRONOUS, OK), | 735 MockRead(SYNCHRONOUS, OK), |
| 722 }; | 736 }; |
| 723 SimpleGetHelperResult out = SimpleGetHelper(data_reads, | 737 SimpleGetHelperResult out = SimpleGetHelper(data_reads, |
| 724 arraysize(data_reads)); | 738 arraysize(data_reads)); |
| 725 EXPECT_EQ(OK, out.rv); | 739 EXPECT_EQ(OK, out.rv); |
| 726 EXPECT_EQ("HTTP/1.0 404 Not Found", out.status_line); | 740 EXPECT_EQ("HTTP/1.0 404 Not Found", out.status_line); |
| 727 EXPECT_EQ("DATA", out.response_data); | 741 EXPECT_EQ("DATA", out.response_data); |
| 728 int64 reads_size = ReadsSize(data_reads, arraysize(data_reads)); | 742 int64_t reads_size = CountReadBytes(data_reads, arraysize(data_reads)); |
| 729 EXPECT_EQ(reads_size, out.totalReceivedBytes); | 743 EXPECT_EQ(reads_size, out.total_received_bytes); |
| 730 } | 744 } |
| 731 | 745 |
| 732 // Beyond 4 bytes of slop and it should fail to find a status line. | 746 // Beyond 4 bytes of slop and it should fail to find a status line. |
| 733 TEST_P(HttpNetworkTransactionTest, StatusLineJunk5Bytes) { | 747 TEST_P(HttpNetworkTransactionTest, StatusLineJunk5Bytes) { |
| 734 MockRead data_reads[] = { | 748 MockRead data_reads[] = { |
| 735 MockRead("xxxxxHTTP/1.1 404 Not Found\nServer: blah"), | 749 MockRead("xxxxxHTTP/1.1 404 Not Found\nServer: blah"), |
| 736 MockRead(SYNCHRONOUS, OK), | 750 MockRead(SYNCHRONOUS, OK), |
| 737 }; | 751 }; |
| 738 SimpleGetHelperResult out = SimpleGetHelper(data_reads, | 752 SimpleGetHelperResult out = SimpleGetHelper(data_reads, |
| 739 arraysize(data_reads)); | 753 arraysize(data_reads)); |
| 740 EXPECT_EQ(OK, out.rv); | 754 EXPECT_EQ(OK, out.rv); |
| 741 EXPECT_EQ("HTTP/0.9 200 OK", out.status_line); | 755 EXPECT_EQ("HTTP/0.9 200 OK", out.status_line); |
| 742 EXPECT_EQ("xxxxxHTTP/1.1 404 Not Found\nServer: blah", out.response_data); | 756 EXPECT_EQ("xxxxxHTTP/1.1 404 Not Found\nServer: blah", out.response_data); |
| 743 int64 reads_size = ReadsSize(data_reads, arraysize(data_reads)); | 757 int64_t reads_size = CountReadBytes(data_reads, arraysize(data_reads)); |
| 744 EXPECT_EQ(reads_size, out.totalReceivedBytes); | 758 EXPECT_EQ(reads_size, out.total_received_bytes); |
| 745 } | 759 } |
| 746 | 760 |
| 747 // Same as StatusLineJunk4Bytes, except the read chunks are smaller. | 761 // Same as StatusLineJunk4Bytes, except the read chunks are smaller. |
| 748 TEST_P(HttpNetworkTransactionTest, StatusLineJunk4Bytes_Slow) { | 762 TEST_P(HttpNetworkTransactionTest, StatusLineJunk4Bytes_Slow) { |
| 749 MockRead data_reads[] = { | 763 MockRead data_reads[] = { |
| 750 MockRead("\n"), | 764 MockRead("\n"), |
| 751 MockRead("\n"), | 765 MockRead("\n"), |
| 752 MockRead("Q"), | 766 MockRead("Q"), |
| 753 MockRead("J"), | 767 MockRead("J"), |
| 754 MockRead("HTTP/1.0 404 Not Found\nServer: blah\n\nDATA"), | 768 MockRead("HTTP/1.0 404 Not Found\nServer: blah\n\nDATA"), |
| 755 MockRead(SYNCHRONOUS, OK), | 769 MockRead(SYNCHRONOUS, OK), |
| 756 }; | 770 }; |
| 757 SimpleGetHelperResult out = SimpleGetHelper(data_reads, | 771 SimpleGetHelperResult out = SimpleGetHelper(data_reads, |
| 758 arraysize(data_reads)); | 772 arraysize(data_reads)); |
| 759 EXPECT_EQ(OK, out.rv); | 773 EXPECT_EQ(OK, out.rv); |
| 760 EXPECT_EQ("HTTP/1.0 404 Not Found", out.status_line); | 774 EXPECT_EQ("HTTP/1.0 404 Not Found", out.status_line); |
| 761 EXPECT_EQ("DATA", out.response_data); | 775 EXPECT_EQ("DATA", out.response_data); |
| 762 int64 reads_size = ReadsSize(data_reads, arraysize(data_reads)); | 776 int64_t reads_size = CountReadBytes(data_reads, arraysize(data_reads)); |
| 763 EXPECT_EQ(reads_size, out.totalReceivedBytes); | 777 EXPECT_EQ(reads_size, out.total_received_bytes); |
| 764 } | 778 } |
| 765 | 779 |
| 766 // Close the connection before enough bytes to have a status line. | 780 // Close the connection before enough bytes to have a status line. |
| 767 TEST_P(HttpNetworkTransactionTest, StatusLinePartial) { | 781 TEST_P(HttpNetworkTransactionTest, StatusLinePartial) { |
| 768 MockRead data_reads[] = { | 782 MockRead data_reads[] = { |
| 769 MockRead("HTT"), | 783 MockRead("HTT"), |
| 770 MockRead(SYNCHRONOUS, OK), | 784 MockRead(SYNCHRONOUS, OK), |
| 771 }; | 785 }; |
| 772 SimpleGetHelperResult out = SimpleGetHelper(data_reads, | 786 SimpleGetHelperResult out = SimpleGetHelper(data_reads, |
| 773 arraysize(data_reads)); | 787 arraysize(data_reads)); |
| 774 EXPECT_EQ(OK, out.rv); | 788 EXPECT_EQ(OK, out.rv); |
| 775 EXPECT_EQ("HTTP/0.9 200 OK", out.status_line); | 789 EXPECT_EQ("HTTP/0.9 200 OK", out.status_line); |
| 776 EXPECT_EQ("HTT", out.response_data); | 790 EXPECT_EQ("HTT", out.response_data); |
| 777 int64 reads_size = ReadsSize(data_reads, arraysize(data_reads)); | 791 int64_t reads_size = CountReadBytes(data_reads, arraysize(data_reads)); |
| 778 EXPECT_EQ(reads_size, out.totalReceivedBytes); | 792 EXPECT_EQ(reads_size, out.total_received_bytes); |
| 779 } | 793 } |
| 780 | 794 |
| 781 // Simulate a 204 response, lacking a Content-Length header, sent over a | 795 // Simulate a 204 response, lacking a Content-Length header, sent over a |
| 782 // persistent connection. The response should still terminate since a 204 | 796 // persistent connection. The response should still terminate since a 204 |
| 783 // cannot have a response body. | 797 // cannot have a response body. |
| 784 TEST_P(HttpNetworkTransactionTest, StopsReading204) { | 798 TEST_P(HttpNetworkTransactionTest, StopsReading204) { |
| 785 char junk[] = "junk"; | 799 char junk[] = "junk"; |
| 786 MockRead data_reads[] = { | 800 MockRead data_reads[] = { |
| 787 MockRead("HTTP/1.1 204 No Content\r\n\r\n"), | 801 MockRead("HTTP/1.1 204 No Content\r\n\r\n"), |
| 788 MockRead(junk), // Should not be read!! | 802 MockRead(junk), // Should not be read!! |
| 789 MockRead(SYNCHRONOUS, OK), | 803 MockRead(SYNCHRONOUS, OK), |
| 790 }; | 804 }; |
| 791 SimpleGetHelperResult out = SimpleGetHelper(data_reads, | 805 SimpleGetHelperResult out = SimpleGetHelper(data_reads, |
| 792 arraysize(data_reads)); | 806 arraysize(data_reads)); |
| 793 EXPECT_EQ(OK, out.rv); | 807 EXPECT_EQ(OK, out.rv); |
| 794 EXPECT_EQ("HTTP/1.1 204 No Content", out.status_line); | 808 EXPECT_EQ("HTTP/1.1 204 No Content", out.status_line); |
| 795 EXPECT_EQ("", out.response_data); | 809 EXPECT_EQ("", out.response_data); |
| 796 int64 reads_size = ReadsSize(data_reads, arraysize(data_reads)); | 810 int64_t reads_size = CountReadBytes(data_reads, arraysize(data_reads)); |
| 797 int64 response_size = reads_size - strlen(junk); | 811 int64_t response_size = reads_size - strlen(junk); |
| 798 EXPECT_EQ(response_size, out.totalReceivedBytes); | 812 EXPECT_EQ(response_size, out.total_received_bytes); |
| 799 } | 813 } |
| 800 | 814 |
| 801 // A simple request using chunked encoding with some extra data after. | 815 // A simple request using chunked encoding with some extra data after. |
| 802 TEST_P(HttpNetworkTransactionTest, ChunkedEncoding) { | 816 TEST_P(HttpNetworkTransactionTest, ChunkedEncoding) { |
| 803 std::string final_chunk = "0\r\n\r\n"; | 817 std::string final_chunk = "0\r\n\r\n"; |
| 804 std::string extra_data = "HTTP/1.1 200 OK\r\n"; | 818 std::string extra_data = "HTTP/1.1 200 OK\r\n"; |
| 805 std::string last_read = final_chunk + extra_data; | 819 std::string last_read = final_chunk + extra_data; |
| 806 MockRead data_reads[] = { | 820 MockRead data_reads[] = { |
| 807 MockRead("HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n"), | 821 MockRead("HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n"), |
| 808 MockRead("5\r\nHello\r\n"), | 822 MockRead("5\r\nHello\r\n"), |
| 809 MockRead("1\r\n"), | 823 MockRead("1\r\n"), |
| 810 MockRead(" \r\n"), | 824 MockRead(" \r\n"), |
| 811 MockRead("5\r\nworld\r\n"), | 825 MockRead("5\r\nworld\r\n"), |
| 812 MockRead(last_read.data()), | 826 MockRead(last_read.data()), |
| 813 MockRead(SYNCHRONOUS, OK), | 827 MockRead(SYNCHRONOUS, OK), |
| 814 }; | 828 }; |
| 815 SimpleGetHelperResult out = SimpleGetHelper(data_reads, | 829 SimpleGetHelperResult out = SimpleGetHelper(data_reads, |
| 816 arraysize(data_reads)); | 830 arraysize(data_reads)); |
| 817 EXPECT_EQ(OK, out.rv); | 831 EXPECT_EQ(OK, out.rv); |
| 818 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); | 832 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); |
| 819 EXPECT_EQ("Hello world", out.response_data); | 833 EXPECT_EQ("Hello world", out.response_data); |
| 820 int64 reads_size = ReadsSize(data_reads, arraysize(data_reads)); | 834 int64_t reads_size = CountReadBytes(data_reads, arraysize(data_reads)); |
| 821 int64 response_size = reads_size - extra_data.size(); | 835 int64_t response_size = reads_size - extra_data.size(); |
| 822 EXPECT_EQ(response_size, out.totalReceivedBytes); | 836 EXPECT_EQ(response_size, out.total_received_bytes); |
| 823 } | 837 } |
| 824 | 838 |
| 825 // Next tests deal with http://crbug.com/56344. | 839 // Next tests deal with http://crbug.com/56344. |
| 826 | 840 |
| 827 TEST_P(HttpNetworkTransactionTest, | 841 TEST_P(HttpNetworkTransactionTest, |
| 828 MultipleContentLengthHeadersNoTransferEncoding) { | 842 MultipleContentLengthHeadersNoTransferEncoding) { |
| 829 MockRead data_reads[] = { | 843 MockRead data_reads[] = { |
| 830 MockRead("HTTP/1.1 200 OK\r\n"), | 844 MockRead("HTTP/1.1 200 OK\r\n"), |
| 831 MockRead("Content-Length: 10\r\n"), | 845 MockRead("Content-Length: 10\r\n"), |
| 832 MockRead("Content-Length: 5\r\n\r\n"), | 846 MockRead("Content-Length: 5\r\n\r\n"), |
| (...skipping 1115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1948 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); | 1962 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); |
| 1949 EXPECT_EQ(ERR_IO_PENDING, rv); | 1963 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 1950 | 1964 |
| 1951 rv = callback1.WaitForResult(); | 1965 rv = callback1.WaitForResult(); |
| 1952 EXPECT_EQ(OK, rv); | 1966 EXPECT_EQ(OK, rv); |
| 1953 | 1967 |
| 1954 LoadTimingInfo load_timing_info1; | 1968 LoadTimingInfo load_timing_info1; |
| 1955 EXPECT_TRUE(trans->GetLoadTimingInfo(&load_timing_info1)); | 1969 EXPECT_TRUE(trans->GetLoadTimingInfo(&load_timing_info1)); |
| 1956 TestLoadTimingNotReused(load_timing_info1, CONNECT_TIMING_HAS_DNS_TIMES); | 1970 TestLoadTimingNotReused(load_timing_info1, CONNECT_TIMING_HAS_DNS_TIMES); |
| 1957 | 1971 |
| 1958 int64 reads_size1 = ReadsSize(data_reads1, arraysize(data_reads1)); | 1972 int64_t writes_size1 = CountWriteBytes(data_writes1, arraysize(data_writes1)); |
| 1973 EXPECT_EQ(writes_size1, trans->GetTotalSentBytes()); | |
| 1974 int64_t reads_size1 = CountReadBytes(data_reads1, arraysize(data_reads1)); | |
| 1959 EXPECT_EQ(reads_size1, trans->GetTotalReceivedBytes()); | 1975 EXPECT_EQ(reads_size1, trans->GetTotalReceivedBytes()); |
| 1960 | 1976 |
| 1961 const HttpResponseInfo* response = trans->GetResponseInfo(); | 1977 const HttpResponseInfo* response = trans->GetResponseInfo(); |
| 1962 ASSERT_TRUE(response != NULL); | 1978 ASSERT_TRUE(response != NULL); |
| 1963 EXPECT_TRUE(CheckBasicServerAuth(response->auth_challenge.get())); | 1979 EXPECT_TRUE(CheckBasicServerAuth(response->auth_challenge.get())); |
| 1964 | 1980 |
| 1965 TestCompletionCallback callback2; | 1981 TestCompletionCallback callback2; |
| 1966 | 1982 |
| 1967 rv = trans->RestartWithAuth( | 1983 rv = trans->RestartWithAuth( |
| 1968 AuthCredentials(kFoo, kBar), callback2.callback()); | 1984 AuthCredentials(kFoo, kBar), callback2.callback()); |
| 1969 EXPECT_EQ(ERR_IO_PENDING, rv); | 1985 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 1970 | 1986 |
| 1971 rv = callback2.WaitForResult(); | 1987 rv = callback2.WaitForResult(); |
| 1972 EXPECT_EQ(OK, rv); | 1988 EXPECT_EQ(OK, rv); |
| 1973 | 1989 |
| 1974 LoadTimingInfo load_timing_info2; | 1990 LoadTimingInfo load_timing_info2; |
| 1975 EXPECT_TRUE(trans->GetLoadTimingInfo(&load_timing_info2)); | 1991 EXPECT_TRUE(trans->GetLoadTimingInfo(&load_timing_info2)); |
| 1976 TestLoadTimingNotReused(load_timing_info2, CONNECT_TIMING_HAS_DNS_TIMES); | 1992 TestLoadTimingNotReused(load_timing_info2, CONNECT_TIMING_HAS_DNS_TIMES); |
| 1977 // The load timing after restart should have a new socket ID, and times after | 1993 // The load timing after restart should have a new socket ID, and times after |
| 1978 // those of the first load timing. | 1994 // those of the first load timing. |
| 1979 EXPECT_LE(load_timing_info1.receive_headers_end, | 1995 EXPECT_LE(load_timing_info1.receive_headers_end, |
| 1980 load_timing_info2.connect_timing.connect_start); | 1996 load_timing_info2.connect_timing.connect_start); |
| 1981 EXPECT_NE(load_timing_info1.socket_log_id, load_timing_info2.socket_log_id); | 1997 EXPECT_NE(load_timing_info1.socket_log_id, load_timing_info2.socket_log_id); |
| 1982 | 1998 |
| 1983 int64 reads_size2 = ReadsSize(data_reads2, arraysize(data_reads2)); | 1999 int64_t writes_size2 = CountWriteBytes(data_writes2, arraysize(data_writes2)); |
| 2000 EXPECT_EQ(writes_size1 + writes_size2, trans->GetTotalSentBytes()); | |
| 2001 int64_t reads_size2 = CountReadBytes(data_reads2, arraysize(data_reads2)); | |
| 1984 EXPECT_EQ(reads_size1 + reads_size2, trans->GetTotalReceivedBytes()); | 2002 EXPECT_EQ(reads_size1 + reads_size2, trans->GetTotalReceivedBytes()); |
| 1985 | 2003 |
| 1986 response = trans->GetResponseInfo(); | 2004 response = trans->GetResponseInfo(); |
| 1987 ASSERT_TRUE(response != NULL); | 2005 ASSERT_TRUE(response != NULL); |
| 1988 EXPECT_TRUE(response->auth_challenge.get() == NULL); | 2006 EXPECT_TRUE(response->auth_challenge.get() == NULL); |
| 1989 EXPECT_EQ(100, response->headers->GetContentLength()); | 2007 EXPECT_EQ(100, response->headers->GetContentLength()); |
| 1990 } | 2008 } |
| 1991 | 2009 |
| 1992 TEST_P(HttpNetworkTransactionTest, DoNotSendAuth) { | 2010 TEST_P(HttpNetworkTransactionTest, DoNotSendAuth) { |
| 1993 HttpRequestInfo request; | 2011 HttpRequestInfo request; |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 2019 data_writes, arraysize(data_writes)); | 2037 data_writes, arraysize(data_writes)); |
| 2020 session_deps_.socket_factory->AddSocketDataProvider(&data); | 2038 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 2021 TestCompletionCallback callback; | 2039 TestCompletionCallback callback; |
| 2022 | 2040 |
| 2023 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 2041 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
| 2024 EXPECT_EQ(ERR_IO_PENDING, rv); | 2042 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 2025 | 2043 |
| 2026 rv = callback.WaitForResult(); | 2044 rv = callback.WaitForResult(); |
| 2027 EXPECT_EQ(0, rv); | 2045 EXPECT_EQ(0, rv); |
| 2028 | 2046 |
| 2029 int64 reads_size = ReadsSize(data_reads, arraysize(data_reads)); | 2047 int64_t writes_size = CountWriteBytes(data_writes, arraysize(data_writes)); |
| 2048 EXPECT_EQ(writes_size, trans->GetTotalSentBytes()); | |
| 2049 int64_t reads_size = CountReadBytes(data_reads, arraysize(data_reads)); | |
| 2030 EXPECT_EQ(reads_size, trans->GetTotalReceivedBytes()); | 2050 EXPECT_EQ(reads_size, trans->GetTotalReceivedBytes()); |
| 2031 | 2051 |
| 2032 const HttpResponseInfo* response = trans->GetResponseInfo(); | 2052 const HttpResponseInfo* response = trans->GetResponseInfo(); |
| 2033 ASSERT_TRUE(response != NULL); | 2053 ASSERT_TRUE(response != NULL); |
| 2034 EXPECT_TRUE(response->auth_challenge.get() == NULL); | 2054 EXPECT_TRUE(response->auth_challenge.get() == NULL); |
| 2035 } | 2055 } |
| 2036 | 2056 |
| 2037 // Test the request-challenge-retry sequence for basic auth, over a keep-alive | 2057 // Test the request-challenge-retry sequence for basic auth, over a keep-alive |
| 2038 // connection. | 2058 // connection. |
| 2039 TEST_P(HttpNetworkTransactionTest, BasicAuthKeepAlive) { | 2059 TEST_P(HttpNetworkTransactionTest, BasicAuthKeepAlive) { |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2125 EXPECT_EQ(load_timing_info1.socket_log_id, load_timing_info2.socket_log_id); | 2145 EXPECT_EQ(load_timing_info1.socket_log_id, load_timing_info2.socket_log_id); |
| 2126 | 2146 |
| 2127 response = trans->GetResponseInfo(); | 2147 response = trans->GetResponseInfo(); |
| 2128 ASSERT_TRUE(response != NULL); | 2148 ASSERT_TRUE(response != NULL); |
| 2129 EXPECT_TRUE(response->auth_challenge.get() == NULL); | 2149 EXPECT_TRUE(response->auth_challenge.get() == NULL); |
| 2130 EXPECT_EQ(5, response->headers->GetContentLength()); | 2150 EXPECT_EQ(5, response->headers->GetContentLength()); |
| 2131 | 2151 |
| 2132 std::string response_data; | 2152 std::string response_data; |
| 2133 rv = ReadTransaction(trans.get(), &response_data); | 2153 rv = ReadTransaction(trans.get(), &response_data); |
| 2134 EXPECT_EQ(OK, rv); | 2154 EXPECT_EQ(OK, rv); |
| 2135 int64 reads_size1 = ReadsSize(data_reads1, arraysize(data_reads1)); | 2155 |
| 2156 int64_t writes_size1 = CountWriteBytes(data_writes1, arraysize(data_writes1)); | |
| 2157 EXPECT_EQ(writes_size1, trans->GetTotalSentBytes()); | |
| 2158 int64_t reads_size1 = CountReadBytes(data_reads1, arraysize(data_reads1)); | |
| 2136 EXPECT_EQ(reads_size1, trans->GetTotalReceivedBytes()); | 2159 EXPECT_EQ(reads_size1, trans->GetTotalReceivedBytes()); |
| 2137 } | 2160 } |
| 2138 | 2161 |
| 2139 // Test the request-challenge-retry sequence for basic auth, over a keep-alive | 2162 // Test the request-challenge-retry sequence for basic auth, over a keep-alive |
| 2140 // connection and with no response body to drain. | 2163 // connection and with no response body to drain. |
| 2141 TEST_P(HttpNetworkTransactionTest, BasicAuthKeepAliveNoBody) { | 2164 TEST_P(HttpNetworkTransactionTest, BasicAuthKeepAliveNoBody) { |
| 2142 HttpRequestInfo request; | 2165 HttpRequestInfo request; |
| 2143 request.method = "GET"; | 2166 request.method = "GET"; |
| 2144 request.url = GURL("http://www.example.org/"); | 2167 request.url = GURL("http://www.example.org/"); |
| 2145 request.load_flags = 0; | 2168 request.load_flags = 0; |
| (...skipping 12431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 14577 const HttpResponseInfo* response = trans->GetResponseInfo(); | 14600 const HttpResponseInfo* response = trans->GetResponseInfo(); |
| 14578 ASSERT_TRUE(response); | 14601 ASSERT_TRUE(response); |
| 14579 ASSERT_TRUE(response->headers.get()); | 14602 ASSERT_TRUE(response->headers.get()); |
| 14580 | 14603 |
| 14581 EXPECT_EQ(101, response->headers->response_code()); | 14604 EXPECT_EQ(101, response->headers->response_code()); |
| 14582 | 14605 |
| 14583 trans.reset(); | 14606 trans.reset(); |
| 14584 session->CloseAllConnections(); | 14607 session->CloseAllConnections(); |
| 14585 } | 14608 } |
| 14586 | 14609 |
| 14610 TEST_P(HttpNetworkTransactionTest, TotalNetworkBytesPost) { | |
| 14611 ScopedVector<UploadElementReader> element_readers; | |
| 14612 element_readers.push_back(new UploadBytesElementReader("foo", 3)); | |
| 14613 ElementsUploadDataStream upload_data_stream(element_readers.Pass(), 0); | |
| 14614 | |
| 14615 HttpRequestInfo request; | |
| 14616 request.method = "POST"; | |
| 14617 request.url = GURL("http://www.foo.com/"); | |
| 14618 request.upload_data_stream = &upload_data_stream; | |
| 14619 | |
| 14620 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | |
| 14621 scoped_ptr<HttpTransaction> trans( | |
| 14622 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | |
| 14623 MockWrite data_writes[] = { | |
| 14624 MockWrite("POST / HTTP/1.1\r\n" | |
| 14625 "Host: www.foo.com\r\n" | |
| 14626 "Connection: keep-alive\r\n" | |
| 14627 "Content-Length: 3\r\n\r\n"), | |
| 14628 MockWrite("foo"), | |
| 14629 }; | |
| 14630 | |
| 14631 MockRead data_reads[] = { | |
| 14632 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"), | |
| 14633 MockRead(SYNCHRONOUS, OK), | |
| 14634 }; | |
| 14635 StaticSocketDataProvider data(data_reads, arraysize(data_reads), data_writes, | |
| 14636 arraysize(data_writes)); | |
| 14637 session_deps_.socket_factory->AddSocketDataProvider(&data); | |
| 14638 | |
| 14639 TestCompletionCallback callback; | |
| 14640 | |
| 14641 EXPECT_EQ(ERR_IO_PENDING, | |
| 14642 trans->Start(&request, callback.callback(), BoundNetLog())); | |
| 14643 EXPECT_EQ(OK, callback.WaitForResult()); | |
| 14644 | |
| 14645 std::string response_data; | |
| 14646 EXPECT_EQ(OK, ReadTransaction(trans.get(), &response_data)); | |
| 14647 | |
| 14648 EXPECT_EQ(CountWriteBytes(data_writes, arraysize(data_writes)), | |
| 14649 trans->GetTotalSentBytes()); | |
| 14650 EXPECT_EQ(CountReadBytes(data_reads, arraysize(data_reads)), | |
| 14651 trans->GetTotalReceivedBytes()); | |
| 14652 } | |
| 14653 | |
| 14654 TEST_P(HttpNetworkTransactionTest, TotalNetworkBytesPost100Continue) { | |
| 14655 ScopedVector<UploadElementReader> element_readers; | |
| 14656 element_readers.push_back(new UploadBytesElementReader("foo", 3)); | |
| 14657 ElementsUploadDataStream upload_data_stream(element_readers.Pass(), 0); | |
| 14658 | |
| 14659 HttpRequestInfo request; | |
| 14660 request.method = "POST"; | |
| 14661 request.url = GURL("http://www.foo.com/"); | |
| 14662 request.upload_data_stream = &upload_data_stream; | |
| 14663 | |
| 14664 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | |
| 14665 scoped_ptr<HttpTransaction> trans( | |
| 14666 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | |
| 14667 MockWrite data_writes[] = { | |
| 14668 MockWrite("POST / HTTP/1.1\r\n" | |
| 14669 "Host: www.foo.com\r\n" | |
| 14670 "Connection: keep-alive\r\n" | |
| 14671 "Content-Length: 3\r\n\r\n"), | |
| 14672 MockWrite("foo"), | |
| 14673 }; | |
| 14674 | |
| 14675 MockRead data_reads[] = { | |
| 14676 MockRead("HTTP/1.1 100 Continue\r\n\r\n"), | |
| 14677 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"), | |
|
mmenke
2015/09/04 15:21:49
Second mock read should be on next line...Or does
sclittle
2015/09/04 22:03:10
git cl format did this.
| |
| 14678 MockRead(SYNCHRONOUS, OK), | |
| 14679 }; | |
| 14680 StaticSocketDataProvider data(data_reads, arraysize(data_reads), data_writes, | |
| 14681 arraysize(data_writes)); | |
| 14682 session_deps_.socket_factory->AddSocketDataProvider(&data); | |
| 14683 | |
| 14684 TestCompletionCallback callback; | |
| 14685 | |
| 14686 EXPECT_EQ(ERR_IO_PENDING, | |
| 14687 trans->Start(&request, callback.callback(), BoundNetLog())); | |
| 14688 EXPECT_EQ(OK, callback.WaitForResult()); | |
| 14689 | |
| 14690 std::string response_data; | |
| 14691 EXPECT_EQ(OK, ReadTransaction(trans.get(), &response_data)); | |
| 14692 | |
| 14693 EXPECT_EQ(CountWriteBytes(data_writes, arraysize(data_writes)), | |
| 14694 trans->GetTotalSentBytes()); | |
| 14695 EXPECT_EQ(CountReadBytes(data_reads, arraysize(data_reads)), | |
| 14696 trans->GetTotalReceivedBytes()); | |
| 14697 } | |
| 14698 | |
| 14699 TEST_P(HttpNetworkTransactionTest, TotalNetworkBytesChunkedPost) { | |
| 14700 ScopedVector<UploadElementReader> element_readers; | |
| 14701 element_readers.push_back(new UploadBytesElementReader("foo", 3)); | |
| 14702 ChunkedUploadDataStream upload_data_stream(0); | |
| 14703 | |
| 14704 HttpRequestInfo request; | |
| 14705 request.method = "POST"; | |
| 14706 request.url = GURL("http://www.foo.com/"); | |
| 14707 request.upload_data_stream = &upload_data_stream; | |
| 14708 | |
| 14709 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | |
| 14710 scoped_ptr<HttpTransaction> trans( | |
| 14711 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | |
| 14712 // Send headers successfully, but get an error while sending the body. | |
| 14713 MockWrite data_writes[] = { | |
| 14714 MockWrite("POST / HTTP/1.1\r\n" | |
| 14715 "Host: www.foo.com\r\n" | |
| 14716 "Connection: keep-alive\r\n" | |
| 14717 "Transfer-Encoding: chunked\r\n\r\n"), | |
| 14718 MockWrite("1\r\nf\r\n"), MockWrite("2\r\noo\r\n"), MockWrite("0\r\n\r\n"), | |
| 14719 }; | |
| 14720 | |
| 14721 MockRead data_reads[] = { | |
| 14722 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"), | |
| 14723 MockRead(SYNCHRONOUS, OK), | |
| 14724 }; | |
| 14725 StaticSocketDataProvider data(data_reads, arraysize(data_reads), data_writes, | |
| 14726 arraysize(data_writes)); | |
| 14727 session_deps_.socket_factory->AddSocketDataProvider(&data); | |
| 14728 | |
| 14729 TestCompletionCallback callback; | |
| 14730 | |
| 14731 EXPECT_EQ(ERR_IO_PENDING, | |
| 14732 trans->Start(&request, callback.callback(), BoundNetLog())); | |
| 14733 | |
| 14734 base::RunLoop().RunUntilIdle(); | |
| 14735 upload_data_stream.AppendData("f", 1, false); | |
| 14736 | |
| 14737 base::RunLoop().RunUntilIdle(); | |
| 14738 upload_data_stream.AppendData("oo", 2, true); | |
| 14739 | |
| 14740 EXPECT_EQ(OK, callback.WaitForResult()); | |
| 14741 | |
| 14742 std::string response_data; | |
| 14743 EXPECT_EQ(OK, ReadTransaction(trans.get(), &response_data)); | |
| 14744 | |
| 14745 EXPECT_EQ(CountWriteBytes(data_writes, arraysize(data_writes)), | |
| 14746 trans->GetTotalSentBytes()); | |
| 14747 EXPECT_EQ(CountReadBytes(data_reads, arraysize(data_reads)), | |
| 14748 trans->GetTotalReceivedBytes()); | |
| 14749 } | |
| 14750 | |
| 14587 } // namespace net | 14751 } // namespace net |
| OLD | NEW |