http_network_layer_unittest.cc revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_network_layer.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/stringprintf.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_log.h" 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/mock_cert_verifier.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_network_session.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_server_properties_impl.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_transaction_unittest.h" 147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "net/http/transport_security_state.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_service.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/socket_test_util.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/spdy/spdy_session_pool.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/ssl/ssl_config_service_defaults.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/platform_test.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpNetworkLayerTest : public PlatformTest { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpNetworkLayerTest() : ssl_config_service_(new SSLConfigServiceDefaults) {} 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConfigureTestDependencies(ProxyService::CreateDirect()); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ConfigureTestDependencies(ProxyService* proxy_service) { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cert_verifier_.reset(new MockCertVerifier); 367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) transport_security_state_.reset(new TransportSecurityState); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proxy_service_.reset(proxy_service); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpNetworkSession::Params session_params; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_params.client_socket_factory = &mock_socket_factory_; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_params.host_resolver = &host_resolver_; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_params.cert_verifier = cert_verifier_.get(); 427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) session_params.transport_security_state = transport_security_state_.get(); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_params.proxy_service = proxy_service_.get(); 44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) session_params.ssl_config_service = ssl_config_service_.get(); 45ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch session_params.http_server_properties = 46ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch http_server_properties_.GetWeakPtr(); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_session_ = new HttpNetworkSession(session_params); 48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) factory_.reset(new HttpNetworkLayer(network_session_.get())); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined (SPDY_PROXY_AUTH_ORIGIN) 521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::string GetChromeProxy() { 531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return HostPortPair::FromURL(GURL(SPDY_PROXY_AUTH_ORIGIN)).ToString(); 541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif 561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) void ExecuteRequestExpectingContentAndHeader(const std::string& content, 588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string& header, 598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string& value) { 608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) TestCompletionCallback callback; 618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) HttpRequestInfo request_info; 638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) request_info.url = GURL("http://www.google.com/"); 648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) request_info.method = "GET"; 658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) request_info.load_flags = LOAD_NORMAL; 668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<HttpTransaction> trans; 688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) int rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans, NULL); 698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(OK, rv); 708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) rv = trans->Start(&request_info, callback.callback(), BoundNetLog()); 728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (rv == ERR_IO_PENDING) 738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) rv = callback.WaitForResult(); 748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ASSERT_EQ(OK, rv); 758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::string contents; 778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) rv = ReadTransaction(trans.get(), &contents); 788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(OK, rv); 798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(content, contents); 808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (!header.empty()) { 828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // We also have a server header here that isn't set by the proxy. 838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_TRUE(trans->GetResponseInfo()->headers->HasHeaderValue( 848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) header, value)); 858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Check that |proxy_count| proxies are in the retry list. 891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // These will be, in order, |bad_proxy| and |bad_proxy2|". 901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) void TestBadProxies(unsigned int proxy_count, const std::string& bad_proxy, 911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const std::string& bad_proxy2) { 928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const ProxyRetryInfoMap& retry_info = proxy_service_->proxy_retry_info(); 938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ASSERT_EQ(proxy_count, retry_info.size()); 941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ASSERT_TRUE(retry_info.find(bad_proxy) != retry_info.end()); 958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (proxy_count > 1) 961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ASSERT_TRUE(retry_info.find(bad_proxy2) != retry_info.end()); 978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Simulates a request through a proxy which returns a bypass, which is then 1008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // retried through a second proxy that doesn't bypass. 1018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Checks that the expected requests were issued, the expected content was 1021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // recieved, and the first proxy |bad_proxy| was marked as bad. 1031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) void TestProxyFallback(const std::string& bad_proxy) { 1048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead data_reads[] = { 1058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead("HTTP/1.1 200 OK\r\n" 1068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) "Connection: proxy-bypass\r\n\r\n"), 1078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead("Bypass message"), 1088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead(SYNCHRONOUS, OK), 1098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) }; 1101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) TestProxyFallbackWithMockReads(bad_proxy, data_reads, 1111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) arraysize(data_reads)); 1121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 1131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) void TestProxyFallbackWithMockReads(const std::string& bad_proxy, 1151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) MockRead data_reads[], 1161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) int data_reads_size) { 1178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockWrite data_writes[] = { 1188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockWrite("GET http://www.google.com/ HTTP/1.1\r\n" 1198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) "Host: www.google.com\r\n" 1208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) "Proxy-Connection: keep-alive\r\n\r\n"), 1218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) }; 1228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) StaticSocketDataProvider data1(data_reads, data_reads_size, 1248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) data_writes, arraysize(data_writes)); 1258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) mock_socket_factory_.AddSocketDataProvider(&data1); 1268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Second data provider returns the expected content. 1288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead data_reads2[] = { 1298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead("HTTP/1.0 200 OK\r\n" 1308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) "Server: not-proxy\r\n\r\n"), 1318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead("content"), 1328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead(SYNCHRONOUS, OK), 1338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) }; 1348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockWrite data_writes2[] = { 1358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockWrite("GET http://www.google.com/ HTTP/1.1\r\n" 1368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) "Host: www.google.com\r\n" 1378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) "Proxy-Connection: keep-alive\r\n\r\n"), 1388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) }; 1398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2), 1408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) data_writes2, arraysize(data_writes2)); 1418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) mock_socket_factory_.AddSocketDataProvider(&data2); 1428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Expect that we get "content" and not "Bypass message", and that there's 1448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // a "not-proxy" "Server:" header in the final response. 1458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ExecuteRequestExpectingContentAndHeader("content", "server", "not-proxy"); 1468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // We should also observe the bad proxy in the retry list. 1481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) TestBadProxies(1u, bad_proxy, ""); 1498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 1508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Simulates a request through a proxy which returns a bypass, which is then 1528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // retried through a direct connection to the origin site. 1538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Checks that the expected requests were issued, the expected content was 1541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // received, and the proxy |bad_proxy| was marked as bad. 1551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) void TestProxyFallbackToDirect(const std::string& bad_proxy) { 1568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead data_reads[] = { 1578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead("HTTP/1.1 200 OK\r\n" 1588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) "Connection: proxy-bypass\r\n\r\n"), 1598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead("Bypass message"), 1608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead(SYNCHRONOUS, OK), 1618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) }; 1628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockWrite data_writes[] = { 1638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockWrite("GET http://www.google.com/ HTTP/1.1\r\n" 1648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) "Host: www.google.com\r\n" 1658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) "Proxy-Connection: keep-alive\r\n\r\n"), 1668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) }; 1678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) StaticSocketDataProvider data1(data_reads, arraysize(data_reads), 1688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) data_writes, arraysize(data_writes)); 1698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) mock_socket_factory_.AddSocketDataProvider(&data1); 1708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Second data provider returns the expected content. 1728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead data_reads2[] = { 1738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead("HTTP/1.0 200 OK\r\n" 1748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) "Server: not-proxy\r\n\r\n"), 1758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead("content"), 1768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead(SYNCHRONOUS, OK), 1778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) }; 1788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockWrite data_writes2[] = { 1798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockWrite("GET / HTTP/1.1\r\n" 1808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) "Host: www.google.com\r\n" 1818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) "Connection: keep-alive\r\n\r\n"), 1828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) }; 1838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2), 1848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) data_writes2, arraysize(data_writes2)); 1858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) mock_socket_factory_.AddSocketDataProvider(&data2); 1868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Expect that we get "content" and not "Bypass message", and that there's 1888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // a "not-proxy" "Server:" header in the final response. 1898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ExecuteRequestExpectingContentAndHeader("content", "server", "not-proxy"); 1908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // We should also observe the bad proxy in the retry list. 1921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) TestBadProxies(1u, bad_proxy, ""); 1938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 1948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Simulates a request through a proxy which returns a bypass, under a 1968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // configuration where there is no valid bypass. |proxy_count| proxies 1978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // are expected to be configured. 1988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Checks that the expected requests were issued, the bypass message was the 1998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // final received content, and all proxies were marked as bad. 2001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) void TestProxyFallbackFail(unsigned int proxy_count, 2011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const std::string& bad_proxy, 2021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const std::string& bad_proxy2) { 2038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead data_reads[] = { 2048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead("HTTP/1.1 200 OK\r\n" 2058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) "Connection: proxy-bypass\r\n\r\n"), 2068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead("Bypass message"), 2078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead(SYNCHRONOUS, OK), 2088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) }; 2098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockWrite data_writes[] = { 2108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockWrite("GET http://www.google.com/ HTTP/1.1\r\n" 2118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) "Host: www.google.com\r\n" 2128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) "Proxy-Connection: keep-alive\r\n\r\n"), 2138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) }; 2148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) StaticSocketDataProvider data1(data_reads, arraysize(data_reads), 2158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) data_writes, arraysize(data_writes)); 2168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) StaticSocketDataProvider data2(data_reads, arraysize(data_reads), 2178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) data_writes, arraysize(data_writes)); 2188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) mock_socket_factory_.AddSocketDataProvider(&data1); 2208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (proxy_count > 1) 2218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) mock_socket_factory_.AddSocketDataProvider(&data2); 2228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Expect that we get "Bypass message", and not "content".. 2248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ExecuteRequestExpectingContentAndHeader("Bypass message", "", ""); 2258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // We should also observe the bad proxy or proxies in the retry list. 2271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) TestBadProxies(proxy_count, bad_proxy, bad_proxy2); 2288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockClientSocketFactory mock_socket_factory_; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockHostResolver host_resolver_; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<CertVerifier> cert_verifier_; 2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) scoped_ptr<TransportSecurityState> transport_security_state_; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ProxyService> proxy_service_; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const scoped_refptr<SSLConfigService> ssl_config_service_; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<HttpNetworkSession> network_session_; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<HttpNetworkLayer> factory_; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpServerPropertiesImpl http_server_properties_; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpNetworkLayerTest, CreateAndDestroy) { 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<HttpTransaction> trans; 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans, NULL); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, rv); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(trans.get() != NULL); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpNetworkLayerTest, Suspend) { 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<HttpTransaction> trans; 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans, NULL); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, rv); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trans.reset(); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) factory_->OnSuspend(); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans, NULL); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_NETWORK_IO_SUSPENDED, rv); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(trans == NULL); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) factory_->OnResume(); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans, NULL); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, rv); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpNetworkLayerTest, GET) { 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockRead data_reads[] = { 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockRead("HTTP/1.0 200 OK\r\n\r\n"), 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockRead("hello world"), 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockRead(SYNCHRONOUS, OK), 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockWrite data_writes[] = { 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockWrite("GET / HTTP/1.1\r\n" 276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Host: www.google.com\r\n" 277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Connection: keep-alive\r\n" 278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "User-Agent: Foo/1.0\r\n\r\n"), 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StaticSocketDataProvider data(data_reads, arraysize(data_reads), 281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data_writes, arraysize(data_writes)); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_socket_factory_.AddSocketDataProvider(&data); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestInfo request_info; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_info.url = GURL("http://www.google.com/"); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_info.method = "GET"; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_info.extra_headers.SetHeader(HttpRequestHeaders::kUserAgent, 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Foo/1.0"); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_info.load_flags = LOAD_NORMAL; 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<HttpTransaction> trans; 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans, NULL); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, rv); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = trans->Start(&request_info, callback.callback(), BoundNetLog()); 298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) rv = callback.GetResult(rv); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(OK, rv); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string contents; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = ReadTransaction(trans.get(), &contents); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, rv); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("hello world", contents); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Proxy bypass tests. These tests run through various server-induced 3088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// proxy-bypass scenarios using both PAC file and fixed proxy params. 3098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// The test scenarios are: 3108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// - bypass with two proxies configured and the first but not the second 3118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// is bypassed. 3128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// - bypass with one proxy configured and an explicit fallback to direct 3138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// connections 3148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// - bypass with two proxies configured and both are bypassed 3158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// - bypass with one proxy configured which is bypassed with no defined 3168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// fallback 3178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 3181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(SPDY_PROXY_AUTH_ORIGIN) 3198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(HttpNetworkLayerTest, ServerTwoProxyBypassPac) { 3201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::string bad_proxy = GetChromeProxy(); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConfigureTestDependencies(ProxyService::CreateFixedFromPacResult( 3221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) "PROXY " + bad_proxy + "; PROXY good:8080")); 3231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) TestProxyFallback(bad_proxy); 3248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(HttpNetworkLayerTest, ServerTwoProxyBypassFixed) { 3271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::string bad_proxy = GetChromeProxy(); 3281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ConfigureTestDependencies( 3291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ProxyService::CreateFixed(bad_proxy +", good:8080")); 3301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) TestProxyFallback(bad_proxy); 3318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(HttpNetworkLayerTest, ServerOneProxyWithDirectBypassPac) { 3341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::string bad_proxy = GetChromeProxy(); 3358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ConfigureTestDependencies(ProxyService::CreateFixedFromPacResult( 3361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) "PROXY " + bad_proxy + "; DIRECT")); 3371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) TestProxyFallbackToDirect(bad_proxy); 3388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(HttpNetworkLayerTest, ServerOneProxyWithDirectBypassFixed) { 3411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::string bad_proxy = GetChromeProxy(); 3421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ConfigureTestDependencies( 3431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ProxyService::CreateFixed(bad_proxy + ", direct://")); 3441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) TestProxyFallbackToDirect(bad_proxy); 3458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(DATA_REDUCTION_FALLBACK_HOST) 3488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(HttpNetworkLayerTest, ServerTwoProxyDoubleBypassPac) { 3491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::string bad_proxy = GetChromeProxy(); 3501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::string bad_proxy2 = 3511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) HostPortPair::FromURL(GURL(DATA_REDUCTION_FALLBACK_HOST)).ToString(); 3528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ConfigureTestDependencies(ProxyService::CreateFixedFromPacResult( 3531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) "PROXY " + bad_proxy + "; PROXY " + bad_proxy2)); 3541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) TestProxyFallbackFail(2u, bad_proxy, bad_proxy2); 3558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(HttpNetworkLayerTest, ServerTwoProxyDoubleBypassFixed) { 3581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::string bad_proxy = GetChromeProxy(); 3591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::string bad_proxy2 = 3601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) HostPortPair::FromURL(GURL(DATA_REDUCTION_FALLBACK_HOST)).ToString(); 3618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ConfigureTestDependencies(ProxyService::CreateFixed( 3621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bad_proxy + ", " + bad_proxy2)); 3631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) TestProxyFallbackFail(2u, bad_proxy, bad_proxy2); 3648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 3651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(HttpNetworkLayerTest, ServerOneProxyNoDirectBypassPac) { 3681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::string bad_proxy = GetChromeProxy(); 3698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ConfigureTestDependencies(ProxyService::CreateFixedFromPacResult( 3701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) "PROXY " + bad_proxy)); 3711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) TestProxyFallbackFail(1u, bad_proxy, ""); 3728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(HttpNetworkLayerTest, ServerOneProxyNoDirectBypassFixed) { 3751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::string bad_proxy = GetChromeProxy(); 3761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ConfigureTestDependencies(ProxyService::CreateFixed(bad_proxy)); 3771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) TestProxyFallbackFail(1u, bad_proxy, ""); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 380a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(HttpNetworkLayerTest, ServerFallbackOn5xxError) { 381a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Verify that "500 Internal Server Error", "502 Bad Gateway", and 382a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // "503 Service Unavailable" via the data reduction proxy induce proxy 383a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // fallback to a second proxy, if configured. 38490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 38590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // To configure this test, we need to wire up a custom proxy service to use 38690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // a pair of proxies. We'll induce fallback via the first and return 38790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // the expected data via the second. 38890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string data_reduction_proxy( 38990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) HostPortPair::FromURL(GURL(SPDY_PROXY_AUTH_ORIGIN)).ToString()); 39090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string pac_string = base::StringPrintf( 39190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "PROXY %s; PROXY good:8080", data_reduction_proxy.data()); 39290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 393a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string headers[] = { 394a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) "HTTP/1.1 500 Internal Server Error\r\n\r\n", 395a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) "HTTP/1.1 502 Bad Gateway\r\n\r\n", 396a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) "HTTP/1.1 503 Service Unavailable\r\n\r\n" 39790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) }; 39890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 399a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (size_t i = 0; i < arraysize(headers); ++i) { 400a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ConfigureTestDependencies( 401a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ProxyService::CreateFixedFromPacResult(pac_string)); 40290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 403a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MockRead data_reads[] = { 404a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MockRead(headers[i].c_str()), 405a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MockRead("Bypass message"), 406a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MockRead(SYNCHRONOUS, OK), 407a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) }; 40890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 409a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MockWrite data_writes[] = { 410a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MockWrite("GET http://www.google.com/ HTTP/1.1\r\n" 411a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) "Host: www.google.com\r\n" 412a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) "Proxy-Connection: keep-alive\r\n\r\n"), 413a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) }; 41490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 415a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) StaticSocketDataProvider data1(data_reads, arraysize(data_reads), 416a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) data_writes, arraysize(data_writes)); 417a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) mock_socket_factory_.AddSocketDataProvider(&data1); 41890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 419a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Second data provider returns the expected content. 420a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MockRead data_reads2[] = { 421a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MockRead("HTTP/1.0 200 OK\r\n" 422a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) "Server: not-proxy\r\n\r\n"), 423a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MockRead("content"), 424a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MockRead(SYNCHRONOUS, OK), 425a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) }; 426a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MockWrite data_writes2[] = { 427a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MockWrite("GET http://www.google.com/ HTTP/1.1\r\n" 428a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) "Host: www.google.com\r\n" 429a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) "Proxy-Connection: keep-alive\r\n\r\n"), 430a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) }; 43190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 432a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2), 433a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) data_writes2, arraysize(data_writes2)); 434a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) mock_socket_factory_.AddSocketDataProvider(&data2); 435a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 436a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) TestCompletionCallback callback; 43790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 438a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) HttpRequestInfo request_info; 439a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) request_info.url = GURL("http://www.google.com/"); 440a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) request_info.method = "GET"; 441a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) request_info.load_flags = LOAD_NORMAL; 442a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 443a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<HttpTransaction> trans; 444a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans, NULL); 445a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(OK, rv); 446a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 447a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) rv = trans->Start(&request_info, callback.callback(), BoundNetLog()); 448a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (rv == ERR_IO_PENDING) 449a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) rv = callback.WaitForResult(); 450a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_EQ(OK, rv); 451a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 452a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string contents; 453a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) rv = ReadTransaction(trans.get(), &contents); 454a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(OK, rv); 455a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 456a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // We should obtain content from the second socket provider write 457a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // corresponding to the fallback proxy. 458a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ("content", contents); 459a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // We also have a server header here that isn't set by the proxy. 460a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(trans->GetResponseInfo()->headers->HasHeaderValue( 461a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) "server", "not-proxy")); 462a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // We should also observe the data reduction proxy in the retry list. 463a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_EQ(1u, proxy_service_->proxy_retry_info().size()); 464a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(data_reduction_proxy, 465a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) (*proxy_service_->proxy_retry_info().begin()).first); 466a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 46790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 46890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif // defined(SPDY_PROXY_AUTH_ORIGIN) 46990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 4708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(HttpNetworkLayerTest, ProxyBypassIgnoredOnDirectConnectionPac) { 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that a Connection: proxy-bypass header is ignored when returned 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from a directly connected origin server. 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConfigureTestDependencies(ProxyService::CreateFixedFromPacResult("DIRECT")); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockRead data_reads[] = { 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockRead("HTTP/1.1 200 OK\r\n" 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Connection: proxy-bypass\r\n\r\n"), 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockRead("Bypass message"), 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockRead(SYNCHRONOUS, OK), 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockWrite data_writes[] = { 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockWrite("GET / HTTP/1.1\r\n" 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Host: www.google.com\r\n" 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Connection: keep-alive\r\n\r\n"), 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StaticSocketDataProvider data1(data_reads, arraysize(data_reads), 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data_writes, arraysize(data_writes)); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_socket_factory_.AddSocketDataProvider(&data1); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestInfo request_info; 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_info.url = GURL("http://www.google.com/"); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_info.method = "GET"; 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_info.load_flags = LOAD_NORMAL; 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<HttpTransaction> trans; 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans, NULL); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, rv); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = trans->Start(&request_info, callback.callback(), BoundNetLog()); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rv == ERR_IO_PENDING) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = callback.WaitForResult(); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(OK, rv); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should have read the original page data. 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string contents; 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = ReadTransaction(trans.get(), &contents); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, rv); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("Bypass message", contents); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should have no entries in our bad proxy list. 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0u, proxy_service_->proxy_retry_info().size()); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(SPDY_PROXY_AUTH_ORIGIN) 5161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(HttpNetworkLayerTest, ServerFallbackWithProxyTimedBypass) { 5171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Verify that a Chrome-Proxy: bypass=<seconds> header induces proxy 5181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // fallback to a second proxy, if configured. 5191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::string bad_proxy = GetChromeProxy(); 5201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ConfigureTestDependencies(ProxyService::CreateFixedFromPacResult( 5211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) "PROXY " + bad_proxy + "; PROXY good:8080")); 5221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) MockRead data_reads[] = { 5241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) MockRead("HTTP/1.1 200 OK\r\n" 5251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) "Connection: keep-alive\r\n" 5261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) "Chrome-Proxy: bypass=86400\r\n\r\n"), 5271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) MockRead("Bypass message"), 5281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) MockRead(SYNCHRONOUS, OK), 5291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) }; 5301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) TestProxyFallbackWithMockReads(bad_proxy, data_reads, arraysize(data_reads)); 5321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(base::TimeDelta::FromSeconds(86400), 5331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) (*proxy_service_->proxy_retry_info().begin()).second.current_delay); 5341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 5351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif // defined(SPDY_PROXY_AUTH_ORIGIN) 5361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(HttpNetworkLayerTest, NetworkVerified) { 538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockRead data_reads[] = { 539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockRead("HTTP/1.0 200 OK\r\n\r\n"), 540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockRead("hello world"), 541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockRead(SYNCHRONOUS, OK), 542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockWrite data_writes[] = { 544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockWrite("GET / HTTP/1.1\r\n" 545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Host: www.google.com\r\n" 546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Connection: keep-alive\r\n" 547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "User-Agent: Foo/1.0\r\n\r\n"), 548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) StaticSocketDataProvider data(data_reads, arraysize(data_reads), 550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data_writes, arraysize(data_writes)); 551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mock_socket_factory_.AddSocketDataProvider(&data); 552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestCompletionCallback callback; 554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) HttpRequestInfo request_info; 556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) request_info.url = GURL("http://www.google.com/"); 557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) request_info.method = "GET"; 558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) request_info.extra_headers.SetHeader(HttpRequestHeaders::kUserAgent, 559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Foo/1.0"); 560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) request_info.load_flags = LOAD_NORMAL; 561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<HttpTransaction> trans; 563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans, NULL); 564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(OK, rv); 565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) rv = trans->Start(&request_info, callback.callback(), BoundNetLog()); 567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(OK, callback.GetResult(rv)); 568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(trans->GetResponseInfo()->network_accessed); 570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(HttpNetworkLayerTest, NetworkUnVerified) { 573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockRead data_reads[] = { 574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockRead(ASYNC, ERR_CONNECTION_RESET), 575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockWrite data_writes[] = { 577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockWrite("GET / HTTP/1.1\r\n" 578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Host: www.google.com\r\n" 579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Connection: keep-alive\r\n" 580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "User-Agent: Foo/1.0\r\n\r\n"), 581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) StaticSocketDataProvider data(data_reads, arraysize(data_reads), 583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data_writes, arraysize(data_writes)); 584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mock_socket_factory_.AddSocketDataProvider(&data); 585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestCompletionCallback callback; 587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) HttpRequestInfo request_info; 589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) request_info.url = GURL("http://www.google.com/"); 590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) request_info.method = "GET"; 591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) request_info.extra_headers.SetHeader(HttpRequestHeaders::kUserAgent, 592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Foo/1.0"); 593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) request_info.load_flags = LOAD_NORMAL; 594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<HttpTransaction> trans; 596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans, NULL); 597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(OK, rv); 598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) rv = trans->Start(&request_info, callback.callback(), BoundNetLog()); 600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(ERR_CONNECTION_RESET, callback.GetResult(rv)); 601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If the response info is null, that means that any consumer won't 603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // see the network accessed bit set. 604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(NULL, trans->GetResponseInfo()); 605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 610