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() { 885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AssertNoURLRequests(); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestContextStorage storage_; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if !defined(DISABLE_FILE_SUPPORT) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Get a file:// url relative to net/data/proxy/proxy_script_fetcher_unittest. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL GetTestFileUrl(const std::string& relpath) { 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath path; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(base::DIR_SOURCE_ROOT, &path); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.AppendASCII("net"); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.AppendASCII("data"); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.AppendASCII("proxy_script_fetcher_unittest"); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL base_url = FilePathToFileURL(path); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GURL(base_url.spec() + "/" + relpath); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif // !defined(DISABLE_FILE_SUPPORT) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Really simple NetworkDelegate so we can allow local file access on ChromeOS 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// without introducing layering violations. Also causes a test failure if a 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// request is seen that doesn't set a load flag to bypass revocation checking. 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BasicNetworkDelegate : public NetworkDelegate { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BasicNetworkDelegate() {} 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BasicNetworkDelegate() {} 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int OnBeforeURLRequest(URLRequest* request, 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback, 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL* new_url) OVERRIDE { 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(request->load_flags() & LOAD_DISABLE_CERT_REVOCATION_CHECKING); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int OnBeforeSendHeaders(URLRequest* request, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders* headers) OVERRIDE { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnSendHeaders(URLRequest* request, 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HttpRequestHeaders& headers) OVERRIDE {} 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int OnHeadersReceived( 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest* request, 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback, 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HttpResponseHeaders* original_response_headers, 138effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_refptr<HttpResponseHeaders>* override_response_headers, 139effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch GURL* allowed_unsafe_redirect_url) OVERRIDE { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnBeforeRedirect(URLRequest* request, 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& new_location) OVERRIDE {} 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnResponseStarted(URLRequest* request) OVERRIDE {} 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnRawBytesRead(const URLRequest& request, 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bytes_read) OVERRIDE {} 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnCompleted(URLRequest* request, bool started) OVERRIDE {} 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnURLRequestDestroyed(URLRequest* request) OVERRIDE {} 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnPACScriptError(int line_number, 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& error) OVERRIDE {} 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual NetworkDelegate::AuthRequiredResponse OnAuthRequired( 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest* request, 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AuthChallengeInfo& auth_info, 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AuthCallback& callback, 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthCredentials* credentials) OVERRIDE { 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnCanGetCookies(const URLRequest& request, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CookieList& cookie_list) OVERRIDE { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnCanSetCookie(const URLRequest& request, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& cookie_line, 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CookieOptions* options) OVERRIDE { 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnCanAccessFile(const net::URLRequest& request, 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path) const OVERRIDE { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnCanThrottleRequest(const URLRequest& request) const OVERRIDE { 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int OnBeforeSocketStreamConnect( 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SocketStream* stream, 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback) OVERRIDE { 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BasicNetworkDelegate); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProxyScriptFetcherImplTest : public PlatformTest { 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptFetcherImplTest() 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : test_server_(SpawnedTestServer::TYPE_HTTP, 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::kLocalhost, 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(kDocRoot)) { 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_.set_network_delegate(&network_delegate_); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer test_server_; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BasicNetworkDelegate network_delegate_; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestContext context_; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if !defined(DISABLE_FILE_SUPPORT) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyScriptFetcherImplTest, FileUrl) { 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptFetcherImpl pac_fetcher(&context_); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Fetch a non-existent file. 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = pac_fetcher.Fetch(GetTestFileUrl("does-not-exist"), 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &text, callback.callback()); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, result); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_FILE_NOT_FOUND, callback.WaitForResult()); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(text.empty()); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Fetch a file that exists. 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = pac_fetcher.Fetch(GetTestFileUrl("pac.txt"), 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &text, callback.callback()); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, result); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, callback.WaitForResult()); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("-pac.txt-\n"), text); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 234010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif // !defined(DISABLE_FILE_SUPPORT) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that all mime types are allowed for PAC file, to be consistent 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// with other browsers. 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyScriptFetcherImplTest, HttpMimeType) { 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptFetcherImpl pac_fetcher(&context_); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Fetch a PAC with mime type "text/plain" 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server_.GetURL("files/pac.txt")); 245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = pac_fetcher.Fetch(url, &text, callback.callback()); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, result); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, callback.WaitForResult()); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("-pac.txt-\n"), text); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Fetch a PAC with mime type "text/html" 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server_.GetURL("files/pac.html")); 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = pac_fetcher.Fetch(url, &text, callback.callback()); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, result); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, callback.WaitForResult()); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("-pac.html-\n"), text); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Fetch a PAC with mime type "application/x-ns-proxy-autoconfig" 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server_.GetURL("files/pac.nsproxy")); 263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = pac_fetcher.Fetch(url, &text, callback.callback()); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, result); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, callback.WaitForResult()); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("-pac.nsproxy-\n"), text); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyScriptFetcherImplTest, HttpStatusCode) { 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptFetcherImpl pac_fetcher(&context_); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Fetch a PAC which gives a 500 -- FAIL 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server_.GetURL("files/500.pac")); 279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = pac_fetcher.Fetch(url, &text, callback.callback()); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, result); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_PAC_STATUS_NOT_OK, callback.WaitForResult()); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(text.empty()); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Fetch a PAC which gives a 404 -- FAIL 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server_.GetURL("files/404.pac")); 288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = pac_fetcher.Fetch(url, &text, callback.callback()); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, result); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_PAC_STATUS_NOT_OK, callback.WaitForResult()); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(text.empty()); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyScriptFetcherImplTest, ContentDisposition) { 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptFetcherImpl pac_fetcher(&context_); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fetch PAC scripts via HTTP with a Content-Disposition header -- should 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // have no effect. 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server_.GetURL("files/downloadable.pac")); 305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = pac_fetcher.Fetch(url, &text, callback.callback()); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, result); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, callback.WaitForResult()); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("-downloadable.pac-\n"), text); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that PAC scripts are not being cached. 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyScriptFetcherImplTest, NoCache) { 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptFetcherImpl pac_fetcher(&context_); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fetch a PAC script whose HTTP headers make it cacheable for 1 hour. 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server_.GetURL("files/cacheable_1hr.pac")); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = pac_fetcher.Fetch(url, &text, callback.callback()); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, result); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, callback.WaitForResult()); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("-cacheable_1hr.pac-\n"), text); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Kill the HTTP server. 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Stop()); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Try to fetch the file again. Since the server is not running anymore, the 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // call should fail, thus indicating that the file was not fetched from the 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // local cache. 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = pac_fetcher.Fetch(url, &text, callback.callback()); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, result); 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Expect any error. The exact error varies by platform. 3437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_NE(OK, callback.WaitForResult()); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyScriptFetcherImplTest, TooLarge) { 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptFetcherImpl pac_fetcher(&context_); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the maximum response size to 50 bytes. 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int prev_size = pac_fetcher.SetSizeConstraint(50); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These two URLs are the same file, but are http:// vs file:// 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL urls[] = { 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURL("files/large-pac.nsproxy"), 358cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if !defined(DISABLE_FILE_SUPPORT) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetTestFileUrl("large-pac.nsproxy") 360cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try fetching URLs that are 101 bytes large. We should abort the request 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // after 50 bytes have been read, and fail with a too large error. 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(urls); ++i) { 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url = urls[i]; 367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = pac_fetcher.Fetch(url, &text, callback.callback()); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, result); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_FILE_TOO_BIG, callback.WaitForResult()); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(text.empty()); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Restore the original size bound. 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pac_fetcher.SetSizeConstraint(prev_size); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Make sure we can still fetch regular URLs. 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server_.GetURL("files/pac.nsproxy")); 380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = pac_fetcher.Fetch(url, &text, callback.callback()); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, result); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, callback.WaitForResult()); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("-pac.nsproxy-\n"), text); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyScriptFetcherImplTest, Hang) { 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptFetcherImpl pac_fetcher(&context_); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the timeout period to 0.5 seconds. 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta prev_timeout = pac_fetcher.SetTimeoutConstraint( 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(500)); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try fetching a URL which takes 1.2 seconds. We should abort the request 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // after 500 ms, and fail with a timeout error. 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server_.GetURL("slow/proxy.pac?1.2")); 402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = pac_fetcher.Fetch(url, &text, callback.callback()); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, result); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_TIMED_OUT, callback.WaitForResult()); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(text.empty()); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Restore the original timeout period. 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pac_fetcher.SetTimeoutConstraint(prev_timeout); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Make sure we can still fetch regular URLs. 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server_.GetURL("files/pac.nsproxy")); 415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = pac_fetcher.Fetch(url, &text, callback.callback()); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, result); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, callback.WaitForResult()); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("-pac.nsproxy-\n"), text); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The ProxyScriptFetcher should decode any content-codings 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (like gzip, bzip, etc.), and apply any charset conversions to yield 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// UTF8. 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyScriptFetcherImplTest, Encodings) { 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptFetcherImpl pac_fetcher(&context_); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test a response that is gzip-encoded -- should get inflated. 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server_.GetURL("files/gzipped_pac")); 435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = pac_fetcher.Fetch(url, &text, callback.callback()); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, result); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, callback.WaitForResult()); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("This data was gzipped.\n"), text); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test a response that was served as UTF-16 (BE). It should 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be converted to UTF8. 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server_.GetURL("files/utf16be_pac")); 447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = pac_fetcher.Fetch(url, &text, callback.callback()); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, result); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, callback.WaitForResult()); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("This was encoded as UTF-16BE.\n"), text); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyScriptFetcherImplTest, DataURLs) { 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptFetcherImpl pac_fetcher(&context_); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kEncodedUrl[] = 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "data:application/x-ns-proxy-autoconfig;base64,ZnVuY3Rpb24gRmluZFByb3h5R" 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "m9yVVJMKHVybCwgaG9zdCkgewogIGlmIChob3N0ID09ICdmb29iYXIuY29tJykKICAgIHJl" 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dHVybiAnUFJPWFkgYmxhY2tob2xlOjgwJzsKICByZXR1cm4gJ0RJUkVDVCc7Cn0="; 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kPacScript[] = 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "function FindProxyForURL(url, host) {\n" 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " if (host == 'foobar.com')\n" 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return 'PROXY blackhole:80';\n" 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return 'DIRECT';\n" 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}"; 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test fetching a "data:"-url containing a base64 encoded PAC script. 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(kEncodedUrl); 473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = pac_fetcher.Fetch(url, &text, callback.callback()); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, result); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16(kPacScript), text); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kEncodedUrlBroken[] = 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "data:application/x-ns-proxy-autoconfig;base64,ZnVuY3Rpb24gRmluZFByb3h5R"; 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test a broken "data:"-url containing a base64 encoded PAC script. 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(kEncodedUrlBroken); 486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = pac_fetcher.Fetch(url, &text, callback.callback()); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_FAILED, result); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 494