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/proxy/proxy_script_fetcher_impl.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 13c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "net/base/filename_util.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/load_flags.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/test_completion_callback.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/mock_cert_verifier.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/disk_cache/disk_cache.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_cache.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_network_session.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_server_properties_impl.h" 227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "net/http/transport_security_state.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/ssl/ssl_config_service_defaults.h" 24b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/test/spawned_test_server/spawned_test_server.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_storage.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_file_job.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_job_factory_impl.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_test_util.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/platform_test.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if !defined(DISABLE_FILE_SUPPORT) 33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "net/url_request/file_protocol_handler.h" 34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif 35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16; 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(eroman): 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Test canceling an outstanding request. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Test deleting ProxyScriptFetcher while a request is in progress. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType kDocRoot[] = 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_PATH_LITERAL("net/data/proxy_script_fetcher_unittest"); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct FetchResult { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int code; 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// A non-mock URL request which can access http:// and file:// urls, in the case 55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// the tests were built with file support. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RequestContext : public URLRequestContext { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RequestContext() : storage_(this) { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyConfig no_proxy; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) storage_.set_host_resolver(scoped_ptr<HostResolver>(new MockHostResolver)); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) storage_.set_cert_verifier(new MockCertVerifier); 627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) storage_.set_transport_security_state(new TransportSecurityState); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) storage_.set_proxy_service(ProxyService::CreateFixed(no_proxy)); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) storage_.set_ssl_config_service(new SSLConfigServiceDefaults); 65ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch storage_.set_http_server_properties( 66ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch scoped_ptr<HttpServerProperties>(new HttpServerPropertiesImpl())); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpNetworkSession::Params params; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.host_resolver = host_resolver(); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.cert_verifier = cert_verifier(); 717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) params.transport_security_state = transport_security_state(); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.proxy_service = proxy_service(); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.ssl_config_service = ssl_config_service(); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.http_server_properties = http_server_properties(); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<HttpNetworkSession> network_session( 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new HttpNetworkSession(params)); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) storage_.set_http_transaction_factory(new HttpCache( 78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) network_session.get(), HttpCache::DefaultBackend::InMemory(0))); 79b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) URLRequestJobFactoryImpl* job_factory = new URLRequestJobFactoryImpl(); 80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if !defined(DISABLE_FILE_SUPPORT) 813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) job_factory->SetProtocolHandler( 823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) "file", new FileProtocolHandler(base::MessageLoopProxy::current())); 83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif 84b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) storage_.set_job_factory(job_factory); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~RequestContext() { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestContextStorage storage_; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if !defined(DISABLE_FILE_SUPPORT) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Get a file:// url relative to net/data/proxy/proxy_script_fetcher_unittest. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL GetTestFileUrl(const std::string& relpath) { 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath path; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(base::DIR_SOURCE_ROOT, &path); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.AppendASCII("net"); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.AppendASCII("data"); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.AppendASCII("proxy_script_fetcher_unittest"); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL base_url = FilePathToFileURL(path); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GURL(base_url.spec() + "/" + relpath); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif // !defined(DISABLE_FILE_SUPPORT) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Really simple NetworkDelegate so we can allow local file access on ChromeOS 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// without introducing layering violations. Also causes a test failure if a 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// request is seen that doesn't set a load flag to bypass revocation checking. 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BasicNetworkDelegate : public NetworkDelegate { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BasicNetworkDelegate() {} 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BasicNetworkDelegate() {} 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int OnBeforeURLRequest(URLRequest* request, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback, 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL* new_url) OVERRIDE { 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(request->load_flags() & LOAD_DISABLE_CERT_REVOCATION_CHECKING); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int OnBeforeSendHeaders(URLRequest* request, 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders* headers) OVERRIDE { 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnSendHeaders(URLRequest* request, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HttpRequestHeaders& headers) OVERRIDE {} 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int OnHeadersReceived( 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest* request, 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback, 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HttpResponseHeaders* original_response_headers, 137effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_refptr<HttpResponseHeaders>* override_response_headers, 138effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch GURL* allowed_unsafe_redirect_url) OVERRIDE { 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnBeforeRedirect(URLRequest* request, 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& new_location) OVERRIDE {} 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnResponseStarted(URLRequest* request) OVERRIDE {} 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnRawBytesRead(const URLRequest& request, 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bytes_read) OVERRIDE {} 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnCompleted(URLRequest* request, bool started) OVERRIDE {} 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnURLRequestDestroyed(URLRequest* request) OVERRIDE {} 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnPACScriptError(int line_number, 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& error) OVERRIDE {} 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual NetworkDelegate::AuthRequiredResponse OnAuthRequired( 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest* request, 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AuthChallengeInfo& auth_info, 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AuthCallback& callback, 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthCredentials* credentials) OVERRIDE { 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnCanGetCookies(const URLRequest& request, 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CookieList& cookie_list) OVERRIDE { 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnCanSetCookie(const URLRequest& request, 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& cookie_line, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CookieOptions* options) OVERRIDE { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnCanAccessFile(const net::URLRequest& request, 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path) const OVERRIDE { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnCanThrottleRequest(const URLRequest& request) const OVERRIDE { 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int OnBeforeSocketStreamConnect( 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SocketStream* stream, 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback) OVERRIDE { 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BasicNetworkDelegate); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProxyScriptFetcherImplTest : public PlatformTest { 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptFetcherImplTest() 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : test_server_(SpawnedTestServer::TYPE_HTTP, 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::kLocalhost, 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(kDocRoot)) { 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_.set_network_delegate(&network_delegate_); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer test_server_; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BasicNetworkDelegate network_delegate_; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestContext context_; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 210010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if !defined(DISABLE_FILE_SUPPORT) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyScriptFetcherImplTest, FileUrl) { 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptFetcherImpl pac_fetcher(&context_); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Fetch a non-existent file. 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = pac_fetcher.Fetch(GetTestFileUrl("does-not-exist"), 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &text, callback.callback()); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, result); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_FILE_NOT_FOUND, callback.WaitForResult()); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(text.empty()); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Fetch a file that exists. 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = pac_fetcher.Fetch(GetTestFileUrl("pac.txt"), 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &text, callback.callback()); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, result); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, callback.WaitForResult()); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("-pac.txt-\n"), text); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 233010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif // !defined(DISABLE_FILE_SUPPORT) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that all mime types are allowed for PAC file, to be consistent 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// with other browsers. 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyScriptFetcherImplTest, HttpMimeType) { 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptFetcherImpl pac_fetcher(&context_); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Fetch a PAC with mime type "text/plain" 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server_.GetURL("files/pac.txt")); 244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = pac_fetcher.Fetch(url, &text, callback.callback()); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, result); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, callback.WaitForResult()); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("-pac.txt-\n"), text); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Fetch a PAC with mime type "text/html" 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server_.GetURL("files/pac.html")); 253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = pac_fetcher.Fetch(url, &text, callback.callback()); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, result); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, callback.WaitForResult()); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("-pac.html-\n"), text); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Fetch a PAC with mime type "application/x-ns-proxy-autoconfig" 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server_.GetURL("files/pac.nsproxy")); 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = pac_fetcher.Fetch(url, &text, callback.callback()); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, result); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, callback.WaitForResult()); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("-pac.nsproxy-\n"), text); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyScriptFetcherImplTest, HttpStatusCode) { 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptFetcherImpl pac_fetcher(&context_); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Fetch a PAC which gives a 500 -- FAIL 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server_.GetURL("files/500.pac")); 278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = pac_fetcher.Fetch(url, &text, callback.callback()); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, result); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_PAC_STATUS_NOT_OK, callback.WaitForResult()); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(text.empty()); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Fetch a PAC which gives a 404 -- FAIL 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server_.GetURL("files/404.pac")); 287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = pac_fetcher.Fetch(url, &text, callback.callback()); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, result); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_PAC_STATUS_NOT_OK, callback.WaitForResult()); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(text.empty()); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyScriptFetcherImplTest, ContentDisposition) { 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptFetcherImpl pac_fetcher(&context_); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fetch PAC scripts via HTTP with a Content-Disposition header -- should 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // have no effect. 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server_.GetURL("files/downloadable.pac")); 304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = pac_fetcher.Fetch(url, &text, callback.callback()); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, result); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, callback.WaitForResult()); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("-downloadable.pac-\n"), text); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that PAC scripts are not being cached. 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyScriptFetcherImplTest, NoCache) { 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptFetcherImpl pac_fetcher(&context_); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fetch a PAC script whose HTTP headers make it cacheable for 1 hour. 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server_.GetURL("files/cacheable_1hr.pac")); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = pac_fetcher.Fetch(url, &text, callback.callback()); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, result); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, callback.WaitForResult()); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("-cacheable_1hr.pac-\n"), text); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Kill the HTTP server. 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Stop()); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Try to fetch the file again. Since the server is not running anymore, the 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // call should fail, thus indicating that the file was not fetched from the 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // local cache. 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = pac_fetcher.Fetch(url, &text, callback.callback()); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, result); 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Expect any error. The exact error varies by platform. 3427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_NE(OK, callback.WaitForResult()); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyScriptFetcherImplTest, TooLarge) { 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptFetcherImpl pac_fetcher(&context_); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the maximum response size to 50 bytes. 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int prev_size = pac_fetcher.SetSizeConstraint(50); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These two URLs are the same file, but are http:// vs file:// 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL urls[] = { 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURL("files/large-pac.nsproxy"), 357cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if !defined(DISABLE_FILE_SUPPORT) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetTestFileUrl("large-pac.nsproxy") 359cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try fetching URLs that are 101 bytes large. We should abort the request 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // after 50 bytes have been read, and fail with a too large error. 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(urls); ++i) { 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url = urls[i]; 366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = pac_fetcher.Fetch(url, &text, callback.callback()); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, result); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_FILE_TOO_BIG, callback.WaitForResult()); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(text.empty()); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Restore the original size bound. 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pac_fetcher.SetSizeConstraint(prev_size); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Make sure we can still fetch regular URLs. 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server_.GetURL("files/pac.nsproxy")); 379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = pac_fetcher.Fetch(url, &text, callback.callback()); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, result); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, callback.WaitForResult()); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("-pac.nsproxy-\n"), text); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyScriptFetcherImplTest, Hang) { 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptFetcherImpl pac_fetcher(&context_); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the timeout period to 0.5 seconds. 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta prev_timeout = pac_fetcher.SetTimeoutConstraint( 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(500)); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try fetching a URL which takes 1.2 seconds. We should abort the request 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // after 500 ms, and fail with a timeout error. 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server_.GetURL("slow/proxy.pac?1.2")); 401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = pac_fetcher.Fetch(url, &text, callback.callback()); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, result); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_TIMED_OUT, callback.WaitForResult()); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(text.empty()); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Restore the original timeout period. 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pac_fetcher.SetTimeoutConstraint(prev_timeout); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Make sure we can still fetch regular URLs. 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server_.GetURL("files/pac.nsproxy")); 414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = pac_fetcher.Fetch(url, &text, callback.callback()); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, result); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, callback.WaitForResult()); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("-pac.nsproxy-\n"), text); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The ProxyScriptFetcher should decode any content-codings 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (like gzip, bzip, etc.), and apply any charset conversions to yield 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// UTF8. 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyScriptFetcherImplTest, Encodings) { 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptFetcherImpl pac_fetcher(&context_); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test a response that is gzip-encoded -- should get inflated. 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server_.GetURL("files/gzipped_pac")); 434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = pac_fetcher.Fetch(url, &text, callback.callback()); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, result); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, callback.WaitForResult()); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("This data was gzipped.\n"), text); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test a response that was served as UTF-16 (BE). It should 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be converted to UTF8. 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server_.GetURL("files/utf16be_pac")); 446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = pac_fetcher.Fetch(url, &text, callback.callback()); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, result); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, callback.WaitForResult()); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("This was encoded as UTF-16BE.\n"), text); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyScriptFetcherImplTest, DataURLs) { 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptFetcherImpl pac_fetcher(&context_); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kEncodedUrl[] = 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "data:application/x-ns-proxy-autoconfig;base64,ZnVuY3Rpb24gRmluZFByb3h5R" 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "m9yVVJMKHVybCwgaG9zdCkgewogIGlmIChob3N0ID09ICdmb29iYXIuY29tJykKICAgIHJl" 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dHVybiAnUFJPWFkgYmxhY2tob2xlOjgwJzsKICByZXR1cm4gJ0RJUkVDVCc7Cn0="; 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kPacScript[] = 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "function FindProxyForURL(url, host) {\n" 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " if (host == 'foobar.com')\n" 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return 'PROXY blackhole:80';\n" 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return 'DIRECT';\n" 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}"; 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test fetching a "data:"-url containing a base64 encoded PAC script. 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(kEncodedUrl); 472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = pac_fetcher.Fetch(url, &text, callback.callback()); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, result); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16(kPacScript), text); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kEncodedUrlBroken[] = 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "data:application/x-ns-proxy-autoconfig;base64,ZnVuY3Rpb24gRmluZFByb3h5R"; 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test a broken "data:"-url containing a base64 encoded PAC script. 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(kEncodedUrlBroken); 485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = pac_fetcher.Fetch(url, &text, callback.callback()); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_FAILED, result); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 493