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) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/basictypes.h" 87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/stringprintf.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_log.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/mock_cert_verifier.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_network_session.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_server_properties_impl.h" 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "net/http/http_transaction_test_util.h" 157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "net/http/transport_security_state.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_service.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/socket_test_util.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/spdy/spdy_session_pool.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/ssl/ssl_config_service_defaults.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/platform_test.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpNetworkLayerTest : public PlatformTest { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpNetworkLayerTest() : ssl_config_service_(new SSLConfigServiceDefaults) {} 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConfigureTestDependencies(ProxyService::CreateDirect()); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ConfigureTestDependencies(ProxyService* proxy_service) { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cert_verifier_.reset(new MockCertVerifier); 377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) transport_security_state_.reset(new TransportSecurityState); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proxy_service_.reset(proxy_service); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpNetworkSession::Params session_params; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_params.client_socket_factory = &mock_socket_factory_; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_params.host_resolver = &host_resolver_; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_params.cert_verifier = cert_verifier_.get(); 437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) session_params.transport_security_state = transport_security_state_.get(); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_params.proxy_service = proxy_service_.get(); 45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) session_params.ssl_config_service = ssl_config_service_.get(); 46ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch session_params.http_server_properties = 47ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch http_server_properties_.GetWeakPtr(); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_session_ = new HttpNetworkSession(session_params); 49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) factory_.reset(new HttpNetworkLayer(network_session_.get())); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void ExecuteRequestExpectingContentAndHeader(const std::string& method, 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& content, 548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string& header, 558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string& value) { 568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) TestCompletionCallback callback; 578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) HttpRequestInfo request_info; 598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) request_info.url = GURL("http://www.google.com/"); 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_info.method = method; 618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) request_info.load_flags = LOAD_NORMAL; 628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<HttpTransaction> trans; 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans); 658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(OK, rv); 668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) rv = trans->Start(&request_info, callback.callback(), BoundNetLog()); 688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (rv == ERR_IO_PENDING) 698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) rv = callback.WaitForResult(); 708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ASSERT_EQ(OK, rv); 718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::string contents; 738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) rv = ReadTransaction(trans.get(), &contents); 748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(OK, rv); 758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(content, contents); 768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (!header.empty()) { 788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // We also have a server header here that isn't set by the proxy. 798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_TRUE(trans->GetResponseInfo()->headers->HasHeaderValue( 808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) header, value)); 818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Check that |proxy_count| proxies are in the retry list. 851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // These will be, in order, |bad_proxy| and |bad_proxy2|". 861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) void TestBadProxies(unsigned int proxy_count, const std::string& bad_proxy, 871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const std::string& bad_proxy2) { 888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const ProxyRetryInfoMap& retry_info = proxy_service_->proxy_retry_info(); 898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ASSERT_EQ(proxy_count, retry_info.size()); 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (proxy_count > 0) 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(retry_info.find(bad_proxy) != retry_info.end()); 928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (proxy_count > 1) 931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ASSERT_TRUE(retry_info.find(bad_proxy2) != retry_info.end()); 948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Simulates a request through a proxy which returns a bypass, which is then 978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // retried through a second proxy that doesn't bypass. 988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Checks that the expected requests were issued, the expected content was 99010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // received, and the first proxy |bad_proxy| was marked as bad. 1001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) void TestProxyFallback(const std::string& bad_proxy) { 1018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead data_reads[] = { 1028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead("HTTP/1.1 200 OK\r\n" 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Chrome-Proxy: bypass=0\r\n\r\n"), 1048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead("Bypass message"), 1058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead(SYNCHRONOUS, OK), 1068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) }; 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestProxyFallbackWithMockReads(bad_proxy, "", data_reads, 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) arraysize(data_reads), 1u); 1091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 1101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) void TestProxyFallbackWithMockReads(const std::string& bad_proxy, 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& bad_proxy2, 1131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) MockRead data_reads[], 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int data_reads_size, 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) unsigned int expected_retry_info_size) { 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestProxyFallbackByMethodWithMockReads(bad_proxy, bad_proxy2, data_reads, 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) data_reads_size, "GET", "content", 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) true, expected_retry_info_size); 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void TestProxyFallbackByMethodWithMockReads( 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& bad_proxy, 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& bad_proxy2, 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MockRead data_reads[], 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int data_reads_size, 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string method, 127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::string content, 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool retry_expected, 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) unsigned int expected_retry_info_size) { 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string trailer = 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (method == "HEAD" || method == "PUT" || method == "POST") ? 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Content-Length: 0\r\n\r\n" : "\r\n"; 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string request = 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::StringPrintf("%s http://www.google.com/ HTTP/1.1\r\n" 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Host: www.google.com\r\n" 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Proxy-Connection: keep-alive\r\n" 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "%s", method.c_str(), trailer.c_str()); 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockWrite data_writes[] = { 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MockWrite(request.c_str()), 1418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) }; 1428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) StaticSocketDataProvider data1(data_reads, data_reads_size, 1448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) data_writes, arraysize(data_writes)); 1458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) mock_socket_factory_.AddSocketDataProvider(&data1); 1468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Second data provider returns the expected content. 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MockRead data_reads2[3]; 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t data_reads2_index = 0; 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) data_reads2[data_reads2_index++] = MockRead("HTTP/1.0 200 OK\r\n" 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Server: not-proxy\r\n\r\n"); 152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!content.empty()) 153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) data_reads2[data_reads2_index++] = MockRead(content.c_str()); 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) data_reads2[data_reads2_index++] = MockRead(SYNCHRONOUS, OK); 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockWrite data_writes2[] = { 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MockWrite(request.c_str()), 1588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) }; 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StaticSocketDataProvider data2(data_reads2, data_reads2_index, 1608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) data_writes2, arraysize(data_writes2)); 1618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) mock_socket_factory_.AddSocketDataProvider(&data2); 1628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Expect that we get "content" and not "Bypass message", and that there's 1648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // a "not-proxy" "Server:" header in the final response. 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (retry_expected) { 166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ExecuteRequestExpectingContentAndHeader(method, content, 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "server", "not-proxy"); 1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ExecuteRequestExpectingContentAndHeader(method, content, "", ""); 1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // We should also observe the bad proxy in the retry list. 1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestBadProxies(expected_retry_info_size, bad_proxy, bad_proxy2); 1748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 1758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Simulates a request through a proxy which returns a bypass, which is then 1778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // retried through a direct connection to the origin site. 1788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Checks that the expected requests were issued, the expected content was 1791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // received, and the proxy |bad_proxy| was marked as bad. 1801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) void TestProxyFallbackToDirect(const std::string& bad_proxy) { 1818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead data_reads[] = { 1828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead("HTTP/1.1 200 OK\r\n" 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Chrome-Proxy: bypass=0\r\n\r\n"), 1848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead("Bypass message"), 1858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead(SYNCHRONOUS, OK), 1868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) }; 1878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockWrite data_writes[] = { 1888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockWrite("GET http://www.google.com/ HTTP/1.1\r\n" 1898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) "Host: www.google.com\r\n" 1908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) "Proxy-Connection: keep-alive\r\n\r\n"), 1918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) }; 1928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) StaticSocketDataProvider data1(data_reads, arraysize(data_reads), 1938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) data_writes, arraysize(data_writes)); 1948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) mock_socket_factory_.AddSocketDataProvider(&data1); 1958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Second data provider returns the expected content. 1978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead data_reads2[] = { 1988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead("HTTP/1.0 200 OK\r\n" 1998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) "Server: not-proxy\r\n\r\n"), 2008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead("content"), 2018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead(SYNCHRONOUS, OK), 2028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) }; 2038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockWrite data_writes2[] = { 2048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockWrite("GET / HTTP/1.1\r\n" 2058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) "Host: www.google.com\r\n" 2068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) "Connection: keep-alive\r\n\r\n"), 2078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) }; 2088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2), 2098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) data_writes2, arraysize(data_writes2)); 2108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) mock_socket_factory_.AddSocketDataProvider(&data2); 2118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Expect that we get "content" and not "Bypass message", and that there's 2138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // a "not-proxy" "Server:" header in the final response. 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExecuteRequestExpectingContentAndHeader("GET", "content", 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "server", "not-proxy"); 2168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // We should also observe the bad proxy in the retry list. 2181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) TestBadProxies(1u, bad_proxy, ""); 2198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Simulates a request through a proxy which returns a bypass, under a 2228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // configuration where there is no valid bypass. |proxy_count| proxies 2238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // are expected to be configured. 2248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Checks that the expected requests were issued, the bypass message was the 2258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // final received content, and all proxies were marked as bad. 2261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) void TestProxyFallbackFail(unsigned int proxy_count, 2271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const std::string& bad_proxy, 2281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const std::string& bad_proxy2) { 2298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead data_reads[] = { 2308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead("HTTP/1.1 200 OK\r\n" 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Chrome-Proxy: bypass=0\r\n\r\n"), 2328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead("Bypass message"), 2338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead(SYNCHRONOUS, OK), 2348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) }; 2358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockWrite data_writes[] = { 2368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockWrite("GET http://www.google.com/ HTTP/1.1\r\n" 2378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) "Host: www.google.com\r\n" 2388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) "Proxy-Connection: keep-alive\r\n\r\n"), 2398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) }; 2408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) StaticSocketDataProvider data1(data_reads, arraysize(data_reads), 2418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) data_writes, arraysize(data_writes)); 2428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) StaticSocketDataProvider data2(data_reads, arraysize(data_reads), 2438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) data_writes, arraysize(data_writes)); 2448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) mock_socket_factory_.AddSocketDataProvider(&data1); 2468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (proxy_count > 1) 2478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) mock_socket_factory_.AddSocketDataProvider(&data2); 2488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Expect that we get "Bypass message", and not "content".. 2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExecuteRequestExpectingContentAndHeader("GET", "Bypass message", "", ""); 2518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // We should also observe the bad proxy or proxies in the retry list. 2531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) TestBadProxies(proxy_count, bad_proxy, bad_proxy2); 2548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockClientSocketFactory mock_socket_factory_; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockHostResolver host_resolver_; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<CertVerifier> cert_verifier_; 2597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) scoped_ptr<TransportSecurityState> transport_security_state_; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ProxyService> proxy_service_; 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const scoped_refptr<SSLConfigService> ssl_config_service_; 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<HttpNetworkSession> network_session_; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<HttpNetworkLayer> factory_; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpServerPropertiesImpl http_server_properties_; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpNetworkLayerTest, CreateAndDestroy) { 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<HttpTransaction> trans; 2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, rv); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(trans.get() != NULL); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpNetworkLayerTest, Suspend) { 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<HttpTransaction> trans; 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, rv); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trans.reset(); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) factory_->OnSuspend(); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_NETWORK_IO_SUSPENDED, rv); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(trans == NULL); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) factory_->OnResume(); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, rv); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpNetworkLayerTest, GET) { 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockRead data_reads[] = { 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockRead("HTTP/1.0 200 OK\r\n\r\n"), 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockRead("hello world"), 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockRead(SYNCHRONOUS, OK), 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockWrite data_writes[] = { 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockWrite("GET / HTTP/1.1\r\n" 302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Host: www.google.com\r\n" 303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Connection: keep-alive\r\n" 304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "User-Agent: Foo/1.0\r\n\r\n"), 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StaticSocketDataProvider data(data_reads, arraysize(data_reads), 307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data_writes, arraysize(data_writes)); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_socket_factory_.AddSocketDataProvider(&data); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestInfo request_info; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_info.url = GURL("http://www.google.com/"); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_info.method = "GET"; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_info.extra_headers.SetHeader(HttpRequestHeaders::kUserAgent, 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Foo/1.0"); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_info.load_flags = LOAD_NORMAL; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<HttpTransaction> trans; 3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, rv); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = trans->Start(&request_info, callback.callback(), BoundNetLog()); 324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) rv = callback.GetResult(rv); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(OK, rv); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string contents; 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = ReadTransaction(trans.get(), &contents); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, rv); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("hello world", contents); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(HttpNetworkLayerTest, NetworkVerified) { 334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockRead data_reads[] = { 335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockRead("HTTP/1.0 200 OK\r\n\r\n"), 336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockRead("hello world"), 337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockRead(SYNCHRONOUS, OK), 338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockWrite data_writes[] = { 340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockWrite("GET / HTTP/1.1\r\n" 341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Host: www.google.com\r\n" 342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Connection: keep-alive\r\n" 343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "User-Agent: Foo/1.0\r\n\r\n"), 344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) StaticSocketDataProvider data(data_reads, arraysize(data_reads), 346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data_writes, arraysize(data_writes)); 347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mock_socket_factory_.AddSocketDataProvider(&data); 348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestCompletionCallback callback; 350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) HttpRequestInfo request_info; 352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) request_info.url = GURL("http://www.google.com/"); 353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) request_info.method = "GET"; 354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) request_info.extra_headers.SetHeader(HttpRequestHeaders::kUserAgent, 355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Foo/1.0"); 356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) request_info.load_flags = LOAD_NORMAL; 357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<HttpTransaction> trans; 3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans); 360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(OK, rv); 361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) rv = trans->Start(&request_info, callback.callback(), BoundNetLog()); 363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(OK, callback.GetResult(rv)); 364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(trans->GetResponseInfo()->network_accessed); 366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(HttpNetworkLayerTest, NetworkUnVerified) { 369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockRead data_reads[] = { 370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockRead(ASYNC, ERR_CONNECTION_RESET), 371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockWrite data_writes[] = { 373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockWrite("GET / HTTP/1.1\r\n" 374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Host: www.google.com\r\n" 375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Connection: keep-alive\r\n" 376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "User-Agent: Foo/1.0\r\n\r\n"), 377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) StaticSocketDataProvider data(data_reads, arraysize(data_reads), 379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data_writes, arraysize(data_writes)); 380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mock_socket_factory_.AddSocketDataProvider(&data); 381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestCompletionCallback callback; 383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) HttpRequestInfo request_info; 385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) request_info.url = GURL("http://www.google.com/"); 386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) request_info.method = "GET"; 387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) request_info.extra_headers.SetHeader(HttpRequestHeaders::kUserAgent, 388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Foo/1.0"); 389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) request_info.load_flags = LOAD_NORMAL; 390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<HttpTransaction> trans; 3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans); 393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(OK, rv); 394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) rv = trans->Start(&request_info, callback.callback(), BoundNetLog()); 396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(ERR_CONNECTION_RESET, callback.GetResult(rv)); 397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If the response info is null, that means that any consumer won't 399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // see the network accessed bit set. 400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(NULL, trans->GetResponseInfo()); 401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 406