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 2534 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2545 ExpectLogContainsSomewhere( | 2545 ExpectLogContainsSomewhere( |
| 2546 entries, pos, | 2546 entries, pos, |
| 2547 NetLog::TYPE_HTTP_TRANSACTION_READ_TUNNEL_RESPONSE_HEADERS, | 2547 NetLog::TYPE_HTTP_TRANSACTION_READ_TUNNEL_RESPONSE_HEADERS, |
| 2548 NetLog::PHASE_NONE); | 2548 NetLog::PHASE_NONE); |
| 2549 | 2549 |
| 2550 const HttpResponseInfo* response = trans->GetResponseInfo(); | 2550 const HttpResponseInfo* response = trans->GetResponseInfo(); |
| 2551 ASSERT_TRUE(response != NULL); | 2551 ASSERT_TRUE(response != NULL); |
| 2552 ASSERT_FALSE(response->headers.get() == NULL); | 2552 ASSERT_FALSE(response->headers.get() == NULL); |
| 2553 EXPECT_TRUE(response->headers->IsKeepAlive()); | 2553 EXPECT_TRUE(response->headers->IsKeepAlive()); |
| 2554 EXPECT_EQ(407, response->headers->response_code()); | 2554 EXPECT_EQ(407, response->headers->response_code()); |
| 2555 EXPECT_EQ(10, response->headers->GetContentLength()); | |
| 2556 EXPECT_TRUE(HttpVersion(1, 1) == response->headers->GetHttpVersion()); | 2555 EXPECT_TRUE(HttpVersion(1, 1) == response->headers->GetHttpVersion()); |
| 2557 EXPECT_TRUE(CheckBasicProxyAuth(response->auth_challenge.get())); | 2556 EXPECT_TRUE(CheckBasicProxyAuth(response->auth_challenge.get())); |
| 2558 | 2557 |
| 2559 TestCompletionCallback callback2; | 2558 TestCompletionCallback callback2; |
| 2560 | 2559 |
| 2561 // Wrong password (should be "bar"). | 2560 // Wrong password (should be "bar"). |
| 2562 rv = trans->RestartWithAuth( | 2561 rv = trans->RestartWithAuth( |
| 2563 AuthCredentials(kFoo, kBaz), callback2.callback()); | 2562 AuthCredentials(kFoo, kBaz), callback2.callback()); |
| 2564 EXPECT_EQ(ERR_IO_PENDING, rv); | 2563 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 2565 | 2564 |
| 2566 rv = callback2.WaitForResult(); | 2565 rv = callback2.WaitForResult(); |
| 2567 EXPECT_EQ(OK, rv); | 2566 EXPECT_EQ(OK, rv); |
| 2568 | 2567 |
| 2569 response = trans->GetResponseInfo(); | 2568 response = trans->GetResponseInfo(); |
| 2570 ASSERT_TRUE(response != NULL); | 2569 ASSERT_TRUE(response != NULL); |
| 2571 ASSERT_FALSE(response->headers.get() == NULL); | 2570 ASSERT_FALSE(response->headers.get() == NULL); |
| 2572 EXPECT_TRUE(response->headers->IsKeepAlive()); | 2571 EXPECT_TRUE(response->headers->IsKeepAlive()); |
| 2573 EXPECT_EQ(407, response->headers->response_code()); | 2572 EXPECT_EQ(407, response->headers->response_code()); |
| 2574 EXPECT_EQ(10, response->headers->GetContentLength()); | |
| 2575 EXPECT_TRUE(HttpVersion(1, 1) == response->headers->GetHttpVersion()); | 2573 EXPECT_TRUE(HttpVersion(1, 1) == response->headers->GetHttpVersion()); |
| 2576 EXPECT_TRUE(CheckBasicProxyAuth(response->auth_challenge.get())); | 2574 EXPECT_TRUE(CheckBasicProxyAuth(response->auth_challenge.get())); |
| 2577 | 2575 |
| 2578 // Flush the idle socket before the NetLog and HttpNetworkTransaction go | 2576 // Flush the idle socket before the NetLog and HttpNetworkTransaction go |
| 2579 // out of scope. | 2577 // out of scope. |
| 2580 session->CloseAllConnections(); | 2578 session->CloseAllConnections(); |
| 2581 } | 2579 } |
| 2582 | 2580 |
| 2583 // Test that we don't read the response body when we fail to establish a tunnel, | 2581 // 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. | 2582 // even if the user cancels the proxy's auth attempt. |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2621 EXPECT_EQ(ERR_IO_PENDING, rv); | 2619 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 2622 | 2620 |
| 2623 rv = callback.WaitForResult(); | 2621 rv = callback.WaitForResult(); |
| 2624 EXPECT_EQ(OK, rv); | 2622 EXPECT_EQ(OK, rv); |
| 2625 | 2623 |
| 2626 const HttpResponseInfo* response = trans->GetResponseInfo(); | 2624 const HttpResponseInfo* response = trans->GetResponseInfo(); |
| 2627 ASSERT_TRUE(response != NULL); | 2625 ASSERT_TRUE(response != NULL); |
| 2628 | 2626 |
| 2629 EXPECT_TRUE(response->headers->IsKeepAlive()); | 2627 EXPECT_TRUE(response->headers->IsKeepAlive()); |
| 2630 EXPECT_EQ(407, response->headers->response_code()); | 2628 EXPECT_EQ(407, response->headers->response_code()); |
| 2631 EXPECT_EQ(10, response->headers->GetContentLength()); | |
| 2632 EXPECT_TRUE(HttpVersion(1, 1) == response->headers->GetHttpVersion()); | 2629 EXPECT_TRUE(HttpVersion(1, 1) == response->headers->GetHttpVersion()); |
| 2633 | 2630 |
| 2634 std::string response_data; | 2631 std::string response_data; |
| 2635 rv = ReadTransaction(trans.get(), &response_data); | 2632 rv = ReadTransaction(trans.get(), &response_data); |
| 2636 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, rv); | 2633 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, rv); |
| 2637 | 2634 |
| 2638 // Flush the idle socket before the HttpNetworkTransaction goes out of scope. | 2635 // Flush the idle socket before the HttpNetworkTransaction goes out of scope. |
| 2639 session->CloseAllConnections(); | 2636 session->CloseAllConnections(); |
| 2640 } | 2637 } |
| 2641 | 2638 |
| 2639 // Test that we don't pass extraneous headers from the proxy's response to the | |
| 2640 // caller when the proxy responds to CONNECT with 407. | |
| 2641 TEST_P(HttpNetworkTransactionTest, SanitizeProxyAuthHeaders) { | |
| 2642 HttpRequestInfo request; | |
| 2643 request.method = "GET"; | |
| 2644 request.url = GURL("https://www.google.com/"); | |
| 2645 request.load_flags = 0; | |
| 2646 | |
| 2647 // Configure against proxy server "myproxy:70". | |
| 2648 session_deps_.proxy_service.reset(ProxyService::CreateFixed("myproxy:70")); | |
| 2649 | |
| 2650 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | |
| 2651 | |
| 2652 scoped_ptr<HttpTransaction> trans( | |
| 2653 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | |
| 2654 | |
| 2655 // Since we have proxy, should try to establish tunnel. | |
| 2656 MockWrite data_writes[] = { | |
| 2657 MockWrite( | |
| 2658 "CONNECT www.google.com:443 HTTP/1.1\r\n" | |
| 2659 "Host: www.google.com\r\n" | |
| 2660 "Proxy-Connection: keep-alive\r\n\r\n"), | |
| 2661 }; | |
| 2662 | |
| 2663 // The proxy responds to the connect with a 407. | |
| 2664 MockRead data_reads[] = { | |
| 2665 MockRead("HTTP/1.1 407 Proxy Authentication Required\r\n"), | |
| 2666 MockRead("X-Foo: bar\r\n"), | |
| 2667 MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"), | |
| 2668 MockRead("Content-Length: 10\r\n\r\n"), | |
| 2669 MockRead(SYNCHRONOUS, ERR_UNEXPECTED), // Should not be reached. | |
|
Ryan Sleevi
2014/12/17 22:37:12
Wait, why shouldn't it be reached? We should drain
| |
| 2670 }; | |
| 2671 | |
| 2672 StaticSocketDataProvider data(data_reads, arraysize(data_reads), data_writes, | |
| 2673 arraysize(data_writes)); | |
| 2674 session_deps_.socket_factory->AddSocketDataProvider(&data); | |
| 2675 | |
| 2676 TestCompletionCallback callback; | |
| 2677 | |
| 2678 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | |
| 2679 EXPECT_EQ(ERR_IO_PENDING, rv); | |
| 2680 | |
| 2681 rv = callback.WaitForResult(); | |
| 2682 EXPECT_EQ(OK, rv); | |
| 2683 | |
| 2684 const HttpResponseInfo* response = trans->GetResponseInfo(); | |
| 2685 ASSERT_TRUE(response != NULL); | |
| 2686 | |
| 2687 EXPECT_TRUE(response->headers->IsKeepAlive()); | |
| 2688 EXPECT_EQ(407, response->headers->response_code()); | |
| 2689 EXPECT_TRUE(HttpVersion(1, 1) == response->headers->GetHttpVersion()); | |
| 2690 EXPECT_FALSE(response->headers->HasHeaderValue("X-Foo", "bar")); | |
| 2691 | |
| 2692 std::string response_data; | |
| 2693 rv = ReadTransaction(trans.get(), &response_data); | |
| 2694 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, rv); | |
| 2695 | |
| 2696 // Flush the idle socket before the HttpNetworkTransaction goes out of scope. | |
| 2697 session->CloseAllConnections(); | |
| 2698 } | |
| 2699 | |
| 2642 // Test when a server (non-proxy) returns a 407 (proxy-authenticate). | 2700 // Test when a server (non-proxy) returns a 407 (proxy-authenticate). |
| 2643 // The request should fail with ERR_UNEXPECTED_PROXY_AUTH. | 2701 // The request should fail with ERR_UNEXPECTED_PROXY_AUTH. |
| 2644 TEST_P(HttpNetworkTransactionTest, UnexpectedProxyAuth) { | 2702 TEST_P(HttpNetworkTransactionTest, UnexpectedProxyAuth) { |
| 2645 HttpRequestInfo request; | 2703 HttpRequestInfo request; |
| 2646 request.method = "GET"; | 2704 request.method = "GET"; |
| 2647 request.url = GURL("http://www.google.com/"); | 2705 request.url = GURL("http://www.google.com/"); |
| 2648 request.load_flags = 0; | 2706 request.load_flags = 0; |
| 2649 | 2707 |
| 2650 // We are using a DIRECT connection (i.e. no proxy) for this session. | 2708 // We are using a DIRECT connection (i.e. no proxy) for this session. |
| 2651 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 2709 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
| (...skipping 10535 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 13187 EXPECT_EQ(ERR_IO_PENDING, rv); | 13245 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 13188 | 13246 |
| 13189 rv = callback.WaitForResult(); | 13247 rv = callback.WaitForResult(); |
| 13190 EXPECT_EQ(ERR_CONNECTION_RESET, rv); | 13248 EXPECT_EQ(ERR_CONNECTION_RESET, rv); |
| 13191 | 13249 |
| 13192 const HttpResponseInfo* response = trans->GetResponseInfo(); | 13250 const HttpResponseInfo* response = trans->GetResponseInfo(); |
| 13193 EXPECT_TRUE(response == NULL); | 13251 EXPECT_TRUE(response == NULL); |
| 13194 } | 13252 } |
| 13195 | 13253 |
| 13196 } // namespace net | 13254 } // namespace net |
| OLD | NEW |