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 2458 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2469 EXPECT_TRUE(response->auth_challenge.get() == NULL); | 2469 EXPECT_TRUE(response->auth_challenge.get() == NULL); |
| 2470 | 2470 |
| 2471 EXPECT_TRUE(trans->GetLoadTimingInfo(&load_timing_info)); | 2471 EXPECT_TRUE(trans->GetLoadTimingInfo(&load_timing_info)); |
| 2472 TestLoadTimingNotReusedWithPac(load_timing_info, | 2472 TestLoadTimingNotReusedWithPac(load_timing_info, |
| 2473 CONNECT_TIMING_HAS_SSL_TIMES); | 2473 CONNECT_TIMING_HAS_SSL_TIMES); |
| 2474 | 2474 |
| 2475 trans.reset(); | 2475 trans.reset(); |
| 2476 session->CloseAllConnections(); | 2476 session->CloseAllConnections(); |
| 2477 } | 2477 } |
| 2478 | 2478 |
| 2479 // Test the request-challenge-retry sequence for basic auth, over a keep-alive | |
| 2480 // proxy connection, when setting up an SSL tunnel. | |
|
Ryan Sleevi
2014/12/08 22:04:39
Is my reading of your deletion of this test correc
Ryan Hamilton
2014/12/08 22:51:59
... because that would be Bad (tm).
I broke this
Deprecated (see juliatuttle)
2014/12/09 15:31:15
Yes; our fake response does not have a keep-alive
asanka
2014/12/09 17:33:02
Respecting keep-alive is important for connection
Deprecated (see juliatuttle)
2014/12/10 20:38:40
Gross, but fixed.
| |
| 2481 TEST_P(HttpNetworkTransactionTest, BasicAuthProxyKeepAlive) { | |
| 2482 HttpRequestInfo request; | |
| 2483 request.method = "GET"; | |
| 2484 request.url = GURL("https://www.google.com/"); | |
| 2485 // Ensure that proxy authentication is attempted even | |
| 2486 // when the no authentication data flag is set. | |
| 2487 request.load_flags = net::LOAD_DO_NOT_SEND_AUTH_DATA; | |
| 2488 | |
| 2489 // Configure against proxy server "myproxy:70". | |
| 2490 session_deps_.proxy_service.reset(ProxyService::CreateFixed("myproxy:70")); | |
| 2491 CapturingBoundNetLog log; | |
| 2492 session_deps_.net_log = log.bound().net_log(); | |
| 2493 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | |
| 2494 | |
| 2495 scoped_ptr<HttpTransaction> trans( | |
| 2496 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | |
| 2497 | |
| 2498 // Since we have proxy, should try to establish tunnel. | |
| 2499 MockWrite data_writes1[] = { | |
| 2500 MockWrite("CONNECT www.google.com:443 HTTP/1.1\r\n" | |
| 2501 "Host: www.google.com\r\n" | |
| 2502 "Proxy-Connection: keep-alive\r\n\r\n"), | |
| 2503 | |
| 2504 // After calling trans->RestartWithAuth(), this is the request we should | |
| 2505 // be issuing -- the final header line contains the credentials. | |
| 2506 MockWrite("CONNECT www.google.com:443 HTTP/1.1\r\n" | |
| 2507 "Host: www.google.com\r\n" | |
| 2508 "Proxy-Connection: keep-alive\r\n" | |
| 2509 "Proxy-Authorization: Basic Zm9vOmJheg==\r\n\r\n"), | |
| 2510 }; | |
| 2511 | |
| 2512 // The proxy responds to the connect with a 407, using a persistent | |
| 2513 // connection. | |
| 2514 MockRead data_reads1[] = { | |
| 2515 // No credentials. | |
| 2516 MockRead("HTTP/1.1 407 Proxy Authentication Required\r\n"), | |
| 2517 MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"), | |
| 2518 MockRead("Content-Length: 10\r\n\r\n"), | |
| 2519 MockRead("0123456789"), | |
| 2520 | |
| 2521 // Wrong credentials (wrong password). | |
| 2522 MockRead("HTTP/1.1 407 Proxy Authentication Required\r\n"), | |
| 2523 MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"), | |
| 2524 MockRead("Content-Length: 10\r\n\r\n"), | |
| 2525 // No response body because the test stops reading here. | |
| 2526 MockRead(SYNCHRONOUS, ERR_UNEXPECTED), // Should not be reached. | |
| 2527 }; | |
| 2528 | |
| 2529 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | |
| 2530 data_writes1, arraysize(data_writes1)); | |
| 2531 session_deps_.socket_factory->AddSocketDataProvider(&data1); | |
| 2532 | |
| 2533 TestCompletionCallback callback1; | |
| 2534 | |
| 2535 int rv = trans->Start(&request, callback1.callback(), log.bound()); | |
| 2536 EXPECT_EQ(ERR_IO_PENDING, rv); | |
| 2537 | |
| 2538 rv = callback1.WaitForResult(); | |
| 2539 EXPECT_EQ(OK, rv); | |
| 2540 net::CapturingNetLog::CapturedEntryList entries; | |
| 2541 log.GetEntries(&entries); | |
| 2542 size_t pos = ExpectLogContainsSomewhere( | |
| 2543 entries, 0, NetLog::TYPE_HTTP_TRANSACTION_SEND_TUNNEL_HEADERS, | |
| 2544 NetLog::PHASE_NONE); | |
| 2545 ExpectLogContainsSomewhere( | |
| 2546 entries, pos, | |
| 2547 NetLog::TYPE_HTTP_TRANSACTION_READ_TUNNEL_RESPONSE_HEADERS, | |
| 2548 NetLog::PHASE_NONE); | |
| 2549 | |
| 2550 const HttpResponseInfo* response = trans->GetResponseInfo(); | |
| 2551 ASSERT_TRUE(response != NULL); | |
| 2552 ASSERT_FALSE(response->headers.get() == NULL); | |
| 2553 EXPECT_TRUE(response->headers->IsKeepAlive()); | |
| 2554 EXPECT_EQ(407, response->headers->response_code()); | |
| 2555 EXPECT_EQ(10, response->headers->GetContentLength()); | |
| 2556 EXPECT_TRUE(HttpVersion(1, 1) == response->headers->GetHttpVersion()); | |
| 2557 EXPECT_TRUE(CheckBasicProxyAuth(response->auth_challenge.get())); | |
| 2558 | |
| 2559 TestCompletionCallback callback2; | |
| 2560 | |
| 2561 // Wrong password (should be "bar"). | |
| 2562 rv = trans->RestartWithAuth( | |
| 2563 AuthCredentials(kFoo, kBaz), callback2.callback()); | |
| 2564 EXPECT_EQ(ERR_IO_PENDING, rv); | |
| 2565 | |
| 2566 rv = callback2.WaitForResult(); | |
| 2567 EXPECT_EQ(OK, rv); | |
| 2568 | |
| 2569 response = trans->GetResponseInfo(); | |
| 2570 ASSERT_TRUE(response != NULL); | |
| 2571 ASSERT_FALSE(response->headers.get() == NULL); | |
| 2572 EXPECT_TRUE(response->headers->IsKeepAlive()); | |
| 2573 EXPECT_EQ(407, response->headers->response_code()); | |
| 2574 EXPECT_EQ(10, response->headers->GetContentLength()); | |
| 2575 EXPECT_TRUE(HttpVersion(1, 1) == response->headers->GetHttpVersion()); | |
| 2576 EXPECT_TRUE(CheckBasicProxyAuth(response->auth_challenge.get())); | |
| 2577 | |
| 2578 // Flush the idle socket before the NetLog and HttpNetworkTransaction go | |
| 2579 // out of scope. | |
| 2580 session->CloseAllConnections(); | |
| 2581 } | |
| 2582 | |
| 2583 // Test that we don't read the response body when we fail to establish a tunnel, | 2479 // Test that we don't read the response body when we fail to establish a tunnel, |
| 2584 // even if the user cancels the proxy's auth attempt. | 2480 // even if the user cancels the proxy's auth attempt. |
| 2585 TEST_P(HttpNetworkTransactionTest, BasicAuthProxyCancelTunnel) { | 2481 TEST_P(HttpNetworkTransactionTest, BasicAuthProxyCancelTunnel) { |
| 2586 HttpRequestInfo request; | 2482 HttpRequestInfo request; |
| 2587 request.method = "GET"; | 2483 request.method = "GET"; |
| 2588 request.url = GURL("https://www.google.com/"); | 2484 request.url = GURL("https://www.google.com/"); |
| 2589 request.load_flags = 0; | 2485 request.load_flags = 0; |
| 2590 | 2486 |
| 2591 // Configure against proxy server "myproxy:70". | 2487 // Configure against proxy server "myproxy:70". |
| 2592 session_deps_.proxy_service.reset(ProxyService::CreateFixed("myproxy:70")); | 2488 session_deps_.proxy_service.reset(ProxyService::CreateFixed("myproxy:70")); |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 2619 | 2515 |
| 2620 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 2516 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
| 2621 EXPECT_EQ(ERR_IO_PENDING, rv); | 2517 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 2622 | 2518 |
| 2623 rv = callback.WaitForResult(); | 2519 rv = callback.WaitForResult(); |
| 2624 EXPECT_EQ(OK, rv); | 2520 EXPECT_EQ(OK, rv); |
| 2625 | 2521 |
| 2626 const HttpResponseInfo* response = trans->GetResponseInfo(); | 2522 const HttpResponseInfo* response = trans->GetResponseInfo(); |
| 2627 ASSERT_TRUE(response != NULL); | 2523 ASSERT_TRUE(response != NULL); |
| 2628 | 2524 |
| 2629 EXPECT_TRUE(response->headers->IsKeepAlive()); | |
| 2630 EXPECT_EQ(407, response->headers->response_code()); | 2525 EXPECT_EQ(407, response->headers->response_code()); |
| 2631 EXPECT_EQ(10, response->headers->GetContentLength()); | 2526 EXPECT_EQ(0, response->headers->GetContentLength()); |
| 2632 EXPECT_TRUE(HttpVersion(1, 1) == response->headers->GetHttpVersion()); | |
| 2633 | 2527 |
| 2634 std::string response_data; | 2528 std::string response_data; |
| 2635 rv = ReadTransaction(trans.get(), &response_data); | 2529 rv = ReadTransaction(trans.get(), &response_data); |
| 2636 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, rv); | 2530 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, rv); |
| 2637 | 2531 |
| 2638 // Flush the idle socket before the HttpNetworkTransaction goes out of scope. | 2532 // Flush the idle socket before the HttpNetworkTransaction goes out of scope. |
| 2639 session->CloseAllConnections(); | 2533 session->CloseAllConnections(); |
| 2640 } | 2534 } |
| 2641 | 2535 |
| 2642 // Test when a server (non-proxy) returns a 407 (proxy-authenticate). | 2536 // Test when a server (non-proxy) returns a 407 (proxy-authenticate). |
| (...skipping 1469 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4112 ConnectStatusHelper(MockRead("HTTP/1.1 405 Method Not Allowed\r\n")); | 4006 ConnectStatusHelper(MockRead("HTTP/1.1 405 Method Not Allowed\r\n")); |
| 4113 } | 4007 } |
| 4114 | 4008 |
| 4115 TEST_P(HttpNetworkTransactionTest, ConnectStatus406) { | 4009 TEST_P(HttpNetworkTransactionTest, ConnectStatus406) { |
| 4116 ConnectStatusHelper(MockRead("HTTP/1.1 406 Not Acceptable\r\n")); | 4010 ConnectStatusHelper(MockRead("HTTP/1.1 406 Not Acceptable\r\n")); |
| 4117 } | 4011 } |
| 4118 | 4012 |
| 4119 TEST_P(HttpNetworkTransactionTest, ConnectStatus407) { | 4013 TEST_P(HttpNetworkTransactionTest, ConnectStatus407) { |
| 4120 ConnectStatusHelperWithExpectedStatus( | 4014 ConnectStatusHelperWithExpectedStatus( |
| 4121 MockRead("HTTP/1.1 407 Proxy Authentication Required\r\n"), | 4015 MockRead("HTTP/1.1 407 Proxy Authentication Required\r\n"), |
| 4122 ERR_PROXY_AUTH_UNSUPPORTED); | 4016 ERR_TUNNEL_CONNECTION_FAILED); |
| 4123 } | 4017 } |
| 4124 | 4018 |
| 4125 TEST_P(HttpNetworkTransactionTest, ConnectStatus408) { | 4019 TEST_P(HttpNetworkTransactionTest, ConnectStatus408) { |
| 4126 ConnectStatusHelper(MockRead("HTTP/1.1 408 Request Timeout\r\n")); | 4020 ConnectStatusHelper(MockRead("HTTP/1.1 408 Request Timeout\r\n")); |
| 4127 } | 4021 } |
| 4128 | 4022 |
| 4129 TEST_P(HttpNetworkTransactionTest, ConnectStatus409) { | 4023 TEST_P(HttpNetworkTransactionTest, ConnectStatus409) { |
| 4130 ConnectStatusHelper(MockRead("HTTP/1.1 409 Conflict\r\n")); | 4024 ConnectStatusHelper(MockRead("HTTP/1.1 409 Conflict\r\n")); |
| 4131 } | 4025 } |
| 4132 | 4026 |
| (...skipping 9054 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 13187 EXPECT_EQ(ERR_IO_PENDING, rv); | 13081 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 13188 | 13082 |
| 13189 rv = callback.WaitForResult(); | 13083 rv = callback.WaitForResult(); |
| 13190 EXPECT_EQ(ERR_CONNECTION_RESET, rv); | 13084 EXPECT_EQ(ERR_CONNECTION_RESET, rv); |
| 13191 | 13085 |
| 13192 const HttpResponseInfo* response = trans->GetResponseInfo(); | 13086 const HttpResponseInfo* response = trans->GetResponseInfo(); |
| 13193 EXPECT_TRUE(response == NULL); | 13087 EXPECT_TRUE(response == NULL); |
| 13194 } | 13088 } |
| 13195 | 13089 |
| 13196 } // namespace net | 13090 } // namespace net |
| OLD | NEW |