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 459 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
470 | 470 |
471 private: | 471 private: |
472 bool observed_before_proxy_headers_sent_; | 472 bool observed_before_proxy_headers_sent_; |
473 std::string observed_proxy_server_uri_; | 473 std::string observed_proxy_server_uri_; |
474 | 474 |
475 DISALLOW_COPY_AND_ASSIGN(BeforeProxyHeadersSentHandler); | 475 DISALLOW_COPY_AND_ASSIGN(BeforeProxyHeadersSentHandler); |
476 }; | 476 }; |
477 | 477 |
478 // Fill |str| with a long header list that consumes >= |size| bytes. | 478 // Fill |str| with a long header list that consumes >= |size| bytes. |
479 void FillLargeHeadersString(std::string* str, int size) { | 479 void FillLargeHeadersString(std::string* str, int size) { |
480 const char* row = | 480 const char row[] = |
481 "SomeHeaderName: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n"; | 481 "SomeHeaderName: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n"; |
482 const int sizeof_row = strlen(row); | 482 const int sizeof_row = strlen(row); |
483 const int num_rows = static_cast<int>( | 483 const int num_rows = static_cast<int>( |
484 ceil(static_cast<float>(size) / sizeof_row)); | 484 ceil(static_cast<float>(size) / sizeof_row)); |
485 const int sizeof_data = num_rows * sizeof_row; | 485 const int sizeof_data = num_rows * sizeof_row; |
486 DCHECK(sizeof_data >= size); | 486 DCHECK(sizeof_data >= size); |
487 str->reserve(sizeof_data); | 487 str->reserve(sizeof_data); |
488 | 488 |
489 for (int i = 0; i < num_rows; ++i) | 489 for (int i = 0; i < num_rows; ++i) |
490 str->append(row, sizeof_row); | 490 str->append(row, sizeof_row); |
(...skipping 815 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1306 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 1306 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
1307 | 1307 |
1308 MockRead data2_reads[] = { | 1308 MockRead data2_reads[] = { |
1309 MockRead("HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\n"), | 1309 MockRead("HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\n"), |
1310 MockRead("world"), | 1310 MockRead("world"), |
1311 MockRead(ASYNC, OK), | 1311 MockRead(ASYNC, OK), |
1312 }; | 1312 }; |
1313 StaticSocketDataProvider data2(data2_reads, arraysize(data2_reads), NULL, 0); | 1313 StaticSocketDataProvider data2(data2_reads, arraysize(data2_reads), NULL, 0); |
1314 session_deps_.socket_factory->AddSocketDataProvider(&data2); | 1314 session_deps_.socket_factory->AddSocketDataProvider(&data2); |
1315 | 1315 |
1316 const char* kExpectedResponseData[] = { | 1316 const char* const kExpectedResponseData[] = { |
1317 "hello", "world" | 1317 "hello", "world" |
1318 }; | 1318 }; |
1319 | 1319 |
1320 uint32 first_socket_log_id = NetLog::Source::kInvalidId; | 1320 uint32 first_socket_log_id = NetLog::Source::kInvalidId; |
1321 for (int i = 0; i < 2; ++i) { | 1321 for (int i = 0; i < 2; ++i) { |
1322 TestCompletionCallback callback; | 1322 TestCompletionCallback callback; |
1323 | 1323 |
1324 scoped_ptr<HttpTransaction> trans( | 1324 scoped_ptr<HttpTransaction> trans( |
1325 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 1325 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
1326 | 1326 |
(...skipping 2091 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3418 session_deps_.net_log = log.bound().net_log(); | 3418 session_deps_.net_log = log.bound().net_log(); |
3419 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 3419 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
3420 | 3420 |
3421 scoped_ptr<HttpTransaction> trans( | 3421 scoped_ptr<HttpTransaction> trans( |
3422 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 3422 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
3423 | 3423 |
3424 // CONNECT to www.google.com:443 via SPDY | 3424 // CONNECT to www.google.com:443 via SPDY |
3425 scoped_ptr<SpdyFrame> connect(spdy_util_.ConstructSpdyConnect( | 3425 scoped_ptr<SpdyFrame> connect(spdy_util_.ConstructSpdyConnect( |
3426 NULL, 0, 1, LOWEST, HostPortPair("www.google.com", 443))); | 3426 NULL, 0, 1, LOWEST, HostPortPair("www.google.com", 443))); |
3427 // fetch https://www.google.com/ via SPDY | 3427 // fetch https://www.google.com/ via SPDY |
3428 const char* const kMyUrl = "https://www.google.com/"; | 3428 const char kMyUrl[] = "https://www.google.com/"; |
3429 scoped_ptr<SpdyFrame> get( | 3429 scoped_ptr<SpdyFrame> get( |
3430 spdy_util_.ConstructSpdyGet(kMyUrl, false, 1, LOWEST)); | 3430 spdy_util_.ConstructSpdyGet(kMyUrl, false, 1, LOWEST)); |
3431 scoped_ptr<SpdyFrame> wrapped_get( | 3431 scoped_ptr<SpdyFrame> wrapped_get( |
3432 spdy_util_.ConstructWrappedSpdyFrame(get, 1)); | 3432 spdy_util_.ConstructWrappedSpdyFrame(get, 1)); |
3433 scoped_ptr<SpdyFrame> conn_resp( | 3433 scoped_ptr<SpdyFrame> conn_resp( |
3434 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 3434 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
3435 scoped_ptr<SpdyFrame> get_resp( | 3435 scoped_ptr<SpdyFrame> get_resp( |
3436 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 3436 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
3437 scoped_ptr<SpdyFrame> wrapped_get_resp( | 3437 scoped_ptr<SpdyFrame> wrapped_get_resp( |
3438 spdy_util_.ConstructWrappedSpdyFrame(get_resp, 1)); | 3438 spdy_util_.ConstructWrappedSpdyFrame(get_resp, 1)); |
(...skipping 1704 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5143 MockWrite data_writes2[] = { | 5143 MockWrite data_writes2[] = { |
5144 MockWrite(SYNCHRONOUS, 93), // POST | 5144 MockWrite(SYNCHRONOUS, 93), // POST |
5145 MockWrite(SYNCHRONOUS, 3), // POST data | 5145 MockWrite(SYNCHRONOUS, 3), // POST data |
5146 }; | 5146 }; |
5147 StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2), | 5147 StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2), |
5148 data_writes2, arraysize(data_writes2)); | 5148 data_writes2, arraysize(data_writes2)); |
5149 | 5149 |
5150 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 5150 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
5151 session_deps_.socket_factory->AddSocketDataProvider(&data2); | 5151 session_deps_.socket_factory->AddSocketDataProvider(&data2); |
5152 | 5152 |
5153 const char* kExpectedResponseData[] = { | 5153 const char* const kExpectedResponseData[] = { |
5154 "hello world", "welcome" | 5154 "hello world", "welcome" |
5155 }; | 5155 }; |
5156 | 5156 |
5157 for (int i = 0; i < 2; ++i) { | 5157 for (int i = 0; i < 2; ++i) { |
5158 scoped_ptr<HttpTransaction> trans( | 5158 scoped_ptr<HttpTransaction> trans( |
5159 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 5159 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
5160 | 5160 |
5161 TestCompletionCallback callback; | 5161 TestCompletionCallback callback; |
5162 | 5162 |
5163 int rv = trans->Start(&request[i], callback.callback(), BoundNetLog()); | 5163 int rv = trans->Start(&request[i], callback.callback(), BoundNetLog()); |
(...skipping 1327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6491 | 6491 |
6492 MockWrite spdy_writes[] = { | 6492 MockWrite spdy_writes[] = { |
6493 CreateMockWrite(*req, 1, ASYNC), | 6493 CreateMockWrite(*req, 1, ASYNC), |
6494 CreateMockWrite(*rst, 4, ASYNC), | 6494 CreateMockWrite(*rst, 4, ASYNC), |
6495 CreateMockWrite(*connect2, 5), | 6495 CreateMockWrite(*connect2, 5), |
6496 CreateMockWrite(*wrapped_get, 8), | 6496 CreateMockWrite(*wrapped_get, 8), |
6497 }; | 6497 }; |
6498 | 6498 |
6499 // The proxy responds to the connect with a 407, using a persistent | 6499 // The proxy responds to the connect with a 407, using a persistent |
6500 // connection. | 6500 // connection. |
6501 const char* const kAuthStatus = "407"; | 6501 const char kAuthStatus[] = "407"; |
6502 const char* const kAuthChallenge[] = { | 6502 const char* const kAuthChallenge[] = { |
6503 "proxy-authenticate", "Basic realm=\"MyRealm1\"", | 6503 "proxy-authenticate", "Basic realm=\"MyRealm1\"", |
6504 }; | 6504 }; |
6505 scoped_ptr<SpdyFrame> conn_auth_resp(spdy_util_.ConstructSpdySynReplyError( | 6505 scoped_ptr<SpdyFrame> conn_auth_resp(spdy_util_.ConstructSpdySynReplyError( |
6506 kAuthStatus, kAuthChallenge, arraysize(kAuthChallenge) / 2, 1)); | 6506 kAuthStatus, kAuthChallenge, arraysize(kAuthChallenge) / 2, 1)); |
6507 | 6507 |
6508 scoped_ptr<SpdyFrame> conn_resp( | 6508 scoped_ptr<SpdyFrame> conn_resp( |
6509 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); | 6509 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); |
6510 const char resp[] = "HTTP/1.1 200 OK\r\n" | 6510 const char resp[] = "HTTP/1.1 200 OK\r\n" |
6511 "Content-Length: 5\r\n\r\n"; | 6511 "Content-Length: 5\r\n\r\n"; |
(...skipping 3030 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9542 MockWrite write; | 9542 MockWrite write; |
9543 MockRead read; | 9543 MockRead read; |
9544 int expected_rv; | 9544 int expected_rv; |
9545 const MockWrite* extra_write; | 9545 const MockWrite* extra_write; |
9546 const MockRead* extra_read; | 9546 const MockRead* extra_read; |
9547 }; | 9547 }; |
9548 | 9548 |
9549 static const int kNoSSL = 500; | 9549 static const int kNoSSL = 500; |
9550 | 9550 |
9551 struct TestConfig { | 9551 struct TestConfig { |
9552 const char* proxy_url; | 9552 const char* const proxy_url; |
9553 AuthTiming proxy_auth_timing; | 9553 AuthTiming proxy_auth_timing; |
9554 int proxy_auth_rv; | 9554 int proxy_auth_rv; |
9555 const char* server_url; | 9555 const char* const server_url; |
9556 AuthTiming server_auth_timing; | 9556 AuthTiming server_auth_timing; |
9557 int server_auth_rv; | 9557 int server_auth_rv; |
9558 int num_auth_rounds; | 9558 int num_auth_rounds; |
9559 int first_ssl_round; | 9559 int first_ssl_round; |
9560 TestRound rounds[3]; | 9560 TestRound rounds[3]; |
9561 } test_configs[] = { | 9561 } test_configs[] = { |
9562 // Non-authenticating HTTP server with a direct connection. | 9562 // Non-authenticating HTTP server with a direct connection. |
9563 { NULL, AUTH_NONE, OK, kServer, AUTH_NONE, OK, 1, kNoSSL, | 9563 { NULL, AUTH_NONE, OK, kServer, AUTH_NONE, OK, 1, kNoSSL, |
9564 { TestRound(kGet, kSuccess, OK)}}, | 9564 { TestRound(kGet, kSuccess, OK)}}, |
9565 // Authenticating HTTP server with a direct connection. | 9565 // Authenticating HTTP server with a direct connection. |
(...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9927 kServerChallenge, | 9927 kServerChallenge, |
9928 // Fourth round | 9928 // Fourth round |
9929 kSuccess, | 9929 kSuccess, |
9930 // Competing response | 9930 // Competing response |
9931 kSuccess, | 9931 kSuccess, |
9932 }; | 9932 }; |
9933 StaticSocketDataProvider data_provider(reads, arraysize(reads), | 9933 StaticSocketDataProvider data_provider(reads, arraysize(reads), |
9934 writes, arraysize(writes)); | 9934 writes, arraysize(writes)); |
9935 session_deps_.socket_factory->AddSocketDataProvider(&data_provider); | 9935 session_deps_.socket_factory->AddSocketDataProvider(&data_provider); |
9936 | 9936 |
9937 const char* const kSocketGroup = "www.example.com:80"; | 9937 const char kSocketGroup[] = "www.example.com:80"; |
9938 | 9938 |
9939 // First round of authentication. | 9939 // First round of authentication. |
9940 auth_handler->SetGenerateExpectation(false, OK); | 9940 auth_handler->SetGenerateExpectation(false, OK); |
9941 rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 9941 rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
9942 if (rv == ERR_IO_PENDING) | 9942 if (rv == ERR_IO_PENDING) |
9943 rv = callback.WaitForResult(); | 9943 rv = callback.WaitForResult(); |
9944 EXPECT_EQ(OK, rv); | 9944 EXPECT_EQ(OK, rv); |
9945 response = trans->GetResponseInfo(); | 9945 response = trans->GetResponseInfo(); |
9946 ASSERT_TRUE(response != NULL); | 9946 ASSERT_TRUE(response != NULL); |
9947 EXPECT_FALSE(response->auth_challenge.get() == NULL); | 9947 EXPECT_FALSE(response->auth_challenge.get() == NULL); |
(...skipping 3608 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13556 ASSERT_TRUE(response); | 13556 ASSERT_TRUE(response); |
13557 ASSERT_TRUE(response->headers.get()); | 13557 ASSERT_TRUE(response->headers.get()); |
13558 | 13558 |
13559 EXPECT_EQ(101, response->headers->response_code()); | 13559 EXPECT_EQ(101, response->headers->response_code()); |
13560 | 13560 |
13561 trans.reset(); | 13561 trans.reset(); |
13562 session->CloseAllConnections(); | 13562 session->CloseAllConnections(); |
13563 } | 13563 } |
13564 | 13564 |
13565 } // namespace net | 13565 } // namespace net |
OLD | NEW |