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