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 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
54 #include "net/log/net_log.h" | 54 #include "net/log/net_log.h" |
55 #include "net/log/net_log_unittest.h" | 55 #include "net/log/net_log_unittest.h" |
56 #include "net/log/test_net_log.h" | 56 #include "net/log/test_net_log.h" |
57 #include "net/proxy/mock_proxy_resolver.h" | 57 #include "net/proxy/mock_proxy_resolver.h" |
58 #include "net/proxy/proxy_config_service_fixed.h" | 58 #include "net/proxy/proxy_config_service_fixed.h" |
59 #include "net/proxy/proxy_info.h" | 59 #include "net/proxy/proxy_info.h" |
60 #include "net/proxy/proxy_resolver.h" | 60 #include "net/proxy/proxy_resolver.h" |
61 #include "net/proxy/proxy_service.h" | 61 #include "net/proxy/proxy_service.h" |
62 #include "net/socket/client_socket_factory.h" | 62 #include "net/socket/client_socket_factory.h" |
63 #include "net/socket/client_socket_pool_manager.h" | 63 #include "net/socket/client_socket_pool_manager.h" |
| 64 #include "net/socket/connection_attempts.h" |
64 #include "net/socket/mock_client_socket_pool_manager.h" | 65 #include "net/socket/mock_client_socket_pool_manager.h" |
65 #include "net/socket/next_proto.h" | 66 #include "net/socket/next_proto.h" |
66 #include "net/socket/socket_test_util.h" | 67 #include "net/socket/socket_test_util.h" |
67 #include "net/socket/ssl_client_socket.h" | 68 #include "net/socket/ssl_client_socket.h" |
68 #include "net/spdy/spdy_framer.h" | 69 #include "net/spdy/spdy_framer.h" |
69 #include "net/spdy/spdy_session.h" | 70 #include "net/spdy/spdy_session.h" |
70 #include "net/spdy/spdy_session_pool.h" | 71 #include "net/spdy/spdy_session_pool.h" |
71 #include "net/spdy/spdy_test_util_common.h" | 72 #include "net/spdy/spdy_test_util_common.h" |
72 #include "net/ssl/ssl_cert_request_info.h" | 73 #include "net/ssl/ssl_cert_request_info.h" |
73 #include "net/ssl/ssl_config_service.h" | 74 #include "net/ssl/ssl_config_service.h" |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
255 old_max_pool_sockets_(ClientSocketPoolManager::max_sockets_per_pool( | 256 old_max_pool_sockets_(ClientSocketPoolManager::max_sockets_per_pool( |
256 HttpNetworkSession::NORMAL_SOCKET_POOL)) { | 257 HttpNetworkSession::NORMAL_SOCKET_POOL)) { |
257 } | 258 } |
258 | 259 |
259 struct SimpleGetHelperResult { | 260 struct SimpleGetHelperResult { |
260 int rv; | 261 int rv; |
261 std::string status_line; | 262 std::string status_line; |
262 std::string response_data; | 263 std::string response_data; |
263 int64 totalReceivedBytes; | 264 int64 totalReceivedBytes; |
264 LoadTimingInfo load_timing_info; | 265 LoadTimingInfo load_timing_info; |
| 266 ConnectionAttempts connection_attempts; |
265 }; | 267 }; |
266 | 268 |
267 void SetUp() override { | 269 void SetUp() override { |
268 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); | 270 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); |
269 base::MessageLoop::current()->RunUntilIdle(); | 271 base::MessageLoop::current()->RunUntilIdle(); |
270 } | 272 } |
271 | 273 |
272 void TearDown() override { | 274 void TearDown() override { |
273 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); | 275 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); |
274 base::MessageLoop::current()->RunUntilIdle(); | 276 base::MessageLoop::current()->RunUntilIdle(); |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
376 EXPECT_EQ("www.example.org", value); | 378 EXPECT_EQ("www.example.org", value); |
377 EXPECT_TRUE(request_headers.GetHeader("Connection", &value)); | 379 EXPECT_TRUE(request_headers.GetHeader("Connection", &value)); |
378 EXPECT_EQ("keep-alive", value); | 380 EXPECT_EQ("keep-alive", value); |
379 | 381 |
380 std::string response_headers; | 382 std::string response_headers; |
381 EXPECT_TRUE(GetHeaders(entries[pos].params.get(), &response_headers)); | 383 EXPECT_TRUE(GetHeaders(entries[pos].params.get(), &response_headers)); |
382 EXPECT_EQ("['Host: www.example.org','Connection: keep-alive']", | 384 EXPECT_EQ("['Host: www.example.org','Connection: keep-alive']", |
383 response_headers); | 385 response_headers); |
384 | 386 |
385 out.totalReceivedBytes = trans->GetTotalReceivedBytes(); | 387 out.totalReceivedBytes = trans->GetTotalReceivedBytes(); |
| 388 trans->GetConnectionAttempts(&out.connection_attempts); |
386 return out; | 389 return out; |
387 } | 390 } |
388 | 391 |
389 SimpleGetHelperResult SimpleGetHelper(MockRead data_reads[], | 392 SimpleGetHelperResult SimpleGetHelper(MockRead data_reads[], |
390 size_t reads_count) { | 393 size_t reads_count) { |
391 StaticSocketDataProvider reads(data_reads, reads_count, NULL, 0); | 394 StaticSocketDataProvider reads(data_reads, reads_count, NULL, 0); |
392 StaticSocketDataProvider* data[] = { &reads }; | 395 StaticSocketDataProvider* data[] = { &reads }; |
393 return SimpleGetHelperForData(data, 1); | 396 return SimpleGetHelperForData(data, 1); |
394 } | 397 } |
395 | 398 |
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
660 MockRead("hello world"), | 663 MockRead("hello world"), |
661 MockRead(SYNCHRONOUS, OK), | 664 MockRead(SYNCHRONOUS, OK), |
662 }; | 665 }; |
663 SimpleGetHelperResult out = SimpleGetHelper(data_reads, | 666 SimpleGetHelperResult out = SimpleGetHelper(data_reads, |
664 arraysize(data_reads)); | 667 arraysize(data_reads)); |
665 EXPECT_EQ(OK, out.rv); | 668 EXPECT_EQ(OK, out.rv); |
666 EXPECT_EQ("HTTP/1.0 200 OK", out.status_line); | 669 EXPECT_EQ("HTTP/1.0 200 OK", out.status_line); |
667 EXPECT_EQ("hello world", out.response_data); | 670 EXPECT_EQ("hello world", out.response_data); |
668 int64 reads_size = ReadsSize(data_reads, arraysize(data_reads)); | 671 int64 reads_size = ReadsSize(data_reads, arraysize(data_reads)); |
669 EXPECT_EQ(reads_size, out.totalReceivedBytes); | 672 EXPECT_EQ(reads_size, out.totalReceivedBytes); |
| 673 EXPECT_EQ(0u, out.connection_attempts.size()); |
670 } | 674 } |
671 | 675 |
672 // Response with no status line. | 676 // Response with no status line. |
673 TEST_P(HttpNetworkTransactionTest, SimpleGETNoHeaders) { | 677 TEST_P(HttpNetworkTransactionTest, SimpleGETNoHeaders) { |
674 MockRead data_reads[] = { | 678 MockRead data_reads[] = { |
675 MockRead("hello world"), | 679 MockRead("hello world"), |
676 MockRead(SYNCHRONOUS, OK), | 680 MockRead(SYNCHRONOUS, OK), |
677 }; | 681 }; |
678 SimpleGetHelperResult out = SimpleGetHelper(data_reads, | 682 SimpleGetHelperResult out = SimpleGetHelper(data_reads, |
679 arraysize(data_reads)); | 683 arraysize(data_reads)); |
(...skipping 11666 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12346 EXPECT_EQ(ERR_IO_PENDING, rv); | 12350 EXPECT_EQ(ERR_IO_PENDING, rv); |
12347 | 12351 |
12348 rv = callback.WaitForResult(); | 12352 rv = callback.WaitForResult(); |
12349 EXPECT_EQ(ERR_CONNECTION_REFUSED, rv); | 12353 EXPECT_EQ(ERR_CONNECTION_REFUSED, rv); |
12350 | 12354 |
12351 EXPECT_EQ(NULL, trans->GetResponseInfo()); | 12355 EXPECT_EQ(NULL, trans->GetResponseInfo()); |
12352 | 12356 |
12353 // We don't care whether this succeeds or fails, but it shouldn't crash. | 12357 // We don't care whether this succeeds or fails, but it shouldn't crash. |
12354 HttpRequestHeaders request_headers; | 12358 HttpRequestHeaders request_headers; |
12355 trans->GetFullRequestHeaders(&request_headers); | 12359 trans->GetFullRequestHeaders(&request_headers); |
| 12360 |
| 12361 ConnectionAttempts attempts; |
| 12362 trans->GetConnectionAttempts(&attempts); |
| 12363 ASSERT_EQ(1u, attempts.size()); |
| 12364 EXPECT_EQ(ERR_CONNECTION_REFUSED, attempts[0].result); |
12356 } | 12365 } |
12357 | 12366 |
12358 TEST_P(HttpNetworkTransactionTest, HttpAsyncConnectError) { | 12367 TEST_P(HttpNetworkTransactionTest, HttpAsyncConnectError) { |
12359 HttpRequestInfo request; | 12368 HttpRequestInfo request; |
12360 request.method = "GET"; | 12369 request.method = "GET"; |
12361 request.url = GURL("http://www.example.org/"); | 12370 request.url = GURL("http://www.example.org/"); |
12362 request.load_flags = 0; | 12371 request.load_flags = 0; |
12363 | 12372 |
12364 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 12373 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
12365 scoped_ptr<HttpTransaction> trans( | 12374 scoped_ptr<HttpTransaction> trans( |
(...skipping 10 matching lines...) Expand all Loading... |
12376 EXPECT_EQ(ERR_IO_PENDING, rv); | 12385 EXPECT_EQ(ERR_IO_PENDING, rv); |
12377 | 12386 |
12378 rv = callback.WaitForResult(); | 12387 rv = callback.WaitForResult(); |
12379 EXPECT_EQ(ERR_CONNECTION_REFUSED, rv); | 12388 EXPECT_EQ(ERR_CONNECTION_REFUSED, rv); |
12380 | 12389 |
12381 EXPECT_EQ(NULL, trans->GetResponseInfo()); | 12390 EXPECT_EQ(NULL, trans->GetResponseInfo()); |
12382 | 12391 |
12383 // We don't care whether this succeeds or fails, but it shouldn't crash. | 12392 // We don't care whether this succeeds or fails, but it shouldn't crash. |
12384 HttpRequestHeaders request_headers; | 12393 HttpRequestHeaders request_headers; |
12385 trans->GetFullRequestHeaders(&request_headers); | 12394 trans->GetFullRequestHeaders(&request_headers); |
| 12395 |
| 12396 ConnectionAttempts attempts; |
| 12397 trans->GetConnectionAttempts(&attempts); |
| 12398 ASSERT_EQ(1u, attempts.size()); |
| 12399 EXPECT_EQ(ERR_CONNECTION_REFUSED, attempts[0].result); |
12386 } | 12400 } |
12387 | 12401 |
12388 TEST_P(HttpNetworkTransactionTest, HttpSyncWriteError) { | 12402 TEST_P(HttpNetworkTransactionTest, HttpSyncWriteError) { |
12389 HttpRequestInfo request; | 12403 HttpRequestInfo request; |
12390 request.method = "GET"; | 12404 request.method = "GET"; |
12391 request.url = GURL("http://www.example.org/"); | 12405 request.url = GURL("http://www.example.org/"); |
12392 request.load_flags = 0; | 12406 request.load_flags = 0; |
12393 | 12407 |
12394 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 12408 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
12395 scoped_ptr<HttpTransaction> trans( | 12409 scoped_ptr<HttpTransaction> trans( |
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12721 } | 12735 } |
12722 | 12736 |
12723 void SetPriority(RequestPriority priority) override { priority_ = priority; } | 12737 void SetPriority(RequestPriority priority) override { priority_ = priority; } |
12724 | 12738 |
12725 bool was_npn_negotiated() const override { return false; } | 12739 bool was_npn_negotiated() const override { return false; } |
12726 | 12740 |
12727 NextProto protocol_negotiated() const override { return kProtoUnknown; } | 12741 NextProto protocol_negotiated() const override { return kProtoUnknown; } |
12728 | 12742 |
12729 bool using_spdy() const override { return false; } | 12743 bool using_spdy() const override { return false; } |
12730 | 12744 |
| 12745 const ConnectionAttempts& connection_attempts() const override { |
| 12746 static ConnectionAttempts no_attempts; |
| 12747 return no_attempts; |
| 12748 } |
| 12749 |
12731 private: | 12750 private: |
12732 RequestPriority priority_; | 12751 RequestPriority priority_; |
12733 HttpStreamRequest::Delegate* const delegate_; | 12752 HttpStreamRequest::Delegate* const delegate_; |
12734 WebSocketHandshakeStreamBase::CreateHelper* websocket_stream_create_helper_; | 12753 WebSocketHandshakeStreamBase::CreateHelper* websocket_stream_create_helper_; |
12735 | 12754 |
12736 DISALLOW_COPY_AND_ASSIGN(FakeStreamRequest); | 12755 DISALLOW_COPY_AND_ASSIGN(FakeStreamRequest); |
12737 }; | 12756 }; |
12738 | 12757 |
12739 // Fake HttpStreamFactory that vends FakeStreamRequests. | 12758 // Fake HttpStreamFactory that vends FakeStreamRequests. |
12740 class FakeStreamFactory : public HttpStreamFactory { | 12759 class FakeStreamFactory : public HttpStreamFactory { |
(...skipping 1128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13869 ASSERT_TRUE(response); | 13888 ASSERT_TRUE(response); |
13870 ASSERT_TRUE(response->headers.get()); | 13889 ASSERT_TRUE(response->headers.get()); |
13871 | 13890 |
13872 EXPECT_EQ(101, response->headers->response_code()); | 13891 EXPECT_EQ(101, response->headers->response_code()); |
13873 | 13892 |
13874 trans.reset(); | 13893 trans.reset(); |
13875 session->CloseAllConnections(); | 13894 session->CloseAllConnections(); |
13876 } | 13895 } |
13877 | 13896 |
13878 } // namespace net | 13897 } // namespace net |
OLD | NEW |