url_request_unittest.cc revision b2df76ea8fec9e32f6f3718986dba0d95315b29c
192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Copyright (c) 2012 The Chromium Authors. All rights reserved. 292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Use of this source code is governed by a BSD-style license that can be 392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// found in the LICENSE file. 492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "build/build_config.h" 692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if defined(OS_WIN) 892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include <windows.h> 992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include <shlobj.h> 1092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif 1192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 1292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include <algorithm> 1392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include <string> 1492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 1592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "base/basictypes.h" 1692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "base/bind.h" 1792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "base/compiler_specific.h" 1892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "base/file_util.h" 1992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "base/format_macros.h" 2092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "base/memory/weak_ptr.h" 2192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "base/message_loop.h" 2292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "base/path_service.h" 2392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "base/process_util.h" 2492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "base/string_number_conversions.h" 2592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "base/string_util.h" 2692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "base/stringprintf.h" 2792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "base/strings/string_piece.h" 2892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "base/strings/string_split.h" 2992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "base/utf_string_conversions.h" 3092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/base/capturing_net_log.h" 3192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/base/load_flags.h" 3292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/base/load_timing_info.h" 3392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/base/load_timing_info_test_util.h" 3492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/base/net_errors.h" 3592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/base/net_log.h" 3692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/base/net_log_unittest.h" 3792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/base/net_module.h" 3892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/base/net_util.h" 3992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/base/test_data_directory.h" 4092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/base/upload_bytes_element_reader.h" 4192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/base/upload_data_stream.h" 4292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/base/upload_file_element_reader.h" 4392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/cert/ev_root_ca_metadata.h" 4492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/cert/test_root_certs.h" 4592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/cookies/cookie_monster.h" 4692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/cookies/cookie_store_test_helpers.h" 4792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/disk_cache/disk_cache.h" 4892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/dns/mock_host_resolver.h" 4992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/ftp/ftp_network_layer.h" 5092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/http/http_cache.h" 5192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/http/http_network_layer.h" 5292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/http/http_network_session.h" 5392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/http/http_request_headers.h" 5492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/http/http_response_headers.h" 5592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/ocsp/nss_ocsp.h" 5692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/proxy/proxy_service.h" 5792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/socket/ssl_client_socket.h" 5892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/ssl/ssl_connection_status_flags.h" 5992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/test/cert_test_util.h" 6092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/test/spawned_test_server/spawned_test_server.h" 6114193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller#include "net/url_request/data_protocol_handler.h" 6292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/url_request/file_protocol_handler.h" 6392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/url_request/ftp_protocol_handler.h" 6492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/url_request/static_http_user_agent_settings.h" 6592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/url_request/url_request.h" 6692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/url_request/url_request_file_dir_job.h" 6792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/url_request/url_request_http_job.h" 6892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/url_request/url_request_job_factory_impl.h" 6992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/url_request/url_request_redirect_job.h" 7092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/url_request/url_request_test_job.h" 7192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/url_request/url_request_test_util.h" 7292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "testing/gtest/include/gtest/gtest.h" 730cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller#include "testing/platform_test.h" 7492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 7592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if defined(OS_WIN) 7692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "base/win/scoped_com_initializer.h" 7792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "base/win/scoped_comptr.h" 7892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "base/win/windows_version.h" 7992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif 8092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 8192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieriusing base::Time; 8292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 8392617aeac109481258f0c3863d09c1b8903d438bLuca Barbierinamespace net { 8465303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller 8592617aeac109481258f0c3863d09c1b8903d438bLuca Barbierinamespace { 8692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 8792617aeac109481258f0c3863d09c1b8903d438bLuca Barbiericonst base::string16 kChrome(ASCIIToUTF16("chrome")); 8892617aeac109481258f0c3863d09c1b8903d438bLuca Barbiericonst base::string16 kSecret(ASCIIToUTF16("secret")); 8914193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumillerconst base::string16 kUser(ASCIIToUTF16("user")); 9092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 9165303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller// Tests load timing information in the case a fresh connection was used, with 9292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// no proxy. 9392617aeac109481258f0c3863d09c1b8903d438bLuca Barbierivoid TestLoadTimingNotReused(const net::LoadTimingInfo& load_timing_info, 9492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri int connect_timing_flags) { 9592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_FALSE(load_timing_info.socket_reused); 9692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_NE(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id); 9792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 9892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_FALSE(load_timing_info.request_start_time.is_null()); 9992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_FALSE(load_timing_info.request_start.is_null()); 10092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 10192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_LE(load_timing_info.request_start, 10292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri load_timing_info.connect_timing.connect_start); 10392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ExpectConnectTimingHasTimes(load_timing_info.connect_timing, 10492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri connect_timing_flags); 10592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_LE(load_timing_info.connect_timing.connect_end, 10692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri load_timing_info.send_start); 10792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_LE(load_timing_info.send_start, load_timing_info.send_end); 10892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_LE(load_timing_info.send_end, load_timing_info.receive_headers_end); 10992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 11092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(load_timing_info.proxy_resolve_start.is_null()); 11192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(load_timing_info.proxy_resolve_end.is_null()); 11292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 11392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 11492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Same as above, but with proxy times. 115b4b2091655676ec3b898d3ae7298192aa7f9147fLuca Barbierivoid TestLoadTimingNotReusedWithProxy( 11692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri const net::LoadTimingInfo& load_timing_info, 11792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri int connect_timing_flags) { 11892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_FALSE(load_timing_info.socket_reused); 11992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_NE(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id); 12092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 12192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_FALSE(load_timing_info.request_start_time.is_null()); 12292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_FALSE(load_timing_info.request_start.is_null()); 12392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 12492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_LE(load_timing_info.request_start, 12592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri load_timing_info.proxy_resolve_start); 12692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_LE(load_timing_info.proxy_resolve_start, 12792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri load_timing_info.proxy_resolve_end); 12892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_LE(load_timing_info.proxy_resolve_end, 12992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri load_timing_info.connect_timing.connect_start); 13092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ExpectConnectTimingHasTimes(load_timing_info.connect_timing, 13192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri connect_timing_flags); 13292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_LE(load_timing_info.connect_timing.connect_end, 13392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri load_timing_info.send_start); 13492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_LE(load_timing_info.send_start, load_timing_info.send_end); 13592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_LE(load_timing_info.send_end, load_timing_info.receive_headers_end); 13692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 13792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 13892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Same as above, but with a reused socket and proxy times. 13992617aeac109481258f0c3863d09c1b8903d438bLuca Barbierivoid TestLoadTimingReusedWithProxy( 14092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri const net::LoadTimingInfo& load_timing_info) { 14192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(load_timing_info.socket_reused); 14292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_NE(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id); 14392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 14492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_FALSE(load_timing_info.request_start_time.is_null()); 14592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_FALSE(load_timing_info.request_start.is_null()); 14692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 14792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing); 14892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 14992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_LE(load_timing_info.request_start, 15014193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller load_timing_info.proxy_resolve_start); 151f1063cfee213ba92f7c9e34199caccf4bed78c1cLuca Barbieri EXPECT_LE(load_timing_info.proxy_resolve_start, 152f1063cfee213ba92f7c9e34199caccf4bed78c1cLuca Barbieri load_timing_info.proxy_resolve_end); 153f1063cfee213ba92f7c9e34199caccf4bed78c1cLuca Barbieri EXPECT_LE(load_timing_info.proxy_resolve_end, 154f1063cfee213ba92f7c9e34199caccf4bed78c1cLuca Barbieri load_timing_info.send_start); 155f1063cfee213ba92f7c9e34199caccf4bed78c1cLuca Barbieri EXPECT_LE(load_timing_info.send_start, load_timing_info.send_end); 156f1063cfee213ba92f7c9e34199caccf4bed78c1cLuca Barbieri EXPECT_LE(load_timing_info.send_end, load_timing_info.receive_headers_end); 15792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 15892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 15992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Tests load timing in the case that there is no underlying connection. This 16092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// can be used to test in the case of cached responses, errors, or non-HTTP 16192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// requests. 16292617aeac109481258f0c3863d09c1b8903d438bLuca Barbierivoid TestLoadTimingNoHttpConnection( 16392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri const net::LoadTimingInfo& load_timing_info) { 16492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_FALSE(load_timing_info.socket_reused); 16592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id); 1660cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller 16792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Only the request times should be non-null. 16892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_FALSE(load_timing_info.request_start_time.is_null()); 16992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_FALSE(load_timing_info.request_start.is_null()); 17092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 17192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing); 17292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 17392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(load_timing_info.proxy_resolve_start.is_null()); 17492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(load_timing_info.proxy_resolve_end.is_null()); 17514193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller EXPECT_TRUE(load_timing_info.send_start.is_null()); 17692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(load_timing_info.send_end.is_null()); 17792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(load_timing_info.receive_headers_end.is_null()); 17892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 17992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 18092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieribase::StringPiece TestNetResourceProvider(int key) { 18192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return "header"; 18292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 18392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 18492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Do a case-insensitive search through |haystack| for |needle|. 18592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieribool ContainsString(const std::string& haystack, const char* needle) { 18692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri std::string::const_iterator it = 18792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri std::search(haystack.begin(), 18892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri haystack.end(), 18992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri needle, 19092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri needle + strlen(needle), 19192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri base::CaseInsensitiveCompare<char>()); 1924a06248281f65d8a653c1bb744947bb6d47fdc9cChristoph Bumiller return it != haystack.end(); 193e27d72d6c3ca3512bfea524b8a7b007960841057Christoph Bumiller} 194e27d72d6c3ca3512bfea524b8a7b007960841057Christoph Bumiller 195dc4c821f0817a3db716f965692fb701079f66340Marek Olšákvoid FillBuffer(char* buffer, size_t len) { 19692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri static bool called = false; 19792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if (!called) { 19892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri called = true; 19992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri int seed = static_cast<int>(Time::Now().ToInternalValue()); 20092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri srand(seed); 20192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 20292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 20392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri for (size_t i = 0; i < len; i++) { 20492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri buffer[i] = static_cast<char>(rand()); 20592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if (!buffer[i]) 20692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri buffer[i] = 'g'; 20792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 20892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 20992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 21092617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriUploadDataStream* CreateSimpleUploadData(const char* data) { 21192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri scoped_ptr<UploadElementReader> reader( 21292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri new UploadBytesElementReader(data, strlen(data))); 21392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return UploadDataStream::CreateWithReader(reader.Pass(), 0); 21492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 21592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 21692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Verify that the SSLInfo of a successful SSL connection has valid values. 21792617aeac109481258f0c3863d09c1b8903d438bLuca Barbierivoid CheckSSLInfo(const SSLInfo& ssl_info) { 21892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Allow ChromeFrame fake SSLInfo to get through. 2199f61e43b4903c6cf0ac03a479ec9ed7b15fd6ccfDave Airlie if (ssl_info.cert.get() && 2209f61e43b4903c6cf0ac03a479ec9ed7b15fd6ccfDave Airlie ssl_info.cert.get()->issuer().GetDisplayName() == "Chrome Internal") { 2219f61e43b4903c6cf0ac03a479ec9ed7b15fd6ccfDave Airlie // -1 means unknown. 2229f61e43b4903c6cf0ac03a479ec9ed7b15fd6ccfDave Airlie EXPECT_EQ(ssl_info.security_bits, -1); 22392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return; 22492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 22592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 22692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // -1 means unknown. 0 means no encryption. 22792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_GT(ssl_info.security_bits, 0); 22892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 22992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // The cipher suite TLS_NULL_WITH_NULL_NULL (0) must not be negotiated. 23092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri int cipher_suite = SSLConnectionStatusToCipherSuite( 23192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ssl_info.connection_status); 23292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_NE(0, cipher_suite); 23392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 23492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 23592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieribool FingerprintsEqual(const HashValueVector& a, const HashValueVector& b) { 23692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri size_t size = a.size(); 23792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 23892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if (size != b.size()) 23992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return false; 24092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 24192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri for (size_t i = 0; i < size; ++i) { 24265303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller if (!a[i].Equals(b[i])) 24392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return false; 24492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 24592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 24692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return true; 24792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 24892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 24992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// A network delegate that allows the user to choose a subset of request stages 25092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// to block in. When blocking, the delegate can do one of the following: 25192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// * synchronously return a pre-specified error code, or 25292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// * asynchronously return that value via an automatically called callback, 25392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// or 25492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// * block and wait for the user to do a callback. 25592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Additionally, the user may also specify a redirect URL -- then each request 25692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// with the current URL different from the redirect target will be redirected 25792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// to that target, in the on-before-URL-request stage, independent of whether 25892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// the delegate blocks in ON_BEFORE_URL_REQUEST or not. 25992617aeac109481258f0c3863d09c1b8903d438bLuca Barbiericlass BlockingNetworkDelegate : public TestNetworkDelegate { 26092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri public: 26192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Stages in which the delegate can block. 26292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri enum Stage { 26392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri NOT_BLOCKED = 0, 26492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ON_BEFORE_URL_REQUEST = 1 << 0, 2651b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri ON_BEFORE_SEND_HEADERS = 1 << 1, 2661b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri ON_HEADERS_RECEIVED = 1 << 2, 26792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ON_AUTH_REQUIRED = 1 << 3 2681b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri }; 2691b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri 27092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Behavior during blocked stages. During other stages, just 2711b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri // returns net::OK or NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION. 2721b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri enum BlockMode { 27392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri SYNCHRONOUS, // No callback, returns specified return values. 2741b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri AUTO_CALLBACK, // |this| posts a task to run the callback using the 2751b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri // specified return codes. 27692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri USER_CALLBACK, // User takes care of doing a callback. |retval_| and 2771b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri // |auth_retval_| are ignored. In every blocking stage the 2781b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri // message loop is quit. 2791b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri }; 2801b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri 2811b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri // Creates a delegate which does not block at all. 28292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri explicit BlockingNetworkDelegate(BlockMode block_mode); 2831b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri 2841b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri // For users to trigger a callback returning |response|. 28592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Side-effects: resets |stage_blocked_for_callback_| and stored callbacks. 2861b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri // Only call if |block_mode_| == USER_CALLBACK. 2871b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri void DoCallback(int response); 28892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri void DoAuthCallback(NetworkDelegate::AuthRequiredResponse response); 2891b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri 29092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Setters. 29192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri void set_retval(int retval) { 29292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ASSERT_NE(USER_CALLBACK, block_mode_); 29392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ASSERT_NE(ERR_IO_PENDING, retval); 29492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ASSERT_NE(OK, retval); 29592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri retval_ = retval; 29692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 29792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 29892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // If |auth_retval| == AUTH_REQUIRED_RESPONSE_SET_AUTH, then 29992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // |auth_credentials_| will be passed with the response. 3008224256946619fb25278718bbf4703e3b9d60c93Luca Barbieri void set_auth_retval(AuthRequiredResponse auth_retval) { 3013e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri ASSERT_NE(USER_CALLBACK, block_mode_); 30292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ASSERT_NE(AUTH_REQUIRED_RESPONSE_IO_PENDING, auth_retval); 3038224256946619fb25278718bbf4703e3b9d60c93Luca Barbieri auth_retval_ = auth_retval; 3043e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri } 30592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri void set_auth_credentials(const AuthCredentials& auth_credentials) { 30692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri auth_credentials_ = auth_credentials; 30792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 30892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 30992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri void set_redirect_url(const GURL& url) { 31092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri redirect_url_ = url; 31192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 31292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 31392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri void set_block_on(int block_on) { 31492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri block_on_ = block_on; 31592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 31692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 31792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Allows the user to check in which state did we block. 31892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri Stage stage_blocked_for_callback() const { 31992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(USER_CALLBACK, block_mode_); 32092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return stage_blocked_for_callback_; 32192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 32292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 32392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri private: 32492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri void RunCallback(int response, const CompletionCallback& callback); 32592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri void RunAuthCallback(AuthRequiredResponse response, 32692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri const AuthCallback& callback); 32792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 32892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // TestNetworkDelegate implementation. 32992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri virtual int OnBeforeURLRequest(URLRequest* request, 33092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri const CompletionCallback& callback, 33192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri GURL* new_url) OVERRIDE; 33292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 33392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri virtual int OnBeforeSendHeaders(URLRequest* request, 33492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri const CompletionCallback& callback, 33592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri HttpRequestHeaders* headers) OVERRIDE; 33692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 33792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri virtual int OnHeadersReceived( 33892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest* request, 33992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri const CompletionCallback& callback, 34092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri const HttpResponseHeaders* original_response_headers, 34192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri scoped_refptr<HttpResponseHeaders>* override_response_headers) OVERRIDE; 34292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 34355592d9da1bb694c7275984cf9a3ecaafcccf46aChristoph Bumiller virtual NetworkDelegate::AuthRequiredResponse OnAuthRequired( 34492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest* request, 34555592d9da1bb694c7275984cf9a3ecaafcccf46aChristoph Bumiller const AuthChallengeInfo& auth_info, 34692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri const AuthCallback& callback, 347507337864fa80caf9f26602324d2c28dd0a75d61Marek Olšák AuthCredentials* credentials) OVERRIDE; 34892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 34992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Resets the callbacks and |stage_blocked_for_callback_|. 35092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri void Reset(); 35192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 35292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Checks whether we should block in |stage|. If yes, returns an error code 35392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // and optionally sets up callback based on |block_mode_|. If no, returns OK. 35492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri int MaybeBlockStage(Stage stage, const CompletionCallback& callback); 35592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 35692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Configuration parameters, can be adjusted by public methods: 35792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri const BlockMode block_mode_; 35892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 35992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Values returned on blocking stages when mode is SYNCHRONOUS or 36092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // AUTO_CALLBACK. For USER_CALLBACK these are set automatically to IO_PENDING. 36192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri int retval_; // To be returned in non-auth stages. 36292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri AuthRequiredResponse auth_retval_; 36392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 36492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri GURL redirect_url_; // Used if non-empty. 36592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri int block_on_; // Bit mask: in which stages to block. 36692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 36792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // |auth_credentials_| will be copied to |*target_auth_credential_| on 36892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // callback. 36992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri AuthCredentials auth_credentials_; 37092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri AuthCredentials* target_auth_credentials_; 37192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 37292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Internal variables, not set by not the user: 37392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Last blocked stage waiting for user callback (unused if |block_mode_| != 37492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // USER_CALLBACK). 37592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri Stage stage_blocked_for_callback_; 37692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 37792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Callback objects stored during blocking stages. 37892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri CompletionCallback callback_; 37992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri AuthCallback auth_callback_; 38092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 38165303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller base::WeakPtrFactory<BlockingNetworkDelegate> weak_factory_; 382974412d7b985f44c2d3a68f818d2723346a4512bChristoph Bumiller 38392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri DISALLOW_COPY_AND_ASSIGN(BlockingNetworkDelegate); 38465303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller}; 38565303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller 38665303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph BumillerBlockingNetworkDelegate::BlockingNetworkDelegate(BlockMode block_mode) 38765303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller : block_mode_(block_mode), 38865303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller retval_(OK), 38992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri auth_retval_(AUTH_REQUIRED_RESPONSE_NO_ACTION), 39092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri block_on_(0), 39192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri target_auth_credentials_(NULL), 39292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri stage_blocked_for_callback_(NOT_BLOCKED), 39392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri weak_factory_(this) { 3948224256946619fb25278718bbf4703e3b9d60c93Luca Barbieri} 39592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 39692617aeac109481258f0c3863d09c1b8903d438bLuca Barbierivoid BlockingNetworkDelegate::DoCallback(int response) { 39792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ASSERT_EQ(USER_CALLBACK, block_mode_); 39892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ASSERT_NE(NOT_BLOCKED, stage_blocked_for_callback_); 39992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ASSERT_NE(ON_AUTH_REQUIRED, stage_blocked_for_callback_); 40092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri CompletionCallback callback = callback_; 4018224256946619fb25278718bbf4703e3b9d60c93Luca Barbieri Reset(); 40292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri RunCallback(response, callback); 40392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 40492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 40592617aeac109481258f0c3863d09c1b8903d438bLuca Barbierivoid BlockingNetworkDelegate::DoAuthCallback( 40692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri NetworkDelegate::AuthRequiredResponse response) { 40792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ASSERT_EQ(USER_CALLBACK, block_mode_); 4083e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri ASSERT_EQ(ON_AUTH_REQUIRED, stage_blocked_for_callback_); 4093e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri AuthCallback auth_callback = auth_callback_; 4103e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri Reset(); 41192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri RunAuthCallback(response, auth_callback); 41292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 4133e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 41492617aeac109481258f0c3863d09c1b8903d438bLuca Barbierivoid BlockingNetworkDelegate::RunCallback(int response, 41592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri const CompletionCallback& callback) { 4163e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri callback.Run(response); 4173e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri} 4183e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 41992617aeac109481258f0c3863d09c1b8903d438bLuca Barbierivoid BlockingNetworkDelegate::RunAuthCallback(AuthRequiredResponse response, 42092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri const AuthCallback& callback) { 4213e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri if (auth_retval_ == AUTH_REQUIRED_RESPONSE_SET_AUTH) { 4223e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri ASSERT_TRUE(target_auth_credentials_ != NULL); 42392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri *target_auth_credentials_ = auth_credentials_; 42492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 4253e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri callback.Run(response); 4263e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri} 4273e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 42892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieriint BlockingNetworkDelegate::OnBeforeURLRequest( 42992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest* request, 4303e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri const CompletionCallback& callback, 43192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri GURL* new_url) { 43292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if (redirect_url_ == request->url()) 4333e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri return OK; // We've already seen this request and redirected elsewhere. 4343e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 4353e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri TestNetworkDelegate::OnBeforeURLRequest(request, callback, new_url); 43692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 43792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if (!redirect_url_.is_empty()) 4383e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri *new_url = redirect_url_; 4393e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 44092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return MaybeBlockStage(ON_BEFORE_URL_REQUEST, callback); 44192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 4423e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 4433e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieriint BlockingNetworkDelegate::OnBeforeSendHeaders( 4443e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri URLRequest* request, 44592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri const CompletionCallback& callback, 44692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri HttpRequestHeaders* headers) { 4473e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri TestNetworkDelegate::OnBeforeSendHeaders(request, callback, headers); 44892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 44992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return MaybeBlockStage(ON_BEFORE_SEND_HEADERS, callback); 4503e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri} 4513e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 4523e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieriint BlockingNetworkDelegate::OnHeadersReceived( 45392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest* request, 45492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri const CompletionCallback& callback, 4553e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri const HttpResponseHeaders* original_response_headers, 4563e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri scoped_refptr<HttpResponseHeaders>* override_response_headers) { 45792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestNetworkDelegate::OnHeadersReceived( 45892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri request, callback, original_response_headers, 45992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri override_response_headers); 46092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 46192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return MaybeBlockStage(ON_HEADERS_RECEIVED, callback); 46292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 46392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 46492617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriNetworkDelegate::AuthRequiredResponse BlockingNetworkDelegate::OnAuthRequired( 46592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest* request, 46692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri const AuthChallengeInfo& auth_info, 46792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri const AuthCallback& callback, 46892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri AuthCredentials* credentials) { 46992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestNetworkDelegate::OnAuthRequired(request, auth_info, callback, 47092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri credentials); 47192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Check that the user has provided callback for the previous blocked stage. 47292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(NOT_BLOCKED, stage_blocked_for_callback_); 47392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 47492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if ((block_on_ & ON_AUTH_REQUIRED) == 0) { 4753e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri return AUTH_REQUIRED_RESPONSE_NO_ACTION; 4763e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri } 4773e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 4783e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri target_auth_credentials_ = credentials; 47992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 48092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri switch (block_mode_) { 4813e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri case SYNCHRONOUS: 4823e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri if (auth_retval_ == AUTH_REQUIRED_RESPONSE_SET_AUTH) 48392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri *target_auth_credentials_ = auth_credentials_; 48492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return auth_retval_; 48592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 4863e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri case AUTO_CALLBACK: 4873e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri MessageLoop::current()->PostTask( 4883e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri FROM_HERE, 48992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri base::Bind(&BlockingNetworkDelegate::RunAuthCallback, 49092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri weak_factory_.GetWeakPtr(), auth_retval_, callback)); 4913e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri return AUTH_REQUIRED_RESPONSE_IO_PENDING; 4923e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 49392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri case USER_CALLBACK: 49492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri auth_callback_ = callback; 49592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri stage_blocked_for_callback_ = ON_AUTH_REQUIRED; 49692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri MessageLoop::current()->PostTask(FROM_HERE, MessageLoop::QuitClosure()); 49792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return AUTH_REQUIRED_RESPONSE_IO_PENDING; 49892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 49992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri NOTREACHED(); 50092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return AUTH_REQUIRED_RESPONSE_NO_ACTION; // Dummy value. 50192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 50292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 503f1063cfee213ba92f7c9e34199caccf4bed78c1cLuca Barbierivoid BlockingNetworkDelegate::Reset() { 50492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_NE(NOT_BLOCKED, stage_blocked_for_callback_); 50565303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller stage_blocked_for_callback_ = NOT_BLOCKED; 50692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri callback_.Reset(); 50792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri auth_callback_.Reset(); 50892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 50965303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller 51092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieriint BlockingNetworkDelegate::MaybeBlockStage( 51192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri BlockingNetworkDelegate::Stage stage, 51265303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller const CompletionCallback& callback) { 51392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Check that the user has provided callback for the previous blocked stage. 51492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(NOT_BLOCKED, stage_blocked_for_callback_); 51565303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller 51692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if ((block_on_ & stage) == 0) { 51792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return OK; 51892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 51992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 52092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri switch (block_mode_) { 52192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri case SYNCHRONOUS: 52292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_NE(OK, retval_); 52365303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller return retval_; 52492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 525f1063cfee213ba92f7c9e34199caccf4bed78c1cLuca Barbieri case AUTO_CALLBACK: 52692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri MessageLoop::current()->PostTask( 52765303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller FROM_HERE, 52892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri base::Bind(&BlockingNetworkDelegate::RunCallback, 52992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri weak_factory_.GetWeakPtr(), retval_, callback)); 53092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return ERR_IO_PENDING; 53165303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller 53292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri case USER_CALLBACK: 53392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri callback_ = callback; 53465303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller stage_blocked_for_callback_ = stage; 53592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri MessageLoop::current()->PostTask(FROM_HERE, MessageLoop::QuitClosure()); 53692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return ERR_IO_PENDING; 53765303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller } 53892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri NOTREACHED(); 53992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return 0; 54092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 54192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 54292617aeac109481258f0c3863d09c1b8903d438bLuca Barbiericlass TestURLRequestContextWithProxy : public TestURLRequestContext { 54392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri public: 54492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Does not own |delegate|. 54592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestURLRequestContextWithProxy(const std::string& proxy, 54692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri NetworkDelegate* delegate) 54792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri : TestURLRequestContext(true) { 54892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri context_storage_.set_proxy_service(ProxyService::CreateFixed(proxy)); 54992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri set_network_delegate(delegate); 55092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri Init(); 55192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 55292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri virtual ~TestURLRequestContextWithProxy() {} 55392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}; 55492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 55592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} // namespace 55692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 55792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Inherit PlatformTest since we require the autorelease pool on Mac OS X. 55892617aeac109481258f0c3863d09c1b8903d438bLuca Barbiericlass URLRequestTest : public PlatformTest { 55992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri public: 56092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequestTest() : default_context_(true) { 56192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri default_context_.set_network_delegate(&default_network_delegate_); 56292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri default_context_.set_net_log(&net_log_); 56392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri job_factory_.SetProtocolHandler("data", new DataProtocolHandler); 56492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri job_factory_.SetProtocolHandler("file", new FileProtocolHandler); 56592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri default_context_.set_job_factory(&job_factory_); 5663e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri default_context_.Init(); 56792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 56892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri virtual ~URLRequestTest() {} 5693e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 57092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Adds the TestJobInterceptor to the default context. 5713e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri TestJobInterceptor* AddTestInterceptor() { 5723e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri TestJobInterceptor* protocol_handler_ = new TestJobInterceptor(); 57392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri job_factory_.SetProtocolHandler("http", NULL); 57492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri job_factory_.SetProtocolHandler("http", protocol_handler_); 57592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return protocol_handler_; 57692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 5773e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 57892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri protected: 57992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri CapturingNetLog net_log_; 5803e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri TestNetworkDelegate default_network_delegate_; // Must outlive URLRequest. 58192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequestJobFactoryImpl job_factory_; 58292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestURLRequestContext default_context_; 58392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}; 5843e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 5853e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca BarbieriTEST_F(URLRequestTest, AboutBlankTest) { 5863e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri TestDelegate d; 5873e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri { 5883e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri URLRequest r(GURL("about:blank"), &d, &default_context_); 58992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 59092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri r.Start(); 59192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(r.is_pending()); 5923e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 59392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri MessageLoop::current()->Run(); 5943e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 5953e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri EXPECT_TRUE(!r.is_pending()); 5963e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri EXPECT_FALSE(d.received_data_before_response()); 597856f3336dc6687c6629f88f67e589e007763ddf0Christoph Bumiller EXPECT_EQ(d.bytes_received(), 0); 59892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ("", r.GetSocketAddress().host()); 59992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, r.GetSocketAddress().port()); 6003e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri } 6013e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri} 6023e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 6033e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca BarbieriTEST_F(URLRequestTest, DataURLImageTest) { 60492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestDelegate d; 60592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 60692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Use our nice little Chrome logo. 60792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest r(GURL( 60892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri "data:image/png;base64," 6093e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADVklEQVQ4jX2TfUwUBBjG3" 61092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri "w1y+HGcd9dxhXR8T4awOccJGgOSWclHImznLkTlSw0DDQXkrmgYgbUYnlQTqQxIEVxitD" 61192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri "5UMCATRA1CEEg+Qjw3bWDxIauJv/5oumqs39/P827vnucRmYN0gyF01GI5MpCVdW0gO7t" 61292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri "vNC+vqSEtbZefk5NuLv1jdJ46p/zw0HeH4+PHr3h7c1mjoV2t5rKzMx1+fg9bAgK6zHq9" 61392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri "cU5z+LpA3xOtx34+vTeT21onRuzssC3zxbbSwC13d/pFuC7CkIMDxQpF7r/MWq12UctI1" 61492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri "dWWm99ypqSYmRUBdKem8MkrO/kgaTt1O7YzlpzE5GIVd0WYUqt57yWf2McHTObYPbVD+Z" 6153e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri "wbtlLTVMZ3BW+TnLyXLaWtmEq6WJVbT3HBh3Svj2HQQcm43XwmtoYM6vVKleh0uoWvnzW" 6163e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri "3v3MpidruPTQPf0bia7sJOtBM0ufTWNvus/nkDFHF9ZS+uYVjRUasMeHUmyLYtcklTvzW" 6173e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri "GFZnNOXczThvpKIzjcahSqIzkvDLayDq6D3eOjtBbNUEIZYyqsvj4V4wY92eNJ4IoyhTb" 6183e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri "xXX1T5xsV9tm9r4TQwHLiZw/pdDZJea8TKmsmR/K0uLh/GwnCHghTja6lPhphezPfO5/5" 6193e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri "MrVvMzNaI3+ERHfrFzPKQukrQGI4d/3EFD/3E2mVNYvi4at7CXWREaxZGD+3hg28zD3gV" 62092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri "Md6q5c8GdosynKmSeRuGzpjyl1/9UDGtPR5HeaKT8Wjo17WXk579BXVUhN64ehF9fhRtq" 62192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri "/uxxZKzNiZFGD0wRC3NFROZ5mwIPL/96K/rKMMLrIzF9uhHr+/sYH7DAbwlgC4J+R2Z7F" 6223e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri "Ux1qLnV7MGF40smVSoJ/jvHRfYhQeUJd/SnYtGWhPHR0Sz+GE2F2yth0B36Vcz2KpnufB" 62392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri "JbsysjjW4kblBUiIjiURUWqJY65zxbnTy57GQyH58zgy0QBtTQv5gH15XMdKkYu+TGaJM" 6243e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri "nlm2O34uI4b9tflqp1+QEFGzoW/ulmcofcpkZCYJhDfSpme7QcrHa+Xfji8paEQkTkSfm" 6253e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri "moRWRNZr/F1KfVMjW+IKEnv2FwZfKdzt0BQR6lClcZR0EfEXEfv/G6W9iLiIyCoReV5En" 62692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri "hORIBHx+ufPj/gLB/zGI/G4Bk0AAAAASUVORK5CYII="), 62792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri &d, 6283e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri &default_context_); 62992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 6303e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri r.Start(); 6313e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri EXPECT_TRUE(r.is_pending()); 63292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 63392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri MessageLoop::current()->Run(); 6343e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 63592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(!r.is_pending()); 6363e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri EXPECT_FALSE(d.received_data_before_response()); 6373e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri EXPECT_EQ(d.bytes_received(), 911); 63892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ("", r.GetSocketAddress().host()); 63992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, r.GetSocketAddress().port()); 64092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 64192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 64292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 64392617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, FileTest) { 64492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri base::FilePath app_path; 64592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri PathService::Get(base::FILE_EXE, &app_path); 64692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri GURL app_url = FilePathToFileURL(app_path); 64792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 64892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestDelegate d; 64992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 6500cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller URLRequest r(app_url, &d, &default_context_); 6510cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller 65292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri r.Start(); 6530cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller EXPECT_TRUE(r.is_pending()); 6540cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller 6550cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller MessageLoop::current()->Run(); 65692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 6570cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller int64 file_size = -1; 6580cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller EXPECT_TRUE(file_util::GetFileSize(app_path, &file_size)); 6590cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller 66092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(!r.is_pending()); 6610cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller EXPECT_EQ(1, d.response_started_count()); 6620cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller EXPECT_FALSE(d.received_data_before_response()); 6630cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size)); 66492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ("", r.GetSocketAddress().host()); 66592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, r.GetSocketAddress().port()); 66692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 66792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 66892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 66992617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, FileTestCancel) { 67092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri base::FilePath app_path; 6713e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri PathService::Get(base::FILE_EXE, &app_path); 6723e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri GURL app_url = FilePathToFileURL(app_path); 6733e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 67492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestDelegate d; 67592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 6763e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri URLRequest r(app_url, &d, &default_context_); 67792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 6783e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri r.Start(); 6793e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri EXPECT_TRUE(r.is_pending()); 6803e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri r.Cancel(); 68192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 68292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Async cancelation should be safe even when URLRequest has been already 68392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // destroyed. 68492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri MessageLoop::current()->RunUntilIdle(); 68592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 68692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 6873e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca BarbieriTEST_F(URLRequestTest, FileTestFullSpecifiedRange) { 6883e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri const size_t buffer_size = 4000; 6893e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri scoped_ptr<char[]> buffer(new char[buffer_size]); 69092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri FillBuffer(buffer.get(), buffer_size); 69192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 6923e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri base::FilePath temp_path; 6933e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri EXPECT_TRUE(file_util::CreateTemporaryFile(&temp_path)); 6943e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri GURL temp_url = FilePathToFileURL(temp_path); 6953e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri EXPECT_TRUE(file_util::WriteFile(temp_path, buffer.get(), buffer_size)); 6963e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 6973e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri int64 file_size; 69892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(file_util::GetFileSize(temp_path, &file_size)); 69992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 70092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri const size_t first_byte_position = 500; 7013e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri const size_t last_byte_position = buffer_size - first_byte_position; 70292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri const size_t content_length = last_byte_position - first_byte_position + 1; 70392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri std::string partial_buffer_string(buffer.get() + first_byte_position, 7043e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri buffer.get() + last_byte_position + 1); 70592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 7063e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri TestDelegate d; 7073e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri { 70892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest r(temp_url, &d, &default_context_); 70992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 7103e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri HttpRequestHeaders headers; 71192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri headers.SetHeader(HttpRequestHeaders::kRange, 71292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri base::StringPrintf( 71392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri "bytes=%" PRIuS "-%" PRIuS, 71492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri first_byte_position, last_byte_position)); 7153e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri r.SetExtraRequestHeaders(headers); 71692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri r.Start(); 71792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(r.is_pending()); 7183e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 71992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri MessageLoop::current()->Run(); 72092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(!r.is_pending()); 72192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(1, d.response_started_count()); 7223e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri EXPECT_FALSE(d.received_data_before_response()); 7233e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri EXPECT_EQ(static_cast<int>(content_length), d.bytes_received()); 7243e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri // Don't use EXPECT_EQ, it will print out a lot of garbage if check failed. 72592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(partial_buffer_string == d.data_received()); 72692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 72792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 72892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(file_util::Delete(temp_path, false)); 72992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 73092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 73192617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, FileTestHalfSpecifiedRange) { 73292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri const size_t buffer_size = 4000; 7333e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri scoped_ptr<char[]> buffer(new char[buffer_size]); 7343e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri FillBuffer(buffer.get(), buffer_size); 7353e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 73692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri base::FilePath temp_path; 73792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(file_util::CreateTemporaryFile(&temp_path)); 73892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri GURL temp_url = FilePathToFileURL(temp_path); 73992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(file_util::WriteFile(temp_path, buffer.get(), buffer_size)); 74027b0c9d51300712f3b5d4af6cc20d53fcf9c8c46Christoph Bumiller 74127b0c9d51300712f3b5d4af6cc20d53fcf9c8c46Christoph Bumiller int64 file_size; 74214193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller EXPECT_TRUE(file_util::GetFileSize(temp_path, &file_size)); 74392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 74492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri const size_t first_byte_position = 500; 74592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri const size_t last_byte_position = buffer_size - 1; 74692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri const size_t content_length = last_byte_position - first_byte_position + 1; 74792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri std::string partial_buffer_string(buffer.get() + first_byte_position, 7483e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri buffer.get() + last_byte_position + 1); 7493e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 75092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestDelegate d; 75192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 75292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest r(temp_url, &d, &default_context_); 75392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 75492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri HttpRequestHeaders headers; 75592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri headers.SetHeader(HttpRequestHeaders::kRange, 75692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri base::StringPrintf("bytes=%" PRIuS "-", 75792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri first_byte_position)); 7583e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri r.SetExtraRequestHeaders(headers); 7593e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri r.Start(); 76092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(r.is_pending()); 76192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 76292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri MessageLoop::current()->Run(); 76392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(!r.is_pending()); 76492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(1, d.response_started_count()); 76527b0c9d51300712f3b5d4af6cc20d53fcf9c8c46Christoph Bumiller EXPECT_FALSE(d.received_data_before_response()); 76614193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller EXPECT_EQ(static_cast<int>(content_length), d.bytes_received()); 76792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Don't use EXPECT_EQ, it will print out a lot of garbage if check failed. 76892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(partial_buffer_string == d.data_received()); 76992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 77092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 77192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(file_util::Delete(temp_path, false)); 7723e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri} 7733e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 7743e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca BarbieriTEST_F(URLRequestTest, FileTestMultipleRanges) { 7753e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri const size_t buffer_size = 400000; 7763e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri scoped_ptr<char[]> buffer(new char[buffer_size]); 77792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri FillBuffer(buffer.get(), buffer_size); 77892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 77992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri base::FilePath temp_path; 78092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(file_util::CreateTemporaryFile(&temp_path)); 78192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri GURL temp_url = FilePathToFileURL(temp_path); 78292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(file_util::WriteFile(temp_path, buffer.get(), buffer_size)); 78392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 78492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri int64 file_size; 7853e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri EXPECT_TRUE(file_util::GetFileSize(temp_path, &file_size)); 7863e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 7873e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri TestDelegate d; 78892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 78992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest r(temp_url, &d, &default_context_); 7903e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 7913e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri HttpRequestHeaders headers; 79227b0c9d51300712f3b5d4af6cc20d53fcf9c8c46Christoph Bumiller headers.SetHeader(HttpRequestHeaders::kRange, 79327b0c9d51300712f3b5d4af6cc20d53fcf9c8c46Christoph Bumiller "bytes=0-0,10-200,200-300"); 79414193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller r.SetExtraRequestHeaders(headers); 79592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri r.Start(); 79692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(r.is_pending()); 79792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 79892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri MessageLoop::current()->Run(); 79992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(d.request_failed()); 8003e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri } 8013e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 8023e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri EXPECT_TRUE(file_util::Delete(temp_path, false)); 8033e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri} 80492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 80592617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, InvalidUrlTest) { 80692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestDelegate d; 80792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 80892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest r(GURL("invalid url"), &d, &default_context_); 80992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 81092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri r.Start(); 81192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(r.is_pending()); 8123e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 8133e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri MessageLoop::current()->Run(); 81492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(d.request_failed()); 81592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 81692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 8173e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 8183e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri#if defined(OS_WIN) 81927b0c9d51300712f3b5d4af6cc20d53fcf9c8c46Christoph BumillerTEST_F(URLRequestTest, ResolveShortcutTest) { 82014193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller base::FilePath app_path; 82192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri PathService::Get(base::DIR_SOURCE_ROOT, &app_path); 82292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri app_path = app_path.AppendASCII("net"); 82392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri app_path = app_path.AppendASCII("data"); 82492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri app_path = app_path.AppendASCII("url_request_unittest"); 82592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri app_path = app_path.AppendASCII("with-headers.html"); 82692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 82792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri std::wstring lnk_path = app_path.value() + L".lnk"; 82892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 82992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri base::win::ScopedCOMInitializer com_initializer; 83092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 83192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Temporarily create a shortcut for test 83292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 83392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri base::win::ScopedComPtr<IShellLink> shell; 83414193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller ASSERT_TRUE(SUCCEEDED(shell.CreateInstance(CLSID_ShellLink, NULL, 83514193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller CLSCTX_INPROC_SERVER))); 83614193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller base::win::ScopedComPtr<IPersistFile> persist; 83714193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller ASSERT_TRUE(SUCCEEDED(shell.QueryInterface(persist.Receive()))); 83814193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller EXPECT_TRUE(SUCCEEDED(shell->SetPath(app_path.value().c_str()))); 83914193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller EXPECT_TRUE(SUCCEEDED(shell->SetDescription(L"ResolveShortcutTest"))); 84014193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller EXPECT_TRUE(SUCCEEDED(persist->Save(lnk_path.c_str(), TRUE))); 84114193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller } 84214193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller 84314193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller TestDelegate d; 84414193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller { 84514193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller URLRequest r(FilePathToFileURL(base::FilePath(lnk_path)), &d, 84614193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller &default_context_); 84714193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller 84814193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller r.Start(); 84992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(r.is_pending()); 85092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 85192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri MessageLoop::current()->Run(); 8523e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 8533e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri WIN32_FILE_ATTRIBUTE_DATA data; 85492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri GetFileAttributesEx(app_path.value().c_str(), 85592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri GetFileExInfoStandard, &data); 85692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri HANDLE file = CreateFile(app_path.value().c_str(), GENERIC_READ, 85792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri FILE_SHARE_READ, NULL, OPEN_EXISTING, 85892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri FILE_ATTRIBUTE_NORMAL, NULL); 85992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_NE(INVALID_HANDLE_VALUE, file); 86092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri scoped_ptr<char[]> buffer(new char[data.nFileSizeLow]); 86192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri DWORD read_size; 86292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri BOOL result; 86392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri result = ReadFile(file, buffer.get(), data.nFileSizeLow, 86492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri &read_size, NULL); 86592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri std::string content(buffer.get(), read_size); 8663e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri CloseHandle(file); 86792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 86892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(!r.is_pending()); 86992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(1, d.received_redirect_count()); 87092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(content, d.data_received()); 87192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 87292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 87392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Clean the shortcut 87492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri DeleteFile(lnk_path.c_str()); 87592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 87692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif // defined(OS_WIN) 87792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 87827b0c9d51300712f3b5d4af6cc20d53fcf9c8c46Christoph BumillerTEST_F(URLRequestTest, FileDirCancelTest) { 87927b0c9d51300712f3b5d4af6cc20d53fcf9c8c46Christoph Bumiller // Put in mock resource provider. 88014193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller NetModule::SetResourceProvider(TestNetResourceProvider); 88192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 88292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestDelegate d; 88392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 88492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri base::FilePath file_path; 88592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri PathService::Get(base::DIR_SOURCE_ROOT, &file_path); 8863e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri file_path = file_path.Append(FILE_PATH_LITERAL("net")); 8873e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri file_path = file_path.Append(FILE_PATH_LITERAL("data")); 88892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 88992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest req(FilePathToFileURL(file_path), &d, &default_context_); 89092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.Start(); 89192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(req.is_pending()); 89292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 89392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri d.set_cancel_in_received_data_pending(true); 89492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 89592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri MessageLoop::current()->Run(); 89692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 89792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 89892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Take out mock resource provider. 8993e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri NetModule::SetResourceProvider(NULL); 90092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 90192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 90292617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, FileDirRedirectNoCrash) { 90392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // There is an implicit redirect when loading a file path that matches a 90492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // directory and does not end with a slash. Ensure that following such 90592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // redirects does not crash. See http://crbug.com/18686. 90692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 90792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri base::FilePath path; 90892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri PathService::Get(base::DIR_SOURCE_ROOT, &path); 90992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri path = path.Append(FILE_PATH_LITERAL("net")); 91092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri path = path.Append(FILE_PATH_LITERAL("data")); 91127b0c9d51300712f3b5d4af6cc20d53fcf9c8c46Christoph Bumiller path = path.Append(FILE_PATH_LITERAL("url_request_unittest")); 91214193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller 91392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestDelegate d; 91492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest req(FilePathToFileURL(path), &d, &default_context_); 91592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.Start(); 91692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri MessageLoop::current()->Run(); 91792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 91892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ASSERT_EQ(1, d.received_redirect_count()); 9193e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri ASSERT_LT(0, d.bytes_received()); 9203e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri ASSERT_FALSE(d.request_failed()); 9213e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri ASSERT_TRUE(req.status().is_success()); 92292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 92392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 92492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if defined(OS_WIN) 92592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Don't accept the url "file:///" on windows. See http://crbug.com/1474. 92692617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, FileDirRedirectSingleSlash) { 92792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestDelegate d; 92892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest req(GURL("file:///"), &d, &default_context_); 92992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.Start(); 9303e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri MessageLoop::current()->Run(); 9313e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 93292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ASSERT_EQ(1, d.received_redirect_count()); 93392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ASSERT_FALSE(req.status().is_success()); 93492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 93592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif 93692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 93792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Custom URLRequestJobs for use with interceptor tests 93892617aeac109481258f0c3863d09c1b8903d438bLuca Barbiericlass RestartTestJob : public URLRequestTestJob { 93992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri public: 94092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri RestartTestJob(URLRequest* request, NetworkDelegate* network_delegate) 9413e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri : URLRequestTestJob(request, network_delegate, true) {} 94292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri protected: 94392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri virtual void StartAsync() OVERRIDE { 9443e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri this->NotifyRestartRequired(); 94592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 9463e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri private: 9473e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri virtual ~RestartTestJob() {} 94892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}; 94992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 95092617aeac109481258f0c3863d09c1b8903d438bLuca Barbiericlass CancelTestJob : public URLRequestTestJob { 95192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri public: 9523e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri explicit CancelTestJob(URLRequest* request, NetworkDelegate* network_delegate) 95392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri : URLRequestTestJob(request, network_delegate, true) {} 95492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri protected: 9553e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri virtual void StartAsync() OVERRIDE { 95692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri request_->Cancel(); 95792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 95892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri private: 95992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri virtual ~CancelTestJob() {} 96092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}; 96192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 96292617aeac109481258f0c3863d09c1b8903d438bLuca Barbiericlass CancelThenRestartTestJob : public URLRequestTestJob { 96392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri public: 96492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri explicit CancelThenRestartTestJob(URLRequest* request, 96592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri NetworkDelegate* network_delegate) 96692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri : URLRequestTestJob(request, network_delegate, true) { 96792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 96892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri protected: 96992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri virtual void StartAsync() OVERRIDE { 97092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri request_->Cancel(); 97192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri this->NotifyRestartRequired(); 97292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 97392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri private: 97492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri virtual ~CancelThenRestartTestJob() {} 97592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}; 97692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 9773e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri// An Interceptor for use with interceptor tests 9783e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbiericlass TestInterceptor : URLRequest::Interceptor { 97992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri public: 98092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestInterceptor() 9813e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri : intercept_main_request_(false), restart_main_request_(false), 98292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri cancel_main_request_(false), cancel_then_restart_main_request_(false), 9833e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri simulate_main_network_error_(false), 98492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri intercept_redirect_(false), cancel_redirect_request_(false), 9853e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri intercept_final_response_(false), cancel_final_request_(false), 98692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri did_intercept_main_(false), did_restart_main_(false), 98792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri did_cancel_main_(false), did_cancel_then_restart_main_(false), 9883e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri did_simulate_error_main_(false), 9893e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri did_intercept_redirect_(false), did_cancel_redirect_(false), 99092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri did_intercept_final_(false), did_cancel_final_(false) { 99192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest::Deprecated::RegisterRequestInterceptor(this); 99292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 99392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 99492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri virtual ~TestInterceptor() { 99592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest::Deprecated::UnregisterRequestInterceptor(this); 99692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 9973e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 99892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri virtual URLRequestJob* MaybeIntercept( 99992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest* request, 100092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri NetworkDelegate* network_delegate) OVERRIDE { 10013e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri if (restart_main_request_) { 10023e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri restart_main_request_ = false; 100392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri did_restart_main_ = true; 100492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return new RestartTestJob(request, network_delegate); 10053e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri } 100692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if (cancel_main_request_) { 100792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri cancel_main_request_ = false; 10083e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri did_cancel_main_ = true; 10093e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri return new CancelTestJob(request, network_delegate); 101092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 10113e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri if (cancel_then_restart_main_request_) { 101292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri cancel_then_restart_main_request_ = false; 101392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri did_cancel_then_restart_main_ = true; 10143e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri return new CancelThenRestartTestJob(request, network_delegate); 101592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 101692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if (simulate_main_network_error_) { 101792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri simulate_main_network_error_ = false; 101892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri did_simulate_error_main_ = true; 101992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // will error since the requeted url is not one of its canned urls 102092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return new URLRequestTestJob(request, network_delegate, true); 102192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 102292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if (!intercept_main_request_) 102392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return NULL; 102492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri intercept_main_request_ = false; 102592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri did_intercept_main_ = true; 102692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequestTestJob* job = new URLRequestTestJob(request, 102792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri network_delegate, 10283e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri main_headers_, 10293e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri main_data_, 103092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri true); 103192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri job->set_load_timing_info(main_request_load_timing_info_); 10323e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri return job; 103392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 10343e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 103592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri virtual URLRequestJob* MaybeInterceptRedirect( 10363e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri URLRequest* request, 103792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri NetworkDelegate* network_delegate, 103892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri const GURL& location) OVERRIDE { 10393e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri if (cancel_redirect_request_) { 10403e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri cancel_redirect_request_ = false; 104192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri did_cancel_redirect_ = true; 104292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return new CancelTestJob(request, network_delegate); 104392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 104492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if (!intercept_redirect_) 104592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return NULL; 104692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri intercept_redirect_ = false; 104792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri did_intercept_redirect_ = true; 104892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return new URLRequestTestJob(request, 10493e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri network_delegate, 105092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri redirect_headers_, 105192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri redirect_data_, 105292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri true); 10533e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri } 10543e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 105592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri virtual URLRequestJob* MaybeInterceptResponse( 105692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest* request, NetworkDelegate* network_delegate) OVERRIDE { 10573e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri if (cancel_final_request_) { 105892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri cancel_final_request_ = false; 105992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri did_cancel_final_ = true; 10603e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri return new CancelTestJob(request, network_delegate); 10613e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri } 106292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if (!intercept_final_response_) 10633e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri return NULL; 106492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri intercept_final_response_ = false; 106592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri did_intercept_final_ = true; 10663e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri return new URLRequestTestJob(request, 106792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri network_delegate, 106892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri final_headers_, 106992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri final_data_, 10703e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri true); 10713e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri } 10723e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 107392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Whether to intercept the main request, and if so the response to return and 107492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // the LoadTimingInfo to use. 107592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri bool intercept_main_request_; 107692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri std::string main_headers_; 10773e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri std::string main_data_; 107892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri LoadTimingInfo main_request_load_timing_info_; 10793e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 10803e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri // Other actions we take at MaybeIntercept time 108192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri bool restart_main_request_; 108292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri bool cancel_main_request_; 108392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri bool cancel_then_restart_main_request_; 10843e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri bool simulate_main_network_error_; 10853e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 108692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Whether to intercept redirects, and if so the response to return. 10873e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri bool intercept_redirect_; 108892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri std::string redirect_headers_; 10893e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri std::string redirect_data_; 10903e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 109192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Other actions we can take at MaybeInterceptRedirect time 109292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri bool cancel_redirect_request_; 10933e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 109492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Whether to intercept final response, and if so the response to return. 10953e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri bool intercept_final_response_; 10963e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri std::string final_headers_; 109792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri std::string final_data_; 109892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 109992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Other actions we can take at MaybeInterceptResponse time 110092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri bool cancel_final_request_; 11013e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 11023e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri // If we did something or not 11033e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri bool did_intercept_main_; 110492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri bool did_restart_main_; 110592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri bool did_cancel_main_; 11063e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri bool did_cancel_then_restart_main_; 11073e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri bool did_simulate_error_main_; 11083e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri bool did_intercept_redirect_; 11093e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri bool did_cancel_redirect_; 11103e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri bool did_intercept_final_; 11113e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri bool did_cancel_final_; 111292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 111392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Static getters for canned response header and data strings 111492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 111592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri static std::string ok_data() { 111692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return URLRequestTestJob::test_data_1(); 111792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 111892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 111992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri static std::string ok_headers() { 112092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return URLRequestTestJob::test_headers(); 112192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 112292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 11233e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri static std::string redirect_data() { 11243e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri return std::string(); 112592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 112692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 11273e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri static std::string redirect_headers() { 112892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return URLRequestTestJob::test_redirect_headers(); 11293e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri } 11303e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 113192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri static std::string error_data() { 113292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return std::string("ohhh nooooo mr. bill!"); 11333e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri } 113492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 11353e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri static std::string error_headers() { 113692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return URLRequestTestJob::test_error_headers(); 113792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 113892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}; 113992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 114092617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, Intercept) { 11413e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri TestInterceptor interceptor; 11423e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 114392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // intercept the main request and respond with a simple response 114492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri interceptor.intercept_main_request_ = true; 11453e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri interceptor.main_headers_ = TestInterceptor::ok_headers(); 11463e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri interceptor.main_data_ = TestInterceptor::ok_data(); 11473e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 11483e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri TestDelegate d; 114992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_); 115092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri base::SupportsUserData::Data* user_data0 = new base::SupportsUserData::Data(); 115192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri base::SupportsUserData::Data* user_data1 = new base::SupportsUserData::Data(); 115292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri base::SupportsUserData::Data* user_data2 = new base::SupportsUserData::Data(); 115392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.SetUserData(NULL, user_data0); 115492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.SetUserData(&user_data1, user_data1); 115592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.SetUserData(&user_data2, user_data2); 115692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.set_method("GET"); 115792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.Start(); 115892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri MessageLoop::current()->Run(); 115992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 116092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Make sure we can retrieve our specific user data 116192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(user_data0, req.GetUserData(NULL)); 116292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(user_data1, req.GetUserData(&user_data1)); 116392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(user_data2, req.GetUserData(&user_data2)); 116492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 116592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Check the interceptor got called as expected 116692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(interceptor.did_intercept_main_); 116792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 116892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Check we got one good response 116992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(req.status().is_success()); 117092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(200, req.response_headers()->response_code()); 117192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(TestInterceptor::ok_data(), d.data_received()); 117292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(1, d.response_started_count()); 117392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, d.received_redirect_count()); 117492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 117592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 117692617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, InterceptRedirect) { 117792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestInterceptor interceptor; 117892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 117992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // intercept the main request and respond with a redirect 118092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri interceptor.intercept_main_request_ = true; 118192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri interceptor.main_headers_ = TestInterceptor::redirect_headers(); 118292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri interceptor.main_data_ = TestInterceptor::redirect_data(); 118392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 118492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // intercept that redirect and respond a final OK response 118592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri interceptor.intercept_redirect_ = true; 118692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri interceptor.redirect_headers_ = TestInterceptor::ok_headers(); 11873e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri interceptor.redirect_data_ = TestInterceptor::ok_data(); 11883e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 11893e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri TestDelegate d; 119092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_); 119192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.set_method("GET"); 1192d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller req.Start(); 1193d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller MessageLoop::current()->Run(); 1194d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller 1195d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller // Check the interceptor got called as expected 1196d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller EXPECT_TRUE(interceptor.did_intercept_main_); 1197d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller EXPECT_TRUE(interceptor.did_intercept_redirect_); 1198d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller 1199d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller // Check we got one good response 1200d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller EXPECT_TRUE(req.status().is_success()); 12013e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri if (req.status().is_success()) { 12023e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri EXPECT_EQ(200, req.response_headers()->response_code()); 1203d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller } 1204d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller EXPECT_EQ(TestInterceptor::ok_data(), d.data_received()); 120592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(1, d.response_started_count()); 1206d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller EXPECT_EQ(0, d.received_redirect_count()); 120792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 120892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 1209d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph BumillerTEST_F(URLRequestTest, InterceptServerError) { 1210d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller TestInterceptor interceptor; 1211d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller 1212d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller // intercept the main request to generate a server error response 1213d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller interceptor.intercept_main_request_ = true; 1214d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller interceptor.main_headers_ = TestInterceptor::error_headers(); 1215d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller interceptor.main_data_ = TestInterceptor::error_data(); 1216d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller 1217d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller // intercept that error and respond with an OK response 1218d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller interceptor.intercept_final_response_ = true; 1219d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller interceptor.final_headers_ = TestInterceptor::ok_headers(); 122092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri interceptor.final_data_ = TestInterceptor::ok_data(); 1221d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller 1222d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller TestDelegate d; 1223d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_); 122492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.set_method("GET"); 122592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.Start(); 122692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri MessageLoop::current()->Run(); 12273e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 12283e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri // Check the interceptor got called as expected 12293e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri EXPECT_TRUE(interceptor.did_intercept_main_); 123092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(interceptor.did_intercept_final_); 123192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 12323e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri // Check we got one good response 123392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(req.status().is_success()); 123492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(200, req.response_headers()->response_code()); 12353e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri EXPECT_EQ(TestInterceptor::ok_data(), d.data_received()); 12363e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri EXPECT_EQ(1, d.response_started_count()); 123792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, d.received_redirect_count()); 12383e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri} 12393e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 124092617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, InterceptNetworkError) { 124192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestInterceptor interceptor; 12423e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 12433e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri // intercept the main request to simulate a network error 124492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri interceptor.simulate_main_network_error_ = true; 124592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 124692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // intercept that error and respond with an OK response 124792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri interceptor.intercept_final_response_ = true; 124892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri interceptor.final_headers_ = TestInterceptor::ok_headers(); 12493e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri interceptor.final_data_ = TestInterceptor::ok_data(); 12503e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 12513e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri TestDelegate d; 12523e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_); 12533e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri req.set_method("GET"); 12543e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri req.Start(); 12553e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri MessageLoop::current()->Run(); 125692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 125792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Check the interceptor got called as expected 12583e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri EXPECT_TRUE(interceptor.did_simulate_error_main_); 12593e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri EXPECT_TRUE(interceptor.did_intercept_final_); 126092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 12613e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri // Check we received one good response 126292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(req.status().is_success()); 12633e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri EXPECT_EQ(200, req.response_headers()->response_code()); 126492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(TestInterceptor::ok_data(), d.data_received()); 12653e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri EXPECT_EQ(1, d.response_started_count()); 12663e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri EXPECT_EQ(0, d.received_redirect_count()); 126792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 126892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 126992617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, InterceptRestartRequired) { 127092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestInterceptor interceptor; 127192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 12723e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri // restart the main request 12733e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri interceptor.restart_main_request_ = true; 12743e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 12753e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri // then intercept the new main request and respond with an OK response 12763e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri interceptor.intercept_main_request_ = true; 12773e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri interceptor.main_headers_ = TestInterceptor::ok_headers(); 127892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri interceptor.main_data_ = TestInterceptor::ok_data(); 127992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 12803e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri TestDelegate d; 12813e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_); 128292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.set_method("GET"); 12833e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri req.Start(); 128492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri MessageLoop::current()->Run(); 12853e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 12863e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri // Check the interceptor got called as expected 128792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(interceptor.did_restart_main_); 128892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(interceptor.did_intercept_main_); 128992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 129092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Check we received one good response 129192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(req.status().is_success()); 12923e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri if (req.status().is_success()) { 12933e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri EXPECT_EQ(200, req.response_headers()->response_code()); 12943e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri } 129592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(TestInterceptor::ok_data(), d.data_received()); 129692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(1, d.response_started_count()); 129714193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller EXPECT_EQ(0, d.received_redirect_count()); 129814193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller} 129914193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller 130014193da589275969be31dbdb3280bb48cd24d0c0Christoph BumillerTEST_F(URLRequestTest, InterceptRespectsCancelMain) { 130114193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller TestInterceptor interceptor; 130214193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller 13033e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri // intercept the main request and cancel from within the restarted job 13043e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri interceptor.cancel_main_request_ = true; 130514193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller 130692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // setup to intercept final response and override it with an OK response 130714193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller interceptor.intercept_final_response_ = true; 130814193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller interceptor.final_headers_ = TestInterceptor::ok_headers(); 130914193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller interceptor.final_data_ = TestInterceptor::ok_data(); 131092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 131192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestDelegate d; 131214193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_); 131314193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller req.set_method("GET"); 131492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.Start(); 131514193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller MessageLoop::current()->Run(); 131614193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller 131714193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller // Check the interceptor got called as expected 131814193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller EXPECT_TRUE(interceptor.did_cancel_main_); 131914193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller EXPECT_FALSE(interceptor.did_intercept_final_); 132014193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller 132114193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller // Check we see a canceled request 132214193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller EXPECT_FALSE(req.status().is_success()); 132314193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status()); 132414193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller} 132514193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller 132614193da589275969be31dbdb3280bb48cd24d0c0Christoph BumillerTEST_F(URLRequestTest, InterceptRespectsCancelRedirect) { 132792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestInterceptor interceptor; 132814193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller 132914193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller // intercept the main request and respond with a redirect 133014193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller interceptor.intercept_main_request_ = true; 133114193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller interceptor.main_headers_ = TestInterceptor::redirect_headers(); 133292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri interceptor.main_data_ = TestInterceptor::redirect_data(); 133392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 133492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // intercept the redirect and cancel from within that job 133514193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller interceptor.cancel_redirect_request_ = true; 133614193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller 133714193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller // setup to intercept final response and override it with an OK response 133814193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller interceptor.intercept_final_response_ = true; 133914193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller interceptor.final_headers_ = TestInterceptor::ok_headers(); 134014193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller interceptor.final_data_ = TestInterceptor::ok_data(); 134192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 134214193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller TestDelegate d; 134314193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_); 134492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.set_method("GET"); 134592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.Start(); 134692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri MessageLoop::current()->Run(); 13473e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 13483e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri // Check the interceptor got called as expected 134992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(interceptor.did_intercept_main_); 13503e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri EXPECT_TRUE(interceptor.did_cancel_redirect_); 135192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_FALSE(interceptor.did_intercept_final_); 135292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 135392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Check we see a canceled request 135492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_FALSE(req.status().is_success()); 13553e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status()); 135692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 135714193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller 135892617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, InterceptRespectsCancelFinal) { 135914193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller TestInterceptor interceptor; 136092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 136192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // intercept the main request to simulate a network error 136292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri interceptor.simulate_main_network_error_ = true; 136392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 136492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // setup to intercept final response and cancel from within that job 13653e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri interceptor.cancel_final_request_ = true; 136692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 136792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestDelegate d; 136892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_); 13693e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri req.set_method("GET"); 137092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.Start(); 137192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri MessageLoop::current()->Run(); 137292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 13733e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri // Check the interceptor got called as expected 137492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(interceptor.did_simulate_error_main_); 137592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(interceptor.did_cancel_final_); 137692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 13773e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri // Check we see a canceled request 137892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_FALSE(req.status().is_success()); 137992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status()); 138092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 13813e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 13823e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca BarbieriTEST_F(URLRequestTest, InterceptRespectsCancelInRestart) { 13833e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri TestInterceptor interceptor; 13843e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 138592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // intercept the main request and cancel then restart from within that job 138692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri interceptor.cancel_then_restart_main_request_ = true; 138792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 138892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // setup to intercept final response and override it with an OK response 138992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri interceptor.intercept_final_response_ = true; 13903e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri interceptor.final_headers_ = TestInterceptor::ok_headers(); 13913e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri interceptor.final_data_ = TestInterceptor::ok_data(); 139214193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller 13933e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri TestDelegate d; 13943e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_); 139514193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller req.set_method("GET"); 13963e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri req.Start(); 139714193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller MessageLoop::current()->Run(); 139892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 139992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Check the interceptor got called as expected 140092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(interceptor.did_cancel_then_restart_main_); 140192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_FALSE(interceptor.did_intercept_final_); 140292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 140392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Check we see a canceled request 140492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_FALSE(req.status().is_success()); 140592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status()); 140692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 140792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 140892617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriLoadTimingInfo RunLoadTimingTest(const LoadTimingInfo& job_load_timing, 140992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequestContext* context) { 141092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestInterceptor interceptor; 141192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri interceptor.intercept_main_request_ = true; 141292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri interceptor.main_request_load_timing_info_ = job_load_timing; 141392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestDelegate d; 141492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest req(GURL("http://test_intercept/foo"), &d, context); 141592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.Start(); 141692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri MessageLoop::current()->Run(); 141792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 141892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri LoadTimingInfo resulting_load_timing; 141992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.GetLoadTimingInfo(&resulting_load_timing); 142092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 142192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // None of these should be modified by the URLRequest. 142292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(job_load_timing.socket_reused, resulting_load_timing.socket_reused); 142392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(job_load_timing.socket_log_id, resulting_load_timing.socket_log_id); 142492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(job_load_timing.send_start, resulting_load_timing.send_start); 14253e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri EXPECT_EQ(job_load_timing.send_end, resulting_load_timing.send_end); 14263e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri EXPECT_EQ(job_load_timing.receive_headers_end, 142792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri resulting_load_timing.receive_headers_end); 142892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 14293e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri return resulting_load_timing; 143092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 14313e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 14323e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri// "Normal" LoadTimingInfo as returned by a job. Everything is in order, not 143392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// reused. |connect_time_flags| is used to indicate if there should be dns 143492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// or SSL times, and |used_proxy| is used for proxy times. 143592617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriLoadTimingInfo NormalLoadTimingInfo(base::TimeTicks now, 143692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri int connect_time_flags, 143792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri bool used_proxy) { 14383e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri LoadTimingInfo load_timing; 14393e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri load_timing.socket_log_id = 1; 144092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 144192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if (used_proxy) { 14423e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri load_timing.proxy_resolve_start = now + base::TimeDelta::FromDays(1); 14433e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri load_timing.proxy_resolve_end = now + base::TimeDelta::FromDays(2); 14443e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri } 14453e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 144692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri LoadTimingInfo::ConnectTiming& connect_timing = load_timing.connect_timing; 144792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if (connect_time_flags & CONNECT_TIMING_HAS_DNS_TIMES) { 14484c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger connect_timing.dns_start = now + base::TimeDelta::FromDays(3); 144992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri connect_timing.dns_end = now + base::TimeDelta::FromDays(4); 145092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 145192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri connect_timing.connect_start = now + base::TimeDelta::FromDays(5); 14524c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger if (connect_time_flags & CONNECT_TIMING_HAS_SSL_TIMES) { 145392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri connect_timing.ssl_start = now + base::TimeDelta::FromDays(6); 145492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri connect_timing.ssl_end = now + base::TimeDelta::FromDays(7); 145592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 145692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri connect_timing.connect_end = now + base::TimeDelta::FromDays(8); 14574c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger 145892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri load_timing.send_start = now + base::TimeDelta::FromDays(9); 145992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri load_timing.send_end = now + base::TimeDelta::FromDays(10); 146092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri load_timing.receive_headers_end = now + base::TimeDelta::FromDays(11); 14616ab6c43079083c811761241b901d07f9ad2c9affChristoph Bumiller return load_timing; 14624c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger} 14634c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger 14644c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger// Same as above, but in the case of a reused socket. 14654c7001462607e6e99e474d6271dd481d3f8f201cRoland ScheideggerLoadTimingInfo NormalLoadTimingInfoReused(base::TimeTicks now, 14664c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger bool used_proxy) { 14674c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger LoadTimingInfo load_timing; 14684c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger load_timing.socket_log_id = 1; 14694c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger load_timing.socket_reused = true; 14704c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger 14714c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger if (used_proxy) { 14724c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger load_timing.proxy_resolve_start = now + base::TimeDelta::FromDays(1); 14734c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger load_timing.proxy_resolve_end = now + base::TimeDelta::FromDays(2); 14744c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger } 1475a359eb80c5e141f625cfe42b4d97bf78cf25d128Luca Barbieri 1476a359eb80c5e141f625cfe42b4d97bf78cf25d128Luca Barbieri load_timing.send_start = now + base::TimeDelta::FromDays(9); 1477a359eb80c5e141f625cfe42b4d97bf78cf25d128Luca Barbieri load_timing.send_end = now + base::TimeDelta::FromDays(10); 1478a359eb80c5e141f625cfe42b4d97bf78cf25d128Luca Barbieri load_timing.receive_headers_end = now + base::TimeDelta::FromDays(11); 147992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return load_timing; 14803e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri} 14813e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 14823e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri// Basic test that the intercept + load timing tests work. 14833e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca BarbieriTEST_F(URLRequestTest, InterceptLoadTiming) { 14843e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri base::TimeTicks now = base::TimeTicks::Now(); 148592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri LoadTimingInfo job_load_timing = 148692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_DNS_TIMES, false); 14873e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 14883e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing, 148992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri &default_context_); 14904c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger 14916ab6c43079083c811761241b901d07f9ad2c9affChristoph Bumiller // Nothing should have been changed by the URLRequest. 14924c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger EXPECT_EQ(job_load_timing.proxy_resolve_start, 14936ab6c43079083c811761241b901d07f9ad2c9affChristoph Bumiller load_timing_result.proxy_resolve_start); 149492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(job_load_timing.proxy_resolve_end, 14953e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri load_timing_result.proxy_resolve_end); 149692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(job_load_timing.connect_timing.dns_start, 14973e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri load_timing_result.connect_timing.dns_start); 149892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(job_load_timing.connect_timing.dns_end, 14993e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri load_timing_result.connect_timing.dns_end); 150092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(job_load_timing.connect_timing.connect_start, 15013e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri load_timing_result.connect_timing.connect_start); 150292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(job_load_timing.connect_timing.connect_end, 15033e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri load_timing_result.connect_timing.connect_end); 15045db9cedeafe98c5ac094fc32f7b4d275c273b867Marek Olšák EXPECT_EQ(job_load_timing.connect_timing.ssl_start, 150592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri load_timing_result.connect_timing.ssl_start); 150692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(job_load_timing.connect_timing.ssl_end, 15073e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri load_timing_result.connect_timing.ssl_end); 150892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 15094c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger // Redundant sanity check. 151092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestLoadTimingNotReused(load_timing_result, CONNECT_TIMING_HAS_DNS_TIMES); 15113e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri} 151292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 151392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Another basic test, with proxy and SSL times, but no DNS times. 151492617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, InterceptLoadTimingProxy) { 151592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri base::TimeTicks now = base::TimeTicks::Now(); 15163e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri LoadTimingInfo job_load_timing = 1517a359eb80c5e141f625cfe42b4d97bf78cf25d128Luca Barbieri NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_SSL_TIMES, true); 15183e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 15194c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing, 152092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri &default_context_); 152192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 152292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Nothing should have been changed by the URLRequest. 152392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(job_load_timing.proxy_resolve_start, 15243e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri load_timing_result.proxy_resolve_start); 15253e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri EXPECT_EQ(job_load_timing.proxy_resolve_end, 152692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri load_timing_result.proxy_resolve_end); 152792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(job_load_timing.connect_timing.dns_start, 15283e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri load_timing_result.connect_timing.dns_start); 15293e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri EXPECT_EQ(job_load_timing.connect_timing.dns_end, 153092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri load_timing_result.connect_timing.dns_end); 153192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(job_load_timing.connect_timing.connect_start, 153292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri load_timing_result.connect_timing.connect_start); 15336c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri EXPECT_EQ(job_load_timing.connect_timing.connect_end, 153492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri load_timing_result.connect_timing.connect_end); 153592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(job_load_timing.connect_timing.ssl_start, 153692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri load_timing_result.connect_timing.ssl_start); 153792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(job_load_timing.connect_timing.ssl_end, 153892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri load_timing_result.connect_timing.ssl_end); 15393e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 15403e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri // Redundant sanity check. 15413e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri TestLoadTimingNotReusedWithProxy(load_timing_result, 15423e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri CONNECT_TIMING_HAS_SSL_TIMES); 15433e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri} 15443e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 15453e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri// Make sure that URLRequest correctly adjusts proxy times when they're before 15463e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri// |request_start|, due to already having a connected socket. This happens in 154792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// the case of reusing a SPDY session or HTTP pipeline. The connected socket is 154892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// not considered reused in this test (May be a preconnect). 15493e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri// 15503e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri// To mix things up from the test above, assumes DNS times but no SSL times. 15514c7001462607e6e99e474d6271dd481d3f8f201cRoland ScheideggerTEST_F(URLRequestTest, InterceptLoadTimingEarlyProxyResolution) { 15526ab6c43079083c811761241b901d07f9ad2c9affChristoph Bumiller base::TimeTicks now = base::TimeTicks::Now(); 15534c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger LoadTimingInfo job_load_timing = 15546ab6c43079083c811761241b901d07f9ad2c9affChristoph Bumiller NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_DNS_TIMES, true); 15554c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger job_load_timing.proxy_resolve_start = now - base::TimeDelta::FromDays(6); 15566ab6c43079083c811761241b901d07f9ad2c9affChristoph Bumiller job_load_timing.proxy_resolve_end = now - base::TimeDelta::FromDays(5); 15576ab6c43079083c811761241b901d07f9ad2c9affChristoph Bumiller job_load_timing.connect_timing.dns_start = now - base::TimeDelta::FromDays(4); 155892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri job_load_timing.connect_timing.dns_end = now - base::TimeDelta::FromDays(3); 155992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri job_load_timing.connect_timing.connect_start = 15604c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger now - base::TimeDelta::FromDays(2); 15614c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger job_load_timing.connect_timing.connect_end = 156292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri now - base::TimeDelta::FromDays(1); 156392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 156492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing, 156592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri &default_context_); 15663e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 15673e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri // Proxy times, connect times, and DNS times should all be replaced with 156892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // request_start. 156992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(load_timing_result.request_start, 15703e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri load_timing_result.proxy_resolve_start); 15713e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri EXPECT_EQ(load_timing_result.request_start, 15724c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger load_timing_result.proxy_resolve_end); 15734c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger EXPECT_EQ(load_timing_result.request_start, 157492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri load_timing_result.connect_timing.dns_start); 15754c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger EXPECT_EQ(load_timing_result.request_start, 15764c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger load_timing_result.connect_timing.dns_end); 15774c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger EXPECT_EQ(load_timing_result.request_start, 15784c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger load_timing_result.connect_timing.connect_start); 15796ab6c43079083c811761241b901d07f9ad2c9affChristoph Bumiller EXPECT_EQ(load_timing_result.request_start, 15806ab6c43079083c811761241b901d07f9ad2c9affChristoph Bumiller load_timing_result.connect_timing.connect_end); 15816ab6c43079083c811761241b901d07f9ad2c9affChristoph Bumiller 15826ab6c43079083c811761241b901d07f9ad2c9affChristoph Bumiller // Other times should have been left null. 15834c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger TestLoadTimingNotReusedWithProxy(load_timing_result, 15844c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger CONNECT_TIMING_HAS_DNS_TIMES); 15854c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger} 158692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 158792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Same as above, but in the reused case. 158892617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, InterceptLoadTimingEarlyProxyResolutionReused) { 158992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri base::TimeTicks now = base::TimeTicks::Now(); 15903e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri LoadTimingInfo job_load_timing = NormalLoadTimingInfoReused(now, true); 15913e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri job_load_timing.proxy_resolve_start = now - base::TimeDelta::FromDays(4); 15928224256946619fb25278718bbf4703e3b9d60c93Luca Barbieri job_load_timing.proxy_resolve_end = now - base::TimeDelta::FromDays(3); 15938224256946619fb25278718bbf4703e3b9d60c93Luca Barbieri 15943e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing, 15953e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri &default_context_); 159692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 159792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Proxy times and connect times should all be replaced with request_start. 15983e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri EXPECT_EQ(load_timing_result.request_start, 15994c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger load_timing_result.proxy_resolve_start); 16006ab6c43079083c811761241b901d07f9ad2c9affChristoph Bumiller EXPECT_EQ(load_timing_result.request_start, 16014c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger load_timing_result.proxy_resolve_end); 16026ab6c43079083c811761241b901d07f9ad2c9affChristoph Bumiller 16034c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger // Other times should have been left null. 160492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestLoadTimingReusedWithProxy(load_timing_result); 160592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 160692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 160792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Make sure that URLRequest correctly adjusts connect times when they're before 16083e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri// |request_start|, due to reusing a connected socket. The connected socket is 16093e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri// not considered reused in this test (May be a preconnect). 16103e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri// 161192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// To mix things up, the request has SSL times, but no DNS times. 161292617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, InterceptLoadTimingEarlyConnect) { 161392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri base::TimeTicks now = base::TimeTicks::Now(); 161492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri LoadTimingInfo job_load_timing = 161592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_SSL_TIMES, false); 161692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri job_load_timing.connect_timing.connect_start = 16173e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri now - base::TimeDelta::FromDays(1); 16183e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri job_load_timing.connect_timing.ssl_start = now - base::TimeDelta::FromDays(2); 161992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri job_load_timing.connect_timing.ssl_end = now - base::TimeDelta::FromDays(3); 162092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri job_load_timing.connect_timing.connect_end = 16213e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri now - base::TimeDelta::FromDays(4); 16226dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie 16236dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing, 16246dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie &default_context_); 16256dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie 16266dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie // Connect times, and SSL times should be replaced with request_start. 16276dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie EXPECT_EQ(load_timing_result.request_start, 162892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri load_timing_result.connect_timing.connect_start); 162992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(load_timing_result.request_start, 163092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri load_timing_result.connect_timing.ssl_start); 16313e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri EXPECT_EQ(load_timing_result.request_start, 16323e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri load_timing_result.connect_timing.ssl_end); 16333e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri EXPECT_EQ(load_timing_result.request_start, 16343e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri load_timing_result.connect_timing.connect_end); 163592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 163692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Other times should have been left null. 16373e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri TestLoadTimingNotReused(load_timing_result, CONNECT_TIMING_HAS_SSL_TIMES); 163892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 16393e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 164092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Make sure that URLRequest correctly adjusts connect times when they're before 16413e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri// |request_start|, due to reusing a connected socket in the case that there 164292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// are also proxy times. The connected socket is not considered reused in this 16433e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri// test (May be a preconnect). 164492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// 164592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// In this test, there are no SSL or DNS times. 164692617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, InterceptLoadTimingEarlyConnectWithProxy) { 164792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri base::TimeTicks now = base::TimeTicks::Now(); 16483e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri LoadTimingInfo job_load_timing = 16493e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY, true); 165092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri job_load_timing.connect_timing.connect_start = 165192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri now - base::TimeDelta::FromDays(1); 165292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri job_load_timing.connect_timing.connect_end = 165392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri now - base::TimeDelta::FromDays(2); 165492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 16553e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing, 16563e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri &default_context_); 165792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 165892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Connect times should be replaced with proxy_resolve_end. 165992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(load_timing_result.proxy_resolve_end, 166092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri load_timing_result.connect_timing.connect_start); 166192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(load_timing_result.proxy_resolve_end, 166217ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri load_timing_result.connect_timing.connect_end); 166392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 166492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Other times should have been left null. 166592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestLoadTimingNotReusedWithProxy(load_timing_result, 166692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY); 166792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 166892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 166992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Check that two different URL requests have different identifiers. 167092617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, Identifiers) { 167192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestDelegate d; 167214193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller TestURLRequestContext context; 167314193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller TestURLRequest req(GURL("http://example.com"), &d, &context, NULL); 167492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestURLRequest other_req(GURL("http://example.com"), &d, &context, NULL); 167592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 167692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ASSERT_NE(req.identifier(), other_req.identifier()); 167792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 167892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 167992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Check that a failure to connect to the proxy is reported to the network 168092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// delegate. 168117ad9972f4b998dbf1a046780b6bde461d721dd0Luca BarbieriTEST_F(URLRequestTest, NetworkDelegateProxyError) { 168217ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri MockHostResolver host_resolver; 168317ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri host_resolver.rules()->AddSimulatedFailure("*"); 168417ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri 168517ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri TestNetworkDelegate network_delegate; // Must outlive URLRequests. 168617ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri TestURLRequestContextWithProxy context("myproxy:70", &network_delegate); 168792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 16883e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri TestDelegate d; 168992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest req(GURL("http://example.com"), &d, &context); 169092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.set_method("GET"); 169192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 16923e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri req.Start(); 169392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri MessageLoop::current()->Run(); 169492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 169514193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller // Check we see a failed request. 169614193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller EXPECT_FALSE(req.status().is_success()); 169792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(URLRequestStatus::FAILED, req.status().status()); 169892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, req.status().error()); 1699c463dfe4e4999a0d745c31bce9a2a2bbe6a05899Christoph Bumiller 1700c463dfe4e4999a0d745c31bce9a2a2bbe6a05899Christoph Bumiller EXPECT_EQ(1, network_delegate.error_count()); 170117ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, network_delegate.last_error()); 170292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(1, network_delegate.completed_requests()); 170392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 170492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 170592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Make sure that net::NetworkDelegate::NotifyCompleted is called if 170692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// content is empty. 170717ad9972f4b998dbf1a046780b6bde461d721dd0Luca BarbieriTEST_F(URLRequestTest, RequestCompletionForEmptyResponse) { 170892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestDelegate d; 170992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest req(GURL("data:,"), &d, &default_context_); 171092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.Start(); 171192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri MessageLoop::current()->Run(); 171292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ("", d.data_received()); 171392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(1, default_network_delegate_.completed_requests()); 171492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 171592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 171692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Make sure that SetPriority actually sets the URLRequest's priority 171792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// correctly, both before and after start. 1718507337864fa80caf9f26602324d2c28dd0a75d61Marek OlšákTEST_F(URLRequestTest, SetPriorityBasic) { 171992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestDelegate d; 172092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_); 172192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(DEFAULT_PRIORITY, req.priority()); 172292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 172392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.SetPriority(LOW); 172492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(LOW, req.priority()); 172592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 172692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.Start(); 172792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(LOW, req.priority()); 172892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 172992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.SetPriority(MEDIUM); 17303e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri EXPECT_EQ(MEDIUM, req.priority()); 17313e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri} 173292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 173392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Make sure that URLRequest calls SetPriority on a job before calling 17343e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri// Start on it. 17353e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca BarbieriTEST_F(URLRequestTest, SetJobPriorityBeforeJobStart) { 173692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestDelegate d; 173792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_); 17383e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri EXPECT_EQ(DEFAULT_PRIORITY, req.priority()); 173992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 174092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri scoped_refptr<URLRequestTestJob> job = 174192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri new URLRequestTestJob(&req, &default_network_delegate_); 174292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri AddTestInterceptor()->set_main_intercept_job(job); 17433e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri EXPECT_EQ(DEFAULT_PRIORITY, job->priority()); 174492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 174592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.SetPriority(LOW); 17463e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 174792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.Start(); 174892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(LOW, job->priority()); 174992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 175092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 175192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Make sure that URLRequest passes on its priority updates to its 17523e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri// job. 17533e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca BarbieriTEST_F(URLRequestTest, SetJobPriority) { 17543e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri TestDelegate d; 17553e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_); 17563e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 175792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri scoped_refptr<URLRequestTestJob> job = 175892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri new URLRequestTestJob(&req, &default_network_delegate_); 17593e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri AddTestInterceptor()->set_main_intercept_job(job); 17603e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 17614dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller req.SetPriority(LOW); 17624dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller req.Start(); 17634dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller EXPECT_EQ(LOW, job->priority()); 17644dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller 17654dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller req.SetPriority(MEDIUM); 17666ab6c43079083c811761241b901d07f9ad2c9affChristoph Bumiller EXPECT_EQ(MEDIUM, req.priority()); 17676ab6c43079083c811761241b901d07f9ad2c9affChristoph Bumiller EXPECT_EQ(MEDIUM, job->priority()); 17684dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller} 17694dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller 17704dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller// TODO(droger): Support SpawnedTestServer on iOS (see http://crbug.com/148666). 17714dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller#if !defined(OS_IOS) 17724dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller// A subclass of SpawnedTestServer that uses a statically-configured hostname. 17734dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller// This is to work around mysterious failures in chrome_frame_net_tests. See: 17744dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller// http://crbug.com/114369 17754dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumillerclass LocalHttpTestServer : public SpawnedTestServer { 17764dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller public: 17774dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller explicit LocalHttpTestServer(const base::FilePath& document_root) 17784dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller : SpawnedTestServer(SpawnedTestServer::TYPE_HTTP, 17794dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller ScopedCustomUrlRequestTestHttpHost::value(), 17804dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller document_root) {} 178192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri LocalHttpTestServer() 178292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri : SpawnedTestServer(SpawnedTestServer::TYPE_HTTP, 178392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ScopedCustomUrlRequestTestHttpHost::value(), 178492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri base::FilePath()) {} 17853e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri}; 17863e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 178792617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, DelayedCookieCallback) { 178892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri LocalHttpTestServer test_server; 178992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ASSERT_TRUE(test_server.Start()); 179092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 179192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestURLRequestContext context; 17923e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri scoped_refptr<DelayedCookieMonster> delayed_cm = 17933e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri new DelayedCookieMonster(); 179492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri scoped_refptr<CookieStore> cookie_store = delayed_cm; 179592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri context.set_cookie_store(delayed_cm); 179692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 179792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Set up a cookie. 179892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 179992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestNetworkDelegate network_delegate; 180092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri context.set_network_delegate(&network_delegate); 180192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestDelegate d; 180217ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri URLRequest req( 180317ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri test_server.GetURL("set-cookie?CookieToNotSend=1"), &d, &context); 180417ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri req.Start(); 180517ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri MessageLoop::current()->Run(); 180617ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 180717ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 180892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(1, network_delegate.set_cookie_count()); 180992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 181092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 181192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Verify that the cookie is set. 181292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 181392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestNetworkDelegate network_delegate; 181492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri context.set_network_delegate(&network_delegate); 181592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestDelegate d; 181692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest req(test_server.GetURL("echoheader?Cookie"), &d, &context); 181792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.Start(); 181892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri MessageLoop::current()->Run(); 181992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 182092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(d.data_received().find("CookieToNotSend=1") 182192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri != std::string::npos); 182292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 182392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 182492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 182592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 182692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 182792617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, DoNotSendCookies) { 182892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri LocalHttpTestServer test_server; 182992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ASSERT_TRUE(test_server.Start()); 183092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 183192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Set up a cookie. 183292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 183392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestNetworkDelegate network_delegate; 183492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri default_context_.set_network_delegate(&network_delegate); 183592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestDelegate d; 183692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest req(test_server.GetURL("set-cookie?CookieToNotSend=1"), 183792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri &d, 183892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri &default_context_); 183992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.Start(); 184092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri MessageLoop::current()->Run(); 184192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 184292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 184392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 184492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 184592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Verify that the cookie is set. 184692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 184792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestNetworkDelegate network_delegate; 184892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri default_context_.set_network_delegate(&network_delegate); 184992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestDelegate d; 185092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest req( 185192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri test_server.GetURL("echoheader?Cookie"), &d, &default_context_); 185292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.Start(); 185392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri MessageLoop::current()->Run(); 185492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 185592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(d.data_received().find("CookieToNotSend=1") 185692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri != std::string::npos); 185792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 185892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 185992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 186092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 186192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Verify that the cookie isn't sent when LOAD_DO_NOT_SEND_COOKIES is set. 186292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 186392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestNetworkDelegate network_delegate; 186492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri default_context_.set_network_delegate(&network_delegate); 186592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestDelegate d; 186692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest req( 186792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri test_server.GetURL("echoheader?Cookie"), &d, &default_context_); 186892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.set_load_flags(LOAD_DO_NOT_SEND_COOKIES); 186992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.Start(); 187092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri MessageLoop::current()->Run(); 187192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 187292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(d.data_received().find("Cookie: CookieToNotSend=1") 187392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri == std::string::npos); 187492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 18757e02303497237cde958c28608477d0c355a8038bMarek Olšák // LOAD_DO_NOT_SEND_COOKIES does not trigger OnGetCookies. 187692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 187792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 187892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 187992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 188092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 188192617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, DoNotSaveCookies) { 188292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri LocalHttpTestServer test_server; 188392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ASSERT_TRUE(test_server.Start()); 188492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 188592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Set up a cookie. 188692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 188792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestNetworkDelegate network_delegate; 188892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri default_context_.set_network_delegate(&network_delegate); 188992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestDelegate d; 189092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest req(test_server.GetURL("set-cookie?CookieToNotUpdate=2"), 189192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri &d, 189292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri &default_context_); 189392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.Start(); 189492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri MessageLoop::current()->Run(); 189592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 189692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 189792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 189892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(1, network_delegate.set_cookie_count()); 189992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 190092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 190192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Try to set-up another cookie and update the previous cookie. 190292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 190392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestNetworkDelegate network_delegate; 190492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri default_context_.set_network_delegate(&network_delegate); 190592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestDelegate d; 190692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest req( 190792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri test_server.GetURL("set-cookie?CookieToNotSave=1&CookieToNotUpdate=1"), 190892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri &d, 190992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri &default_context_); 191092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.set_load_flags(LOAD_DO_NOT_SAVE_COOKIES); 191192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.Start(); 191292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 191392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri MessageLoop::current()->Run(); 191492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 191592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // LOAD_DO_NOT_SAVE_COOKIES does not trigger OnSetCookie. 191692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 191792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 191892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, network_delegate.set_cookie_count()); 191992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 192092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 192192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Verify the cookies weren't saved or updated. 192292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 192392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestNetworkDelegate network_delegate; 192492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri default_context_.set_network_delegate(&network_delegate); 192592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestDelegate d; 192692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest req( 192765303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller test_server.GetURL("echoheader?Cookie"), &d, &default_context_); 192892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.Start(); 192992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri MessageLoop::current()->Run(); 193092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 193192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(d.data_received().find("CookieToNotSave=1") 193292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri == std::string::npos); 193392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(d.data_received().find("CookieToNotUpdate=2") 193492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri != std::string::npos); 193592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 193692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 193792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 193892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, network_delegate.set_cookie_count()); 193992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 194092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 194192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 194292617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, DoNotSendCookies_ViaPolicy) { 194392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri LocalHttpTestServer test_server; 194492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ASSERT_TRUE(test_server.Start()); 194592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 194692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Set up a cookie. 194792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 194892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestNetworkDelegate network_delegate; 194992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri default_context_.set_network_delegate(&network_delegate); 195092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestDelegate d; 195192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest req(test_server.GetURL("set-cookie?CookieToNotSend=1"), 195292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri &d, 195392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri &default_context_); 195492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.Start(); 195592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri MessageLoop::current()->Run(); 195692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 195792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 195892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 195992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 196092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 196192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Verify that the cookie is set. 196292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 196392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestNetworkDelegate network_delegate; 1964507337864fa80caf9f26602324d2c28dd0a75d61Marek Olšák default_context_.set_network_delegate(&network_delegate); 196592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestDelegate d; 196692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest req( 196792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri test_server.GetURL("echoheader?Cookie"), &d, &default_context_); 196892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.Start(); 196992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri MessageLoop::current()->Run(); 19703e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri 197192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(d.data_received().find("CookieToNotSend=1") 197292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri != std::string::npos); 197392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 197492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 197592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 197692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 197792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 197892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Verify that the cookie isn't sent. 197992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 198092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestNetworkDelegate network_delegate; 198192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri default_context_.set_network_delegate(&network_delegate); 198292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestDelegate d; 198392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri network_delegate.set_cookie_options(TestNetworkDelegate::NO_GET_COOKIES); 198492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest req( 198592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri test_server.GetURL("echoheader?Cookie"), &d, &default_context_); 198692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.Start(); 198792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri MessageLoop::current()->Run(); 198892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 198992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(d.data_received().find("Cookie: CookieToNotSend=1") 199092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri == std::string::npos); 199192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 199292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(1, network_delegate.blocked_get_cookies_count()); 199392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 199492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 199592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 199692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 199792617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, DoNotSaveCookies_ViaPolicy) { 199892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri LocalHttpTestServer test_server; 199992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ASSERT_TRUE(test_server.Start()); 200092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 200192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Set up a cookie. 200292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 200392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestNetworkDelegate network_delegate; 200492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri default_context_.set_network_delegate(&network_delegate); 200592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestDelegate d; 200692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest req(test_server.GetURL("set-cookie?CookieToNotUpdate=2"), 200792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri &d, 200892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri &default_context_); 200992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.Start(); 201092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri MessageLoop::current()->Run(); 201192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 201292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 201392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 201492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 201592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 201692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Try to set-up another cookie and update the previous cookie. 201792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 201892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestNetworkDelegate network_delegate; 201992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri default_context_.set_network_delegate(&network_delegate); 202092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestDelegate d; 202192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri network_delegate.set_cookie_options(TestNetworkDelegate::NO_SET_COOKIE); 202292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest req( 202392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri test_server.GetURL("set-cookie?CookieToNotSave=1&CookieToNotUpdate=1"), 202492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri &d, 202592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri &default_context_); 202692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.Start(); 202792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 202892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri MessageLoop::current()->Run(); 202992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 203092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 203192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(2, network_delegate.blocked_set_cookie_count()); 203292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 203392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 203492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Verify the cookies weren't saved or updated. 203592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 203692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestNetworkDelegate network_delegate; 203792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri default_context_.set_network_delegate(&network_delegate); 203892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestDelegate d; 203992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest req( 204092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri test_server.GetURL("echoheader?Cookie"), &d, &default_context_); 204192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.Start(); 204292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri MessageLoop::current()->Run(); 204392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 204492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(d.data_received().find("CookieToNotSave=1") 204592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri == std::string::npos); 204692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(d.data_received().find("CookieToNotUpdate=2") 204792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri != std::string::npos); 204892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 204992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 205092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 205192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 205292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 205392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 205492617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, DoNotSaveEmptyCookies) { 205592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri LocalHttpTestServer test_server; 205692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ASSERT_TRUE(test_server.Start()); 205792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 205892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Set up an empty cookie. 205992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 206092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestNetworkDelegate network_delegate; 206192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri default_context_.set_network_delegate(&network_delegate); 206292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestDelegate d; 206392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest req(test_server.GetURL("set-cookie"), &d, &default_context_); 206492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.Start(); 206592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri MessageLoop::current()->Run(); 206692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 206792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 206892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 206992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, network_delegate.set_cookie_count()); 207092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 207192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 207292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 207392617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, DoNotSendCookies_ViaPolicy_Async) { 207492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri LocalHttpTestServer test_server; 207592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ASSERT_TRUE(test_server.Start()); 207692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 207792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Set up a cookie. 207892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 207992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestNetworkDelegate network_delegate; 208092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri default_context_.set_network_delegate(&network_delegate); 208192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestDelegate d; 208292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest req(test_server.GetURL("set-cookie?CookieToNotSend=1"), 208392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri &d, 208492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri &default_context_); 208592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.Start(); 208692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri MessageLoop::current()->Run(); 208792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 2088b4b2091655676ec3b898d3ae7298192aa7f9147fLuca Barbieri EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 208992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 209092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 209192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 209292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Verify that the cookie is set. 209392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 209492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestNetworkDelegate network_delegate; 209592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri default_context_.set_network_delegate(&network_delegate); 209692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestDelegate d; 209792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest req( 209892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri test_server.GetURL("echoheader?Cookie"), &d, &default_context_); 209992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.Start(); 210092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri MessageLoop::current()->Run(); 210192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 210292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(d.data_received().find("CookieToNotSend=1") 210392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri != std::string::npos); 210492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 210592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 210692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 210792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 210892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 210992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Verify that the cookie isn't sent. 211092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 211192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestNetworkDelegate network_delegate; 211292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri default_context_.set_network_delegate(&network_delegate); 211392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TestDelegate d; 211492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri network_delegate.set_cookie_options(TestNetworkDelegate::NO_GET_COOKIES); 211592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri URLRequest req( 211692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri test_server.GetURL("echoheader?Cookie"), &d, &default_context_); 211792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri req.Start(); 211892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri MessageLoop::current()->Run(); 211992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 212092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_TRUE(d.data_received().find("Cookie: CookieToNotSend=1") 212192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri == std::string::npos); 212292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 212392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(1, network_delegate.blocked_get_cookies_count()); 212492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 212592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 212692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 212792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 212892617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, DoNotSaveCookies_ViaPolicy_Async) { 212992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri LocalHttpTestServer test_server; 213092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ASSERT_TRUE(test_server.Start()); 2131 2132 // Set up a cookie. 2133 { 2134 TestNetworkDelegate network_delegate; 2135 default_context_.set_network_delegate(&network_delegate); 2136 TestDelegate d; 2137 URLRequest req(test_server.GetURL("set-cookie?CookieToNotUpdate=2"), 2138 &d, 2139 &default_context_); 2140 req.Start(); 2141 MessageLoop::current()->Run(); 2142 2143 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 2144 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 2145 } 2146 2147 // Try to set-up another cookie and update the previous cookie. 2148 { 2149 TestNetworkDelegate network_delegate; 2150 default_context_.set_network_delegate(&network_delegate); 2151 TestDelegate d; 2152 network_delegate.set_cookie_options(TestNetworkDelegate::NO_SET_COOKIE); 2153 URLRequest req( 2154 test_server.GetURL("set-cookie?CookieToNotSave=1&CookieToNotUpdate=1"), 2155 &d, 2156 &default_context_); 2157 req.Start(); 2158 2159 MessageLoop::current()->Run(); 2160 2161 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 2162 EXPECT_EQ(2, network_delegate.blocked_set_cookie_count()); 2163 } 2164 2165 // Verify the cookies weren't saved or updated. 2166 { 2167 TestNetworkDelegate network_delegate; 2168 default_context_.set_network_delegate(&network_delegate); 2169 TestDelegate d; 2170 URLRequest req( 2171 test_server.GetURL("echoheader?Cookie"), &d, &default_context_); 2172 req.Start(); 2173 MessageLoop::current()->Run(); 2174 2175 EXPECT_TRUE(d.data_received().find("CookieToNotSave=1") 2176 == std::string::npos); 2177 EXPECT_TRUE(d.data_received().find("CookieToNotUpdate=2") 2178 != std::string::npos); 2179 2180 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 2181 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 2182 } 2183} 2184 2185// FixedDateNetworkDelegate swaps out the server's HTTP Date response header 2186// value for the |fixed_date| argument given to the constructor. 2187class FixedDateNetworkDelegate : public TestNetworkDelegate { 2188 public: 2189 explicit FixedDateNetworkDelegate(const std::string& fixed_date) 2190 : fixed_date_(fixed_date) {} 2191 virtual ~FixedDateNetworkDelegate() {} 2192 2193 // net::NetworkDelegate implementation 2194 virtual int OnHeadersReceived( 2195 net::URLRequest* request, 2196 const net::CompletionCallback& callback, 2197 const net::HttpResponseHeaders* original_response_headers, 2198 scoped_refptr<net::HttpResponseHeaders>* override_response_headers) 2199 OVERRIDE; 2200 2201 private: 2202 std::string fixed_date_; 2203 2204 DISALLOW_COPY_AND_ASSIGN(FixedDateNetworkDelegate); 2205}; 2206 2207int FixedDateNetworkDelegate::OnHeadersReceived( 2208 net::URLRequest* request, 2209 const net::CompletionCallback& callback, 2210 const net::HttpResponseHeaders* original_response_headers, 2211 scoped_refptr<net::HttpResponseHeaders>* override_response_headers) { 2212 net::HttpResponseHeaders* new_response_headers = 2213 new net::HttpResponseHeaders(original_response_headers->raw_headers()); 2214 2215 new_response_headers->RemoveHeader("Date"); 2216 new_response_headers->AddHeader("Date: " + fixed_date_); 2217 2218 *override_response_headers = new_response_headers; 2219 return TestNetworkDelegate::OnHeadersReceived(request, 2220 callback, 2221 original_response_headers, 2222 override_response_headers); 2223} 2224 2225// Test that cookie expiration times are adjusted for server/client clock 2226// skew and that we handle incorrect timezone specifier "UTC" in HTTP Date 2227// headers by defaulting to GMT. (crbug.com/135131) 2228TEST_F(URLRequestTest, AcceptClockSkewCookieWithWrongDateTimezone) { 2229 LocalHttpTestServer test_server; 2230 ASSERT_TRUE(test_server.Start()); 2231 2232 // Set up an expired cookie. 2233 { 2234 TestNetworkDelegate network_delegate; 2235 default_context_.set_network_delegate(&network_delegate); 2236 TestDelegate d; 2237 URLRequest req(test_server.GetURL( 2238 "set-cookie?StillGood=1;expires=Mon,18-Apr-1977,22:50:13,GMT"), 2239 &d, 2240 &default_context_); 2241 req.Start(); 2242 MessageLoop::current()->Run(); 2243 } 2244 // Verify that the cookie is not set. 2245 { 2246 TestNetworkDelegate network_delegate; 2247 default_context_.set_network_delegate(&network_delegate); 2248 TestDelegate d; 2249 URLRequest req( 2250 test_server.GetURL("echoheader?Cookie"), &d, &default_context_); 2251 req.Start(); 2252 MessageLoop::current()->Run(); 2253 2254 EXPECT_TRUE(d.data_received().find("StillGood=1") == std::string::npos); 2255 } 2256 // Set up a cookie with clock skew and "UTC" HTTP Date timezone specifier. 2257 { 2258 FixedDateNetworkDelegate network_delegate("18-Apr-1977 22:49:13 UTC"); 2259 default_context_.set_network_delegate(&network_delegate); 2260 TestDelegate d; 2261 URLRequest req(test_server.GetURL( 2262 "set-cookie?StillGood=1;expires=Mon,18-Apr-1977,22:50:13,GMT"), 2263 &d, 2264 &default_context_); 2265 req.Start(); 2266 MessageLoop::current()->Run(); 2267 } 2268 // Verify that the cookie is set. 2269 { 2270 TestNetworkDelegate network_delegate; 2271 default_context_.set_network_delegate(&network_delegate); 2272 TestDelegate d; 2273 URLRequest req( 2274 test_server.GetURL("echoheader?Cookie"), &d, &default_context_); 2275 req.Start(); 2276 MessageLoop::current()->Run(); 2277 2278 EXPECT_TRUE(d.data_received().find("StillGood=1") != std::string::npos); 2279 } 2280} 2281 2282 2283// Check that it is impossible to change the referrer in the extra headers of 2284// an URLRequest. 2285TEST_F(URLRequestTest, DoNotOverrideReferrer) { 2286 LocalHttpTestServer test_server; 2287 ASSERT_TRUE(test_server.Start()); 2288 2289 // If extra headers contain referer and the request contains a referer, 2290 // only the latter shall be respected. 2291 { 2292 TestDelegate d; 2293 URLRequest req( 2294 test_server.GetURL("echoheader?Referer"), &d, &default_context_); 2295 req.SetReferrer("http://foo.com/"); 2296 2297 HttpRequestHeaders headers; 2298 headers.SetHeader(HttpRequestHeaders::kReferer, "http://bar.com/"); 2299 req.SetExtraRequestHeaders(headers); 2300 2301 req.Start(); 2302 MessageLoop::current()->Run(); 2303 2304 EXPECT_EQ("http://foo.com/", d.data_received()); 2305 } 2306 2307 // If extra headers contain a referer but the request does not, no referer 2308 // shall be sent in the header. 2309 { 2310 TestDelegate d; 2311 URLRequest req( 2312 test_server.GetURL("echoheader?Referer"), &d, &default_context_); 2313 2314 HttpRequestHeaders headers; 2315 headers.SetHeader(HttpRequestHeaders::kReferer, "http://bar.com/"); 2316 req.SetExtraRequestHeaders(headers); 2317 req.set_load_flags(LOAD_VALIDATE_CACHE); 2318 2319 req.Start(); 2320 MessageLoop::current()->Run(); 2321 2322 EXPECT_EQ("None", d.data_received()); 2323 } 2324} 2325 2326class URLRequestTestHTTP : public URLRequestTest { 2327 public: 2328 URLRequestTestHTTP() 2329 : test_server_(base::FilePath(FILE_PATH_LITERAL( 2330 "net/data/url_request_unittest"))) { 2331 } 2332 2333 protected: 2334 // Requests |redirect_url|, which must return a HTTP 3xx redirect. 2335 // |request_method| is the method to use for the initial request. 2336 // |redirect_method| is the method that is expected to be used for the second 2337 // request, after redirection. 2338 // If |include_data| is true, data is uploaded with the request. The 2339 // response body is expected to match it exactly, if and only if 2340 // |request_method| == |redirect_method|. 2341 void HTTPRedirectMethodTest(const GURL& redirect_url, 2342 const std::string& request_method, 2343 const std::string& redirect_method, 2344 bool include_data) { 2345 static const char kData[] = "hello world"; 2346 TestDelegate d; 2347 URLRequest req(redirect_url, &d, &default_context_); 2348 req.set_method(request_method); 2349 if (include_data) { 2350 req.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData))); 2351 HttpRequestHeaders headers; 2352 headers.SetHeader(HttpRequestHeaders::kContentLength, 2353 base::UintToString(arraysize(kData) - 1)); 2354 req.SetExtraRequestHeaders(headers); 2355 } 2356 req.Start(); 2357 MessageLoop::current()->Run(); 2358 EXPECT_EQ(redirect_method, req.method()); 2359 EXPECT_EQ(URLRequestStatus::SUCCESS, req.status().status()); 2360 EXPECT_EQ(OK, req.status().error()); 2361 if (include_data) { 2362 if (request_method == redirect_method) { 2363 EXPECT_EQ(kData, d.data_received()); 2364 } else { 2365 EXPECT_NE(kData, d.data_received()); 2366 } 2367 } 2368 if (HasFailure()) 2369 LOG(WARNING) << "Request method was: " << request_method; 2370 } 2371 2372 void HTTPUploadDataOperationTest(const std::string& method) { 2373 const int kMsgSize = 20000; // multiple of 10 2374 const int kIterations = 50; 2375 char* uploadBytes = new char[kMsgSize+1]; 2376 char* ptr = uploadBytes; 2377 char marker = 'a'; 2378 for (int idx = 0; idx < kMsgSize/10; idx++) { 2379 memcpy(ptr, "----------", 10); 2380 ptr += 10; 2381 if (idx % 100 == 0) { 2382 ptr--; 2383 *ptr++ = marker; 2384 if (++marker > 'z') 2385 marker = 'a'; 2386 } 2387 } 2388 uploadBytes[kMsgSize] = '\0'; 2389 2390 for (int i = 0; i < kIterations; ++i) { 2391 TestDelegate d; 2392 URLRequest r(test_server_.GetURL("echo"), &d, &default_context_); 2393 r.set_method(method.c_str()); 2394 2395 r.set_upload(make_scoped_ptr(CreateSimpleUploadData(uploadBytes))); 2396 2397 r.Start(); 2398 EXPECT_TRUE(r.is_pending()); 2399 2400 MessageLoop::current()->Run(); 2401 2402 ASSERT_EQ(1, d.response_started_count()) 2403 << "request failed: " << r.status().status() 2404 << ", os error: " << r.status().error(); 2405 2406 EXPECT_FALSE(d.received_data_before_response()); 2407 EXPECT_EQ(uploadBytes, d.data_received()); 2408 } 2409 delete[] uploadBytes; 2410 } 2411 2412 void AddChunksToUpload(URLRequest* r) { 2413 r->AppendChunkToUpload("a", 1, false); 2414 r->AppendChunkToUpload("bcd", 3, false); 2415 r->AppendChunkToUpload("this is a longer chunk than before.", 35, false); 2416 r->AppendChunkToUpload("\r\n\r\n", 4, false); 2417 r->AppendChunkToUpload("0", 1, false); 2418 r->AppendChunkToUpload("2323", 4, true); 2419 } 2420 2421 void VerifyReceivedDataMatchesChunks(URLRequest* r, TestDelegate* d) { 2422 // This should match the chunks sent by AddChunksToUpload(). 2423 const std::string expected_data = 2424 "abcdthis is a longer chunk than before.\r\n\r\n02323"; 2425 2426 ASSERT_EQ(1, d->response_started_count()) 2427 << "request failed: " << r->status().status() 2428 << ", os error: " << r->status().error(); 2429 2430 EXPECT_FALSE(d->received_data_before_response()); 2431 2432 EXPECT_EQ(expected_data.size(), static_cast<size_t>(d->bytes_received())); 2433 EXPECT_EQ(expected_data, d->data_received()); 2434 } 2435 2436 bool DoManyCookiesRequest(int num_cookies) { 2437 TestDelegate d; 2438 URLRequest r(test_server_.GetURL("set-many-cookies?" + 2439 base::IntToString(num_cookies)), 2440 &d, 2441 &default_context_); 2442 2443 r.Start(); 2444 EXPECT_TRUE(r.is_pending()); 2445 2446 MessageLoop::current()->Run(); 2447 2448 bool is_success = r.status().is_success(); 2449 2450 if (!is_success) { 2451 // Requests handled by ChromeFrame send a less precise error message, 2452 // ERR_CONNECTION_ABORTED. 2453 EXPECT_TRUE(r.status().error() == ERR_RESPONSE_HEADERS_TOO_BIG || 2454 r.status().error() == ERR_CONNECTION_ABORTED); 2455 // The test server appears to be unable to handle subsequent requests 2456 // after this error is triggered. Force it to restart. 2457 EXPECT_TRUE(test_server_.Stop()); 2458 EXPECT_TRUE(test_server_.Start()); 2459 } 2460 2461 return is_success; 2462 } 2463 2464 LocalHttpTestServer test_server_; 2465}; 2466 2467// In this unit test, we're using the HTTPTestServer as a proxy server and 2468// issuing a CONNECT request with the magic host name "www.redirect.com". 2469// The HTTPTestServer will return a 302 response, which we should not 2470// follow. 2471TEST_F(URLRequestTestHTTP, ProxyTunnelRedirectTest) { 2472 ASSERT_TRUE(test_server_.Start()); 2473 2474 TestNetworkDelegate network_delegate; // Must outlive URLRequest. 2475 TestURLRequestContextWithProxy context( 2476 test_server_.host_port_pair().ToString(), 2477 &network_delegate); 2478 2479 TestDelegate d; 2480 { 2481 URLRequest r(GURL("https://www.redirect.com/"), &d, &context); 2482 r.Start(); 2483 EXPECT_TRUE(r.is_pending()); 2484 2485 MessageLoop::current()->Run(); 2486 2487 EXPECT_EQ(URLRequestStatus::FAILED, r.status().status()); 2488 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, r.status().error()); 2489 EXPECT_EQ(1, d.response_started_count()); 2490 // We should not have followed the redirect. 2491 EXPECT_EQ(0, d.received_redirect_count()); 2492 } 2493} 2494 2495// This is the same as the previous test, but checks that the network delegate 2496// registers the error. 2497TEST_F(URLRequestTestHTTP, NetworkDelegateTunnelConnectionFailed) { 2498 ASSERT_TRUE(test_server_.Start()); 2499 2500 TestNetworkDelegate network_delegate; // Must outlive URLRequest. 2501 TestURLRequestContextWithProxy context( 2502 test_server_.host_port_pair().ToString(), 2503 &network_delegate); 2504 2505 TestDelegate d; 2506 { 2507 URLRequest r(GURL("https://www.redirect.com/"), &d, &context); 2508 r.Start(); 2509 EXPECT_TRUE(r.is_pending()); 2510 2511 MessageLoop::current()->Run(); 2512 2513 EXPECT_EQ(URLRequestStatus::FAILED, r.status().status()); 2514 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, r.status().error()); 2515 EXPECT_EQ(1, d.response_started_count()); 2516 // We should not have followed the redirect. 2517 EXPECT_EQ(0, d.received_redirect_count()); 2518 2519 EXPECT_EQ(1, network_delegate.error_count()); 2520 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, network_delegate.last_error()); 2521 } 2522} 2523 2524// Tests that we can block and asynchronously return OK in various stages. 2525TEST_F(URLRequestTestHTTP, NetworkDelegateBlockAsynchronously) { 2526 static const BlockingNetworkDelegate::Stage blocking_stages[] = { 2527 BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST, 2528 BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS, 2529 BlockingNetworkDelegate::ON_HEADERS_RECEIVED 2530 }; 2531 static const size_t blocking_stages_length = arraysize(blocking_stages); 2532 2533 ASSERT_TRUE(test_server_.Start()); 2534 2535 TestDelegate d; 2536 BlockingNetworkDelegate network_delegate( 2537 BlockingNetworkDelegate::USER_CALLBACK); 2538 network_delegate.set_block_on( 2539 BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST | 2540 BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS | 2541 BlockingNetworkDelegate::ON_HEADERS_RECEIVED); 2542 2543 TestURLRequestContext context(true); 2544 context.set_network_delegate(&network_delegate); 2545 context.Init(); 2546 2547 { 2548 URLRequest r(test_server_.GetURL("empty.html"), &d, &context); 2549 2550 r.Start(); 2551 for (size_t i = 0; i < blocking_stages_length; ++i) { 2552 MessageLoop::current()->Run(); 2553 EXPECT_EQ(blocking_stages[i], 2554 network_delegate.stage_blocked_for_callback()); 2555 network_delegate.DoCallback(OK); 2556 } 2557 MessageLoop::current()->Run(); 2558 EXPECT_EQ(200, r.GetResponseCode()); 2559 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 2560 EXPECT_EQ(1, network_delegate.created_requests()); 2561 EXPECT_EQ(0, network_delegate.destroyed_requests()); 2562 } 2563 EXPECT_EQ(1, network_delegate.destroyed_requests()); 2564} 2565 2566// Tests that the network delegate can block and cancel a request. 2567TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequest) { 2568 ASSERT_TRUE(test_server_.Start()); 2569 2570 TestDelegate d; 2571 BlockingNetworkDelegate network_delegate( 2572 BlockingNetworkDelegate::AUTO_CALLBACK); 2573 network_delegate.set_block_on(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST); 2574 network_delegate.set_retval(ERR_EMPTY_RESPONSE); 2575 2576 TestURLRequestContextWithProxy context( 2577 test_server_.host_port_pair().ToString(), 2578 &network_delegate); 2579 2580 { 2581 URLRequest r(test_server_.GetURL(std::string()), &d, &context); 2582 2583 r.Start(); 2584 MessageLoop::current()->Run(); 2585 2586 EXPECT_EQ(URLRequestStatus::FAILED, r.status().status()); 2587 EXPECT_EQ(ERR_EMPTY_RESPONSE, r.status().error()); 2588 EXPECT_EQ(1, network_delegate.created_requests()); 2589 EXPECT_EQ(0, network_delegate.destroyed_requests()); 2590 } 2591 EXPECT_EQ(1, network_delegate.destroyed_requests()); 2592} 2593 2594// Helper function for NetworkDelegateCancelRequestAsynchronously and 2595// NetworkDelegateCancelRequestSynchronously. Sets up a blocking network 2596// delegate operating in |block_mode| and a request for |url|. It blocks the 2597// request in |stage| and cancels it with ERR_BLOCKED_BY_CLIENT. 2598void NetworkDelegateCancelRequest(BlockingNetworkDelegate::BlockMode block_mode, 2599 BlockingNetworkDelegate::Stage stage, 2600 const GURL& url) { 2601 TestDelegate d; 2602 BlockingNetworkDelegate network_delegate(block_mode); 2603 network_delegate.set_retval(ERR_BLOCKED_BY_CLIENT); 2604 network_delegate.set_block_on(stage); 2605 2606 TestURLRequestContext context(true); 2607 context.set_network_delegate(&network_delegate); 2608 context.Init(); 2609 2610 { 2611 URLRequest r(url, &d, &context); 2612 2613 r.Start(); 2614 MessageLoop::current()->Run(); 2615 2616 EXPECT_EQ(URLRequestStatus::FAILED, r.status().status()); 2617 EXPECT_EQ(ERR_BLOCKED_BY_CLIENT, r.status().error()); 2618 EXPECT_EQ(1, network_delegate.created_requests()); 2619 EXPECT_EQ(0, network_delegate.destroyed_requests()); 2620 } 2621 EXPECT_EQ(1, network_delegate.destroyed_requests()); 2622} 2623 2624// The following 3 tests check that the network delegate can cancel a request 2625// synchronously in various stages of the request. 2626TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestSynchronously1) { 2627 ASSERT_TRUE(test_server_.Start()); 2628 NetworkDelegateCancelRequest(BlockingNetworkDelegate::SYNCHRONOUS, 2629 BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST, 2630 test_server_.GetURL(std::string())); 2631} 2632 2633TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestSynchronously2) { 2634 ASSERT_TRUE(test_server_.Start()); 2635 NetworkDelegateCancelRequest(BlockingNetworkDelegate::SYNCHRONOUS, 2636 BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS, 2637 test_server_.GetURL(std::string())); 2638} 2639 2640TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestSynchronously3) { 2641 ASSERT_TRUE(test_server_.Start()); 2642 NetworkDelegateCancelRequest(BlockingNetworkDelegate::SYNCHRONOUS, 2643 BlockingNetworkDelegate::ON_HEADERS_RECEIVED, 2644 test_server_.GetURL(std::string())); 2645} 2646 2647// The following 3 tests check that the network delegate can cancel a request 2648// asynchronously in various stages of the request. 2649TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestAsynchronously1) { 2650 ASSERT_TRUE(test_server_.Start()); 2651 NetworkDelegateCancelRequest(BlockingNetworkDelegate::AUTO_CALLBACK, 2652 BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST, 2653 test_server_.GetURL(std::string())); 2654} 2655 2656TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestAsynchronously2) { 2657 ASSERT_TRUE(test_server_.Start()); 2658 NetworkDelegateCancelRequest(BlockingNetworkDelegate::AUTO_CALLBACK, 2659 BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS, 2660 test_server_.GetURL(std::string())); 2661} 2662 2663TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestAsynchronously3) { 2664 ASSERT_TRUE(test_server_.Start()); 2665 NetworkDelegateCancelRequest(BlockingNetworkDelegate::AUTO_CALLBACK, 2666 BlockingNetworkDelegate::ON_HEADERS_RECEIVED, 2667 test_server_.GetURL(std::string())); 2668} 2669 2670// Tests that the network delegate can block and redirect a request to a new 2671// URL. 2672TEST_F(URLRequestTestHTTP, NetworkDelegateRedirectRequest) { 2673 ASSERT_TRUE(test_server_.Start()); 2674 2675 TestDelegate d; 2676 BlockingNetworkDelegate network_delegate( 2677 BlockingNetworkDelegate::AUTO_CALLBACK); 2678 network_delegate.set_block_on(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST); 2679 GURL redirect_url(test_server_.GetURL("simple.html")); 2680 network_delegate.set_redirect_url(redirect_url); 2681 2682 TestURLRequestContextWithProxy context( 2683 test_server_.host_port_pair().ToString(), 2684 &network_delegate); 2685 2686 { 2687 GURL original_url(test_server_.GetURL("empty.html")); 2688 URLRequest r(original_url, &d, &context); 2689 2690 r.Start(); 2691 MessageLoop::current()->Run(); 2692 2693 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 2694 EXPECT_EQ(0, r.status().error()); 2695 EXPECT_EQ(redirect_url, r.url()); 2696 EXPECT_EQ(original_url, r.original_url()); 2697 EXPECT_EQ(2U, r.url_chain().size()); 2698 EXPECT_EQ(1, network_delegate.created_requests()); 2699 EXPECT_EQ(0, network_delegate.destroyed_requests()); 2700 } 2701 EXPECT_EQ(1, network_delegate.destroyed_requests()); 2702} 2703 2704// Tests that the network delegate can block and redirect a request to a new 2705// URL by setting a redirect_url and returning in OnBeforeURLRequest directly. 2706TEST_F(URLRequestTestHTTP, NetworkDelegateRedirectRequestSynchronously) { 2707 ASSERT_TRUE(test_server_.Start()); 2708 2709 TestDelegate d; 2710 BlockingNetworkDelegate network_delegate( 2711 BlockingNetworkDelegate::SYNCHRONOUS); 2712 GURL redirect_url(test_server_.GetURL("simple.html")); 2713 network_delegate.set_redirect_url(redirect_url); 2714 2715 TestURLRequestContextWithProxy context( 2716 test_server_.host_port_pair().ToString(), 2717 &network_delegate); 2718 2719 { 2720 GURL original_url(test_server_.GetURL("empty.html")); 2721 URLRequest r(original_url, &d, &context); 2722 2723 r.Start(); 2724 MessageLoop::current()->Run(); 2725 2726 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 2727 EXPECT_EQ(0, r.status().error()); 2728 EXPECT_EQ(redirect_url, r.url()); 2729 EXPECT_EQ(original_url, r.original_url()); 2730 EXPECT_EQ(2U, r.url_chain().size()); 2731 EXPECT_EQ(1, network_delegate.created_requests()); 2732 EXPECT_EQ(0, network_delegate.destroyed_requests()); 2733 } 2734 EXPECT_EQ(1, network_delegate.destroyed_requests()); 2735} 2736 2737// Tests that redirects caused by the network delegate preserve POST data. 2738TEST_F(URLRequestTestHTTP, NetworkDelegateRedirectRequestPost) { 2739 ASSERT_TRUE(test_server_.Start()); 2740 2741 const char kData[] = "hello world"; 2742 2743 TestDelegate d; 2744 BlockingNetworkDelegate network_delegate( 2745 BlockingNetworkDelegate::AUTO_CALLBACK); 2746 network_delegate.set_block_on(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST); 2747 GURL redirect_url(test_server_.GetURL("echo")); 2748 network_delegate.set_redirect_url(redirect_url); 2749 2750 TestURLRequestContext context(true); 2751 context.set_network_delegate(&network_delegate); 2752 context.Init(); 2753 2754 { 2755 GURL original_url(test_server_.GetURL("empty.html")); 2756 URLRequest r(original_url, &d, &context); 2757 r.set_method("POST"); 2758 r.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData))); 2759 HttpRequestHeaders headers; 2760 headers.SetHeader(HttpRequestHeaders::kContentLength, 2761 base::UintToString(arraysize(kData) - 1)); 2762 r.SetExtraRequestHeaders(headers); 2763 r.Start(); 2764 MessageLoop::current()->Run(); 2765 2766 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 2767 EXPECT_EQ(0, r.status().error()); 2768 EXPECT_EQ(redirect_url, r.url()); 2769 EXPECT_EQ(original_url, r.original_url()); 2770 EXPECT_EQ(2U, r.url_chain().size()); 2771 EXPECT_EQ(1, network_delegate.created_requests()); 2772 EXPECT_EQ(0, network_delegate.destroyed_requests()); 2773 EXPECT_EQ("POST", r.method()); 2774 EXPECT_EQ(kData, d.data_received()); 2775 } 2776 EXPECT_EQ(1, network_delegate.destroyed_requests()); 2777} 2778 2779// Tests that the network delegate can synchronously complete OnAuthRequired 2780// by taking no action. This indicates that the NetworkDelegate does not want to 2781// handle the challenge, and is passing the buck along to the 2782// URLRequest::Delegate. 2783TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredSyncNoAction) { 2784 ASSERT_TRUE(test_server_.Start()); 2785 2786 TestDelegate d; 2787 BlockingNetworkDelegate network_delegate( 2788 BlockingNetworkDelegate::SYNCHRONOUS); 2789 2790 TestURLRequestContext context(true); 2791 context.set_network_delegate(&network_delegate); 2792 context.Init(); 2793 2794 d.set_credentials(AuthCredentials(kUser, kSecret)); 2795 2796 { 2797 GURL url(test_server_.GetURL("auth-basic")); 2798 URLRequest r(url, &d, &context); 2799 r.Start(); 2800 MessageLoop::current()->Run(); 2801 2802 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 2803 EXPECT_EQ(0, r.status().error()); 2804 EXPECT_EQ(200, r.GetResponseCode()); 2805 EXPECT_TRUE(d.auth_required_called()); 2806 EXPECT_EQ(1, network_delegate.created_requests()); 2807 EXPECT_EQ(0, network_delegate.destroyed_requests()); 2808 } 2809 EXPECT_EQ(1, network_delegate.destroyed_requests()); 2810} 2811 2812// Tests that the network delegate can synchronously complete OnAuthRequired 2813// by setting credentials. 2814TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredSyncSetAuth) { 2815 ASSERT_TRUE(test_server_.Start()); 2816 2817 TestDelegate d; 2818 BlockingNetworkDelegate network_delegate( 2819 BlockingNetworkDelegate::SYNCHRONOUS); 2820 network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED); 2821 network_delegate.set_auth_retval( 2822 NetworkDelegate::AUTH_REQUIRED_RESPONSE_SET_AUTH); 2823 2824 network_delegate.set_auth_credentials(AuthCredentials(kUser, kSecret)); 2825 2826 TestURLRequestContext context(true); 2827 context.set_network_delegate(&network_delegate); 2828 context.Init(); 2829 2830 { 2831 GURL url(test_server_.GetURL("auth-basic")); 2832 URLRequest r(url, &d, &context); 2833 r.Start(); 2834 MessageLoop::current()->Run(); 2835 2836 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 2837 EXPECT_EQ(0, r.status().error()); 2838 EXPECT_EQ(200, r.GetResponseCode()); 2839 EXPECT_FALSE(d.auth_required_called()); 2840 EXPECT_EQ(1, network_delegate.created_requests()); 2841 EXPECT_EQ(0, network_delegate.destroyed_requests()); 2842 } 2843 EXPECT_EQ(1, network_delegate.destroyed_requests()); 2844} 2845 2846// Tests that the network delegate can synchronously complete OnAuthRequired 2847// by cancelling authentication. 2848TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredSyncCancel) { 2849 ASSERT_TRUE(test_server_.Start()); 2850 2851 TestDelegate d; 2852 BlockingNetworkDelegate network_delegate( 2853 BlockingNetworkDelegate::SYNCHRONOUS); 2854 network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED); 2855 network_delegate.set_auth_retval( 2856 NetworkDelegate::AUTH_REQUIRED_RESPONSE_CANCEL_AUTH); 2857 2858 TestURLRequestContext context(true); 2859 context.set_network_delegate(&network_delegate); 2860 context.Init(); 2861 2862 { 2863 GURL url(test_server_.GetURL("auth-basic")); 2864 URLRequest r(url, &d, &context); 2865 r.Start(); 2866 MessageLoop::current()->Run(); 2867 2868 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 2869 EXPECT_EQ(OK, r.status().error()); 2870 EXPECT_EQ(401, r.GetResponseCode()); 2871 EXPECT_FALSE(d.auth_required_called()); 2872 EXPECT_EQ(1, network_delegate.created_requests()); 2873 EXPECT_EQ(0, network_delegate.destroyed_requests()); 2874 } 2875 EXPECT_EQ(1, network_delegate.destroyed_requests()); 2876} 2877 2878// Tests that the network delegate can asynchronously complete OnAuthRequired 2879// by taking no action. This indicates that the NetworkDelegate does not want 2880// to handle the challenge, and is passing the buck along to the 2881// URLRequest::Delegate. 2882TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredAsyncNoAction) { 2883 ASSERT_TRUE(test_server_.Start()); 2884 2885 TestDelegate d; 2886 BlockingNetworkDelegate network_delegate( 2887 BlockingNetworkDelegate::AUTO_CALLBACK); 2888 network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED); 2889 2890 TestURLRequestContext context(true); 2891 context.set_network_delegate(&network_delegate); 2892 context.Init(); 2893 2894 d.set_credentials(AuthCredentials(kUser, kSecret)); 2895 2896 { 2897 GURL url(test_server_.GetURL("auth-basic")); 2898 URLRequest r(url, &d, &context); 2899 r.Start(); 2900 MessageLoop::current()->Run(); 2901 2902 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 2903 EXPECT_EQ(0, r.status().error()); 2904 EXPECT_EQ(200, r.GetResponseCode()); 2905 EXPECT_TRUE(d.auth_required_called()); 2906 EXPECT_EQ(1, network_delegate.created_requests()); 2907 EXPECT_EQ(0, network_delegate.destroyed_requests()); 2908 } 2909 EXPECT_EQ(1, network_delegate.destroyed_requests()); 2910} 2911 2912// Tests that the network delegate can asynchronously complete OnAuthRequired 2913// by setting credentials. 2914TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredAsyncSetAuth) { 2915 ASSERT_TRUE(test_server_.Start()); 2916 2917 TestDelegate d; 2918 BlockingNetworkDelegate network_delegate( 2919 BlockingNetworkDelegate::AUTO_CALLBACK); 2920 network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED); 2921 network_delegate.set_auth_retval( 2922 NetworkDelegate::AUTH_REQUIRED_RESPONSE_SET_AUTH); 2923 2924 AuthCredentials auth_credentials(kUser, kSecret); 2925 network_delegate.set_auth_credentials(auth_credentials); 2926 2927 TestURLRequestContext context(true); 2928 context.set_network_delegate(&network_delegate); 2929 context.Init(); 2930 2931 { 2932 GURL url(test_server_.GetURL("auth-basic")); 2933 URLRequest r(url, &d, &context); 2934 r.Start(); 2935 MessageLoop::current()->Run(); 2936 2937 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 2938 EXPECT_EQ(0, r.status().error()); 2939 2940 EXPECT_EQ(200, r.GetResponseCode()); 2941 EXPECT_FALSE(d.auth_required_called()); 2942 EXPECT_EQ(1, network_delegate.created_requests()); 2943 EXPECT_EQ(0, network_delegate.destroyed_requests()); 2944 } 2945 EXPECT_EQ(1, network_delegate.destroyed_requests()); 2946} 2947 2948// Tests that the network delegate can asynchronously complete OnAuthRequired 2949// by cancelling authentication. 2950TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredAsyncCancel) { 2951 ASSERT_TRUE(test_server_.Start()); 2952 2953 TestDelegate d; 2954 BlockingNetworkDelegate network_delegate( 2955 BlockingNetworkDelegate::AUTO_CALLBACK); 2956 network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED); 2957 network_delegate.set_auth_retval( 2958 NetworkDelegate::AUTH_REQUIRED_RESPONSE_CANCEL_AUTH); 2959 2960 TestURLRequestContext context(true); 2961 context.set_network_delegate(&network_delegate); 2962 context.Init(); 2963 2964 { 2965 GURL url(test_server_.GetURL("auth-basic")); 2966 URLRequest r(url, &d, &context); 2967 r.Start(); 2968 MessageLoop::current()->Run(); 2969 2970 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 2971 EXPECT_EQ(OK, r.status().error()); 2972 EXPECT_EQ(401, r.GetResponseCode()); 2973 EXPECT_FALSE(d.auth_required_called()); 2974 EXPECT_EQ(1, network_delegate.created_requests()); 2975 EXPECT_EQ(0, network_delegate.destroyed_requests()); 2976 } 2977 EXPECT_EQ(1, network_delegate.destroyed_requests()); 2978} 2979 2980// Tests that we can handle when a network request was canceled while we were 2981// waiting for the network delegate. 2982// Part 1: Request is cancelled while waiting for OnBeforeURLRequest callback. 2983TEST_F(URLRequestTestHTTP, NetworkDelegateCancelWhileWaiting1) { 2984 ASSERT_TRUE(test_server_.Start()); 2985 2986 TestDelegate d; 2987 BlockingNetworkDelegate network_delegate( 2988 BlockingNetworkDelegate::USER_CALLBACK); 2989 network_delegate.set_block_on(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST); 2990 2991 TestURLRequestContext context(true); 2992 context.set_network_delegate(&network_delegate); 2993 context.Init(); 2994 2995 { 2996 URLRequest r(test_server_.GetURL(std::string()), &d, &context); 2997 2998 r.Start(); 2999 MessageLoop::current()->Run(); 3000 EXPECT_EQ(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST, 3001 network_delegate.stage_blocked_for_callback()); 3002 EXPECT_EQ(0, network_delegate.completed_requests()); 3003 // Cancel before callback. 3004 r.Cancel(); 3005 // Ensure that network delegate is notified. 3006 EXPECT_EQ(1, network_delegate.completed_requests()); 3007 EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status()); 3008 EXPECT_EQ(ERR_ABORTED, r.status().error()); 3009 EXPECT_EQ(1, network_delegate.created_requests()); 3010 EXPECT_EQ(0, network_delegate.destroyed_requests()); 3011 } 3012 EXPECT_EQ(1, network_delegate.destroyed_requests()); 3013} 3014 3015// Tests that we can handle when a network request was canceled while we were 3016// waiting for the network delegate. 3017// Part 2: Request is cancelled while waiting for OnBeforeSendHeaders callback. 3018TEST_F(URLRequestTestHTTP, NetworkDelegateCancelWhileWaiting2) { 3019 ASSERT_TRUE(test_server_.Start()); 3020 3021 TestDelegate d; 3022 BlockingNetworkDelegate network_delegate( 3023 BlockingNetworkDelegate::USER_CALLBACK); 3024 network_delegate.set_block_on( 3025 BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS); 3026 3027 TestURLRequestContext context(true); 3028 context.set_network_delegate(&network_delegate); 3029 context.Init(); 3030 3031 { 3032 URLRequest r(test_server_.GetURL(std::string()), &d, &context); 3033 3034 r.Start(); 3035 MessageLoop::current()->Run(); 3036 EXPECT_EQ(BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS, 3037 network_delegate.stage_blocked_for_callback()); 3038 EXPECT_EQ(0, network_delegate.completed_requests()); 3039 // Cancel before callback. 3040 r.Cancel(); 3041 // Ensure that network delegate is notified. 3042 EXPECT_EQ(1, network_delegate.completed_requests()); 3043 EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status()); 3044 EXPECT_EQ(ERR_ABORTED, r.status().error()); 3045 EXPECT_EQ(1, network_delegate.created_requests()); 3046 EXPECT_EQ(0, network_delegate.destroyed_requests()); 3047 } 3048 EXPECT_EQ(1, network_delegate.destroyed_requests()); 3049} 3050 3051// Tests that we can handle when a network request was canceled while we were 3052// waiting for the network delegate. 3053// Part 3: Request is cancelled while waiting for OnHeadersReceived callback. 3054TEST_F(URLRequestTestHTTP, NetworkDelegateCancelWhileWaiting3) { 3055 ASSERT_TRUE(test_server_.Start()); 3056 3057 TestDelegate d; 3058 BlockingNetworkDelegate network_delegate( 3059 BlockingNetworkDelegate::USER_CALLBACK); 3060 network_delegate.set_block_on(BlockingNetworkDelegate::ON_HEADERS_RECEIVED); 3061 3062 TestURLRequestContext context(true); 3063 context.set_network_delegate(&network_delegate); 3064 context.Init(); 3065 3066 { 3067 URLRequest r(test_server_.GetURL(std::string()), &d, &context); 3068 3069 r.Start(); 3070 MessageLoop::current()->Run(); 3071 EXPECT_EQ(BlockingNetworkDelegate::ON_HEADERS_RECEIVED, 3072 network_delegate.stage_blocked_for_callback()); 3073 EXPECT_EQ(0, network_delegate.completed_requests()); 3074 // Cancel before callback. 3075 r.Cancel(); 3076 // Ensure that network delegate is notified. 3077 EXPECT_EQ(1, network_delegate.completed_requests()); 3078 EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status()); 3079 EXPECT_EQ(ERR_ABORTED, r.status().error()); 3080 EXPECT_EQ(1, network_delegate.created_requests()); 3081 EXPECT_EQ(0, network_delegate.destroyed_requests()); 3082 } 3083 EXPECT_EQ(1, network_delegate.destroyed_requests()); 3084} 3085 3086// Tests that we can handle when a network request was canceled while we were 3087// waiting for the network delegate. 3088// Part 4: Request is cancelled while waiting for OnAuthRequired callback. 3089TEST_F(URLRequestTestHTTP, NetworkDelegateCancelWhileWaiting4) { 3090 ASSERT_TRUE(test_server_.Start()); 3091 3092 TestDelegate d; 3093 BlockingNetworkDelegate network_delegate( 3094 BlockingNetworkDelegate::USER_CALLBACK); 3095 network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED); 3096 3097 TestURLRequestContext context(true); 3098 context.set_network_delegate(&network_delegate); 3099 context.Init(); 3100 3101 { 3102 URLRequest r(test_server_.GetURL("auth-basic"), &d, &context); 3103 3104 r.Start(); 3105 MessageLoop::current()->Run(); 3106 EXPECT_EQ(BlockingNetworkDelegate::ON_AUTH_REQUIRED, 3107 network_delegate.stage_blocked_for_callback()); 3108 EXPECT_EQ(0, network_delegate.completed_requests()); 3109 // Cancel before callback. 3110 r.Cancel(); 3111 // Ensure that network delegate is notified. 3112 EXPECT_EQ(1, network_delegate.completed_requests()); 3113 EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status()); 3114 EXPECT_EQ(ERR_ABORTED, r.status().error()); 3115 EXPECT_EQ(1, network_delegate.created_requests()); 3116 EXPECT_EQ(0, network_delegate.destroyed_requests()); 3117 } 3118 EXPECT_EQ(1, network_delegate.destroyed_requests()); 3119} 3120 3121// In this unit test, we're using the HTTPTestServer as a proxy server and 3122// issuing a CONNECT request with the magic host name "www.server-auth.com". 3123// The HTTPTestServer will return a 401 response, which we should balk at. 3124TEST_F(URLRequestTestHTTP, UnexpectedServerAuthTest) { 3125 ASSERT_TRUE(test_server_.Start()); 3126 3127 TestNetworkDelegate network_delegate; // Must outlive URLRequest. 3128 TestURLRequestContextWithProxy context( 3129 test_server_.host_port_pair().ToString(), 3130 &network_delegate); 3131 3132 TestDelegate d; 3133 { 3134 URLRequest r(GURL("https://www.server-auth.com/"), &d, &context); 3135 3136 r.Start(); 3137 EXPECT_TRUE(r.is_pending()); 3138 3139 MessageLoop::current()->Run(); 3140 3141 EXPECT_EQ(URLRequestStatus::FAILED, r.status().status()); 3142 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, r.status().error()); 3143 } 3144} 3145 3146TEST_F(URLRequestTestHTTP, GetTest_NoCache) { 3147 ASSERT_TRUE(test_server_.Start()); 3148 3149 TestDelegate d; 3150 { 3151 URLRequest r(test_server_.GetURL(std::string()), &d, &default_context_); 3152 3153 r.Start(); 3154 EXPECT_TRUE(r.is_pending()); 3155 3156 MessageLoop::current()->Run(); 3157 3158 EXPECT_EQ(1, d.response_started_count()); 3159 EXPECT_FALSE(d.received_data_before_response()); 3160 EXPECT_NE(0, d.bytes_received()); 3161 EXPECT_EQ(test_server_.host_port_pair().host(), 3162 r.GetSocketAddress().host()); 3163 EXPECT_EQ(test_server_.host_port_pair().port(), 3164 r.GetSocketAddress().port()); 3165 3166 // TODO(eroman): Add back the NetLog tests... 3167 } 3168} 3169 3170// This test has the server send a large number of cookies to the client. 3171// To ensure that no number of cookies causes a crash, a galloping binary 3172// search is used to estimate that maximum number of cookies that are accepted 3173// by the browser. Beyond the maximum number, the request will fail with 3174// ERR_RESPONSE_HEADERS_TOO_BIG. 3175#if defined(OS_WIN) 3176// http://crbug.com/177916 3177#define MAYBE_GetTest_ManyCookies DISABLED_GetTest_ManyCookies 3178#else 3179#define MAYBE_GetTest_ManyCookies GetTest_ManyCookies 3180#endif // defined(OS_WIN) 3181TEST_F(URLRequestTestHTTP, MAYBE_GetTest_ManyCookies) { 3182 ASSERT_TRUE(test_server_.Start()); 3183 3184 int lower_bound = 0; 3185 int upper_bound = 1; 3186 3187 // Double the number of cookies until the response header limits are 3188 // exceeded. 3189 while (DoManyCookiesRequest(upper_bound)) { 3190 lower_bound = upper_bound; 3191 upper_bound *= 2; 3192 ASSERT_LT(upper_bound, 1000000); 3193 } 3194 3195 int tolerance = upper_bound * 0.005; 3196 if (tolerance < 2) 3197 tolerance = 2; 3198 3199 // Perform a binary search to find the highest possible number of cookies, 3200 // within the desired tolerance. 3201 while (upper_bound - lower_bound >= tolerance) { 3202 int num_cookies = (lower_bound + upper_bound) / 2; 3203 3204 if (DoManyCookiesRequest(num_cookies)) 3205 lower_bound = num_cookies; 3206 else 3207 upper_bound = num_cookies; 3208 } 3209 // Success: the test did not crash. 3210} 3211 3212TEST_F(URLRequestTestHTTP, GetTest) { 3213 ASSERT_TRUE(test_server_.Start()); 3214 3215 TestDelegate d; 3216 { 3217 URLRequest r(test_server_.GetURL(std::string()), &d, &default_context_); 3218 3219 r.Start(); 3220 EXPECT_TRUE(r.is_pending()); 3221 3222 MessageLoop::current()->Run(); 3223 3224 EXPECT_EQ(1, d.response_started_count()); 3225 EXPECT_FALSE(d.received_data_before_response()); 3226 EXPECT_NE(0, d.bytes_received()); 3227 EXPECT_EQ(test_server_.host_port_pair().host(), 3228 r.GetSocketAddress().host()); 3229 EXPECT_EQ(test_server_.host_port_pair().port(), 3230 r.GetSocketAddress().port()); 3231 } 3232} 3233 3234TEST_F(URLRequestTestHTTP, GetTestLoadTiming) { 3235 ASSERT_TRUE(test_server_.Start()); 3236 3237 TestDelegate d; 3238 { 3239 URLRequest r(test_server_.GetURL(std::string()), &d, &default_context_); 3240 3241 r.Start(); 3242 EXPECT_TRUE(r.is_pending()); 3243 3244 MessageLoop::current()->Run(); 3245 3246 LoadTimingInfo load_timing_info; 3247 r.GetLoadTimingInfo(&load_timing_info); 3248 TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES); 3249 3250 EXPECT_EQ(1, d.response_started_count()); 3251 EXPECT_FALSE(d.received_data_before_response()); 3252 EXPECT_NE(0, d.bytes_received()); 3253 EXPECT_EQ(test_server_.host_port_pair().host(), 3254 r.GetSocketAddress().host()); 3255 EXPECT_EQ(test_server_.host_port_pair().port(), 3256 r.GetSocketAddress().port()); 3257 } 3258} 3259 3260TEST_F(URLRequestTestHTTP, GetZippedTest) { 3261 ASSERT_TRUE(test_server_.Start()); 3262 3263 // Parameter that specifies the Content-Length field in the response: 3264 // C - Compressed length. 3265 // U - Uncompressed length. 3266 // L - Large length (larger than both C & U). 3267 // M - Medium length (between C & U). 3268 // S - Small length (smaller than both C & U). 3269 const char test_parameters[] = "CULMS"; 3270 const int num_tests = arraysize(test_parameters)- 1; // Skip NULL. 3271 // C & U should be OK. 3272 // L & M are larger than the data sent, and show an error. 3273 // S has too little data, but we seem to accept it. 3274 const bool test_expect_success[num_tests] = 3275 { true, true, false, false, true }; 3276 3277 for (int i = 0; i < num_tests ; i++) { 3278 TestDelegate d; 3279 { 3280 std::string test_file = 3281 base::StringPrintf("compressedfiles/BullRunSpeech.txt?%c", 3282 test_parameters[i]); 3283 3284 TestNetworkDelegate network_delegate; // Must outlive URLRequest. 3285 TestURLRequestContext context(true); 3286 context.set_network_delegate(&network_delegate); 3287 context.Init(); 3288 3289 URLRequest r(test_server_.GetURL(test_file), &d, &context); 3290 r.Start(); 3291 EXPECT_TRUE(r.is_pending()); 3292 3293 MessageLoop::current()->Run(); 3294 3295 EXPECT_EQ(1, d.response_started_count()); 3296 EXPECT_FALSE(d.received_data_before_response()); 3297 VLOG(1) << " Received " << d.bytes_received() << " bytes" 3298 << " status = " << r.status().status() 3299 << " error = " << r.status().error(); 3300 if (test_expect_success[i]) { 3301 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()) 3302 << " Parameter = \"" << test_file << "\""; 3303 } else { 3304 EXPECT_EQ(URLRequestStatus::FAILED, r.status().status()); 3305 EXPECT_EQ(ERR_CONTENT_LENGTH_MISMATCH, r.status().error()) 3306 << " Parameter = \"" << test_file << "\""; 3307 } 3308 } 3309 } 3310} 3311 3312TEST_F(URLRequestTestHTTP, HTTPSToHTTPRedirectNoRefererTest) { 3313 ASSERT_TRUE(test_server_.Start()); 3314 3315 SpawnedTestServer https_test_server( 3316 SpawnedTestServer::TYPE_HTTPS, SpawnedTestServer::kLocalhost, 3317 base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 3318 ASSERT_TRUE(https_test_server.Start()); 3319 3320 // An https server is sent a request with an https referer, 3321 // and responds with a redirect to an http url. The http 3322 // server should not be sent the referer. 3323 GURL http_destination = test_server_.GetURL(std::string()); 3324 TestDelegate d; 3325 URLRequest req(https_test_server.GetURL( 3326 "server-redirect?" + http_destination.spec()), &d, &default_context_); 3327 req.SetReferrer("https://www.referrer.com/"); 3328 req.Start(); 3329 MessageLoop::current()->Run(); 3330 3331 EXPECT_EQ(1, d.response_started_count()); 3332 EXPECT_EQ(1, d.received_redirect_count()); 3333 EXPECT_EQ(http_destination, req.url()); 3334 EXPECT_EQ(std::string(), req.referrer()); 3335} 3336 3337TEST_F(URLRequestTestHTTP, RedirectLoadTiming) { 3338 ASSERT_TRUE(test_server_.Start()); 3339 3340 GURL destination_url = test_server_.GetURL(std::string()); 3341 GURL original_url = 3342 test_server_.GetURL("server-redirect?" + destination_url.spec()); 3343 TestDelegate d; 3344 URLRequest req(original_url, &d, &default_context_); 3345 req.Start(); 3346 MessageLoop::current()->Run(); 3347 3348 EXPECT_EQ(1, d.response_started_count()); 3349 EXPECT_EQ(1, d.received_redirect_count()); 3350 EXPECT_EQ(destination_url, req.url()); 3351 EXPECT_EQ(original_url, req.original_url()); 3352 ASSERT_EQ(2U, req.url_chain().size()); 3353 EXPECT_EQ(original_url, req.url_chain()[0]); 3354 EXPECT_EQ(destination_url, req.url_chain()[1]); 3355 3356 LoadTimingInfo load_timing_info_before_redirect; 3357 EXPECT_TRUE(default_network_delegate_.GetLoadTimingInfoBeforeRedirect( 3358 &load_timing_info_before_redirect)); 3359 TestLoadTimingNotReused(load_timing_info_before_redirect, 3360 CONNECT_TIMING_HAS_DNS_TIMES); 3361 3362 LoadTimingInfo load_timing_info; 3363 req.GetLoadTimingInfo(&load_timing_info); 3364 TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES); 3365 3366 // Check that a new socket was used on redirect, since the server does not 3367 // supposed keep-alive sockets, and that the times before the redirect are 3368 // before the ones recorded for the second request. 3369 EXPECT_NE(load_timing_info_before_redirect.socket_log_id, 3370 load_timing_info.socket_log_id); 3371 EXPECT_LE(load_timing_info_before_redirect.receive_headers_end, 3372 load_timing_info.connect_timing.connect_start); 3373} 3374 3375TEST_F(URLRequestTestHTTP, MultipleRedirectTest) { 3376 ASSERT_TRUE(test_server_.Start()); 3377 3378 GURL destination_url = test_server_.GetURL(std::string()); 3379 GURL middle_redirect_url = 3380 test_server_.GetURL("server-redirect?" + destination_url.spec()); 3381 GURL original_url = test_server_.GetURL( 3382 "server-redirect?" + middle_redirect_url.spec()); 3383 TestDelegate d; 3384 URLRequest req(original_url, &d, &default_context_); 3385 req.Start(); 3386 MessageLoop::current()->Run(); 3387 3388 EXPECT_EQ(1, d.response_started_count()); 3389 EXPECT_EQ(2, d.received_redirect_count()); 3390 EXPECT_EQ(destination_url, req.url()); 3391 EXPECT_EQ(original_url, req.original_url()); 3392 ASSERT_EQ(3U, req.url_chain().size()); 3393 EXPECT_EQ(original_url, req.url_chain()[0]); 3394 EXPECT_EQ(middle_redirect_url, req.url_chain()[1]); 3395 EXPECT_EQ(destination_url, req.url_chain()[2]); 3396} 3397 3398namespace { 3399 3400const char kExtraHeader[] = "Allow-Snafu"; 3401const char kExtraValue[] = "fubar"; 3402 3403class RedirectWithAdditionalHeadersDelegate : public TestDelegate { 3404 virtual void OnReceivedRedirect(net::URLRequest* request, 3405 const GURL& new_url, 3406 bool* defer_redirect) OVERRIDE { 3407 TestDelegate::OnReceivedRedirect(request, new_url, defer_redirect); 3408 request->SetExtraRequestHeaderByName(kExtraHeader, kExtraValue, false); 3409 } 3410}; 3411 3412} // namespace 3413 3414TEST_F(URLRequestTestHTTP, RedirectWithAdditionalHeadersTest) { 3415 ASSERT_TRUE(test_server_.Start()); 3416 3417 GURL destination_url = test_server_.GetURL( 3418 "echoheader?" + std::string(kExtraHeader)); 3419 GURL original_url = test_server_.GetURL( 3420 "server-redirect?" + destination_url.spec()); 3421 RedirectWithAdditionalHeadersDelegate d; 3422 URLRequest req(original_url, &d, &default_context_); 3423 req.Start(); 3424 MessageLoop::current()->Run(); 3425 3426 std::string value; 3427 const HttpRequestHeaders& headers = req.extra_request_headers(); 3428 EXPECT_TRUE(headers.GetHeader(kExtraHeader, &value)); 3429 EXPECT_EQ(kExtraValue, value); 3430 EXPECT_FALSE(req.is_pending()); 3431 EXPECT_FALSE(req.is_redirecting()); 3432 EXPECT_EQ(kExtraValue, d.data_received()); 3433} 3434 3435namespace { 3436 3437const char kExtraHeaderToRemove[] = "To-Be-Removed"; 3438 3439class RedirectWithHeaderRemovalDelegate : public TestDelegate { 3440 virtual void OnReceivedRedirect(net::URLRequest* request, 3441 const GURL& new_url, 3442 bool* defer_redirect) OVERRIDE { 3443 TestDelegate::OnReceivedRedirect(request, new_url, defer_redirect); 3444 request->RemoveRequestHeaderByName(kExtraHeaderToRemove); 3445 } 3446}; 3447 3448} // namespace 3449 3450TEST_F(URLRequestTestHTTP, RedirectWithHeaderRemovalTest) { 3451 ASSERT_TRUE(test_server_.Start()); 3452 3453 GURL destination_url = test_server_.GetURL( 3454 "echoheader?" + std::string(kExtraHeaderToRemove)); 3455 GURL original_url = test_server_.GetURL( 3456 "server-redirect?" + destination_url.spec()); 3457 RedirectWithHeaderRemovalDelegate d; 3458 URLRequest req(original_url, &d, &default_context_); 3459 req.SetExtraRequestHeaderByName(kExtraHeaderToRemove, "dummy", false); 3460 req.Start(); 3461 MessageLoop::current()->Run(); 3462 3463 std::string value; 3464 const HttpRequestHeaders& headers = req.extra_request_headers(); 3465 EXPECT_FALSE(headers.GetHeader(kExtraHeaderToRemove, &value)); 3466 EXPECT_FALSE(req.is_pending()); 3467 EXPECT_FALSE(req.is_redirecting()); 3468 EXPECT_EQ("None", d.data_received()); 3469} 3470 3471TEST_F(URLRequestTestHTTP, CancelTest) { 3472 TestDelegate d; 3473 { 3474 URLRequest r(GURL("http://www.google.com/"), &d, &default_context_); 3475 3476 r.Start(); 3477 EXPECT_TRUE(r.is_pending()); 3478 3479 r.Cancel(); 3480 3481 MessageLoop::current()->Run(); 3482 3483 // We expect to receive OnResponseStarted even though the request has been 3484 // cancelled. 3485 EXPECT_EQ(1, d.response_started_count()); 3486 EXPECT_EQ(0, d.bytes_received()); 3487 EXPECT_FALSE(d.received_data_before_response()); 3488 } 3489} 3490 3491TEST_F(URLRequestTestHTTP, CancelTest2) { 3492 ASSERT_TRUE(test_server_.Start()); 3493 3494 TestDelegate d; 3495 { 3496 URLRequest r(test_server_.GetURL(std::string()), &d, &default_context_); 3497 3498 d.set_cancel_in_response_started(true); 3499 3500 r.Start(); 3501 EXPECT_TRUE(r.is_pending()); 3502 3503 MessageLoop::current()->Run(); 3504 3505 EXPECT_EQ(1, d.response_started_count()); 3506 EXPECT_EQ(0, d.bytes_received()); 3507 EXPECT_FALSE(d.received_data_before_response()); 3508 EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status()); 3509 } 3510} 3511 3512TEST_F(URLRequestTestHTTP, CancelTest3) { 3513 ASSERT_TRUE(test_server_.Start()); 3514 3515 TestDelegate d; 3516 { 3517 URLRequest r(test_server_.GetURL(std::string()), &d, &default_context_); 3518 3519 d.set_cancel_in_received_data(true); 3520 3521 r.Start(); 3522 EXPECT_TRUE(r.is_pending()); 3523 3524 MessageLoop::current()->Run(); 3525 3526 EXPECT_EQ(1, d.response_started_count()); 3527 // There is no guarantee about how much data was received 3528 // before the cancel was issued. It could have been 0 bytes, 3529 // or it could have been all the bytes. 3530 // EXPECT_EQ(0, d.bytes_received()); 3531 EXPECT_FALSE(d.received_data_before_response()); 3532 EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status()); 3533 } 3534} 3535 3536TEST_F(URLRequestTestHTTP, CancelTest4) { 3537 ASSERT_TRUE(test_server_.Start()); 3538 3539 TestDelegate d; 3540 { 3541 URLRequest r(test_server_.GetURL(std::string()), &d, &default_context_); 3542 3543 r.Start(); 3544 EXPECT_TRUE(r.is_pending()); 3545 3546 // The request will be implicitly canceled when it is destroyed. The 3547 // test delegate must not post a quit message when this happens because 3548 // this test doesn't actually have a message loop. The quit message would 3549 // get put on this thread's message queue and the next test would exit 3550 // early, causing problems. 3551 d.set_quit_on_complete(false); 3552 } 3553 // expect things to just cleanup properly. 3554 3555 // we won't actually get a received reponse here because we've never run the 3556 // message loop 3557 EXPECT_FALSE(d.received_data_before_response()); 3558 EXPECT_EQ(0, d.bytes_received()); 3559} 3560 3561TEST_F(URLRequestTestHTTP, CancelTest5) { 3562 ASSERT_TRUE(test_server_.Start()); 3563 3564 // populate cache 3565 { 3566 TestDelegate d; 3567 URLRequest r(test_server_.GetURL("cachetime"), &d, &default_context_); 3568 r.Start(); 3569 MessageLoop::current()->Run(); 3570 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 3571 } 3572 3573 // cancel read from cache (see bug 990242) 3574 { 3575 TestDelegate d; 3576 URLRequest r(test_server_.GetURL("cachetime"), &d, &default_context_); 3577 r.Start(); 3578 r.Cancel(); 3579 MessageLoop::current()->Run(); 3580 3581 EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status()); 3582 EXPECT_EQ(1, d.response_started_count()); 3583 EXPECT_EQ(0, d.bytes_received()); 3584 EXPECT_FALSE(d.received_data_before_response()); 3585 } 3586} 3587 3588TEST_F(URLRequestTestHTTP, PostTest) { 3589 ASSERT_TRUE(test_server_.Start()); 3590 HTTPUploadDataOperationTest("POST"); 3591} 3592 3593TEST_F(URLRequestTestHTTP, PutTest) { 3594 ASSERT_TRUE(test_server_.Start()); 3595 HTTPUploadDataOperationTest("PUT"); 3596} 3597 3598TEST_F(URLRequestTestHTTP, PostEmptyTest) { 3599 ASSERT_TRUE(test_server_.Start()); 3600 3601 TestDelegate d; 3602 { 3603 URLRequest r(test_server_.GetURL("echo"), &d, &default_context_); 3604 r.set_method("POST"); 3605 3606 r.Start(); 3607 EXPECT_TRUE(r.is_pending()); 3608 3609 MessageLoop::current()->Run(); 3610 3611 ASSERT_EQ(1, d.response_started_count()) 3612 << "request failed: " << r.status().status() 3613 << ", error: " << r.status().error(); 3614 3615 EXPECT_FALSE(d.received_data_before_response()); 3616 EXPECT_TRUE(d.data_received().empty()); 3617 } 3618} 3619 3620TEST_F(URLRequestTestHTTP, PostFileTest) { 3621 ASSERT_TRUE(test_server_.Start()); 3622 3623 TestDelegate d; 3624 { 3625 URLRequest r(test_server_.GetURL("echo"), &d, &default_context_); 3626 r.set_method("POST"); 3627 3628 base::FilePath dir; 3629 PathService::Get(base::DIR_EXE, &dir); 3630 file_util::SetCurrentDirectory(dir); 3631 3632 ScopedVector<UploadElementReader> element_readers; 3633 3634 base::FilePath path; 3635 PathService::Get(base::DIR_SOURCE_ROOT, &path); 3636 path = path.Append(FILE_PATH_LITERAL("net")); 3637 path = path.Append(FILE_PATH_LITERAL("data")); 3638 path = path.Append(FILE_PATH_LITERAL("url_request_unittest")); 3639 path = path.Append(FILE_PATH_LITERAL("with-headers.html")); 3640 element_readers.push_back(new UploadFileElementReader( 3641 base::MessageLoopProxy::current(), path, 0, kuint64max, base::Time())); 3642 3643 // This file should just be ignored in the upload stream. 3644 element_readers.push_back(new UploadFileElementReader( 3645 base::MessageLoopProxy::current(), 3646 base::FilePath(FILE_PATH_LITERAL( 3647 "c:\\path\\to\\non\\existant\\file.randomness.12345")), 3648 0, kuint64max, base::Time())); 3649 r.set_upload(make_scoped_ptr(new UploadDataStream(&element_readers, 0))); 3650 3651 r.Start(); 3652 EXPECT_TRUE(r.is_pending()); 3653 3654 MessageLoop::current()->Run(); 3655 3656 int64 size = 0; 3657 ASSERT_EQ(true, file_util::GetFileSize(path, &size)); 3658 scoped_ptr<char[]> buf(new char[size]); 3659 3660 ASSERT_EQ(size, file_util::ReadFile(path, buf.get(), size)); 3661 3662 ASSERT_EQ(1, d.response_started_count()) 3663 << "request failed: " << r.status().status() 3664 << ", error: " << r.status().error(); 3665 3666 EXPECT_FALSE(d.received_data_before_response()); 3667 3668 EXPECT_EQ(size, d.bytes_received()); 3669 EXPECT_EQ(std::string(&buf[0], size), d.data_received()); 3670 } 3671} 3672 3673TEST_F(URLRequestTestHTTP, TestPostChunkedDataBeforeStart) { 3674 ASSERT_TRUE(test_server_.Start()); 3675 3676 TestDelegate d; 3677 { 3678 URLRequest r(test_server_.GetURL("echo"), &d, &default_context_); 3679 r.EnableChunkedUpload(); 3680 r.set_method("POST"); 3681 AddChunksToUpload(&r); 3682 r.Start(); 3683 EXPECT_TRUE(r.is_pending()); 3684 3685 MessageLoop::current()->Run(); 3686 3687 VerifyReceivedDataMatchesChunks(&r, &d); 3688 } 3689} 3690 3691TEST_F(URLRequestTestHTTP, TestPostChunkedDataJustAfterStart) { 3692 ASSERT_TRUE(test_server_.Start()); 3693 3694 TestDelegate d; 3695 { 3696 URLRequest r(test_server_.GetURL("echo"), &d, &default_context_); 3697 r.EnableChunkedUpload(); 3698 r.set_method("POST"); 3699 r.Start(); 3700 EXPECT_TRUE(r.is_pending()); 3701 AddChunksToUpload(&r); 3702 MessageLoop::current()->Run(); 3703 3704 VerifyReceivedDataMatchesChunks(&r, &d); 3705 } 3706} 3707 3708TEST_F(URLRequestTestHTTP, TestPostChunkedDataAfterStart) { 3709 ASSERT_TRUE(test_server_.Start()); 3710 3711 TestDelegate d; 3712 { 3713 URLRequest r(test_server_.GetURL("echo"), &d, &default_context_); 3714 r.EnableChunkedUpload(); 3715 r.set_method("POST"); 3716 r.Start(); 3717 EXPECT_TRUE(r.is_pending()); 3718 3719 MessageLoop::current()->RunUntilIdle(); 3720 AddChunksToUpload(&r); 3721 MessageLoop::current()->Run(); 3722 3723 VerifyReceivedDataMatchesChunks(&r, &d); 3724 } 3725} 3726 3727TEST_F(URLRequestTestHTTP, ResponseHeadersTest) { 3728 ASSERT_TRUE(test_server_.Start()); 3729 3730 TestDelegate d; 3731 URLRequest req( 3732 test_server_.GetURL("files/with-headers.html"), &d, &default_context_); 3733 req.Start(); 3734 MessageLoop::current()->Run(); 3735 3736 const HttpResponseHeaders* headers = req.response_headers(); 3737 3738 // Simple sanity check that response_info() accesses the same data. 3739 EXPECT_EQ(headers, req.response_info().headers.get()); 3740 3741 std::string header; 3742 EXPECT_TRUE(headers->GetNormalizedHeader("cache-control", &header)); 3743 EXPECT_EQ("private", header); 3744 3745 header.clear(); 3746 EXPECT_TRUE(headers->GetNormalizedHeader("content-type", &header)); 3747 EXPECT_EQ("text/html; charset=ISO-8859-1", header); 3748 3749 // The response has two "X-Multiple-Entries" headers. 3750 // This verfies our output has them concatenated together. 3751 header.clear(); 3752 EXPECT_TRUE(headers->GetNormalizedHeader("x-multiple-entries", &header)); 3753 EXPECT_EQ("a, b", header); 3754} 3755 3756TEST_F(URLRequestTestHTTP, ProcessSTS) { 3757 SpawnedTestServer::SSLOptions ssl_options; 3758 SpawnedTestServer https_test_server( 3759 SpawnedTestServer::TYPE_HTTPS, 3760 ssl_options, 3761 base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest"))); 3762 ASSERT_TRUE(https_test_server.Start()); 3763 3764 TestDelegate d; 3765 URLRequest request( 3766 https_test_server.GetURL("files/hsts-headers.html"), 3767 &d, 3768 &default_context_); 3769 request.Start(); 3770 MessageLoop::current()->Run(); 3771 3772 TransportSecurityState* security_state = 3773 default_context_.transport_security_state(); 3774 bool sni_available = true; 3775 TransportSecurityState::DomainState domain_state; 3776 EXPECT_TRUE(security_state->GetDomainState( 3777 SpawnedTestServer::kLocalhost, sni_available, &domain_state)); 3778 EXPECT_EQ(TransportSecurityState::DomainState::MODE_FORCE_HTTPS, 3779 domain_state.upgrade_mode); 3780 EXPECT_TRUE(domain_state.include_subdomains); 3781} 3782 3783TEST_F(URLRequestTestHTTP, ProcessSTSOnce) { 3784 SpawnedTestServer::SSLOptions ssl_options; 3785 SpawnedTestServer https_test_server( 3786 SpawnedTestServer::TYPE_HTTPS, 3787 ssl_options, 3788 base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest"))); 3789 ASSERT_TRUE(https_test_server.Start()); 3790 3791 TestDelegate d; 3792 URLRequest request( 3793 https_test_server.GetURL("files/hsts-multiple-headers.html"), 3794 &d, 3795 &default_context_); 3796 request.Start(); 3797 MessageLoop::current()->Run(); 3798 3799 // We should have set parameters from the first header, not the second. 3800 TransportSecurityState* security_state = 3801 default_context_.transport_security_state(); 3802 bool sni_available = true; 3803 TransportSecurityState::DomainState domain_state; 3804 EXPECT_TRUE(security_state->GetDomainState( 3805 SpawnedTestServer::kLocalhost, sni_available, &domain_state)); 3806 EXPECT_EQ(TransportSecurityState::DomainState::MODE_FORCE_HTTPS, 3807 domain_state.upgrade_mode); 3808 EXPECT_FALSE(domain_state.include_subdomains); 3809} 3810 3811TEST_F(URLRequestTestHTTP, ProcessSTSAndPKP) { 3812 SpawnedTestServer::SSLOptions ssl_options; 3813 SpawnedTestServer https_test_server( 3814 SpawnedTestServer::TYPE_HTTPS, 3815 ssl_options, 3816 base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest"))); 3817 ASSERT_TRUE(https_test_server.Start()); 3818 3819 TestDelegate d; 3820 URLRequest request( 3821 https_test_server.GetURL("files/hsts-and-hpkp-headers.html"), 3822 &d, 3823 &default_context_); 3824 request.Start(); 3825 MessageLoop::current()->Run(); 3826 3827 // We should have set parameters from the first header, not the second. 3828 TransportSecurityState* security_state = 3829 default_context_.transport_security_state(); 3830 bool sni_available = true; 3831 TransportSecurityState::DomainState domain_state; 3832 EXPECT_TRUE(security_state->GetDomainState( 3833 SpawnedTestServer::kLocalhost, sni_available, &domain_state)); 3834 EXPECT_EQ(TransportSecurityState::DomainState::MODE_FORCE_HTTPS, 3835 domain_state.upgrade_mode); 3836#if defined(OS_ANDROID) 3837 // Android's CertVerifyProc does not (yet) handle pins. 3838#else 3839 EXPECT_TRUE(domain_state.HasPublicKeyPins()); 3840#endif 3841 EXPECT_NE(domain_state.upgrade_expiry, 3842 domain_state.dynamic_spki_hashes_expiry); 3843 3844 // TODO(palmer): In the (near) future, TransportSecurityState will have a 3845 // storage model allowing us to have independent values for 3846 // include_subdomains. At that time, extend this test. 3847 //EXPECT_FALSE(domain_state.include_subdomains); 3848} 3849 3850TEST_F(URLRequestTestHTTP, ContentTypeNormalizationTest) { 3851 ASSERT_TRUE(test_server_.Start()); 3852 3853 TestDelegate d; 3854 URLRequest req(test_server_.GetURL( 3855 "files/content-type-normalization.html"), &d, &default_context_); 3856 req.Start(); 3857 MessageLoop::current()->Run(); 3858 3859 std::string mime_type; 3860 req.GetMimeType(&mime_type); 3861 EXPECT_EQ("text/html", mime_type); 3862 3863 std::string charset; 3864 req.GetCharset(&charset); 3865 EXPECT_EQ("utf-8", charset); 3866 req.Cancel(); 3867} 3868 3869TEST_F(URLRequestTestHTTP, ProtocolHandlerAndFactoryRestrictRedirects) { 3870 // Test URLRequestJobFactory::ProtocolHandler::IsSafeRedirectTarget(). 3871 GURL file_url("file:///foo.txt"); 3872 GURL data_url("data:,foo"); 3873 FileProtocolHandler file_protocol_handler; 3874 EXPECT_FALSE(file_protocol_handler.IsSafeRedirectTarget(file_url)); 3875 DataProtocolHandler data_protocol_handler; 3876 EXPECT_TRUE(data_protocol_handler.IsSafeRedirectTarget(data_url)); 3877 3878 // Test URLRequestJobFactoryImpl::IsSafeRedirectTarget(). 3879 EXPECT_FALSE(job_factory_.IsSafeRedirectTarget(file_url)); 3880 EXPECT_TRUE(job_factory_.IsSafeRedirectTarget(data_url)); 3881} 3882 3883TEST_F(URLRequestTestHTTP, RestrictRedirects) { 3884 ASSERT_TRUE(test_server_.Start()); 3885 3886 TestDelegate d; 3887 URLRequest req(test_server_.GetURL( 3888 "files/redirect-to-file.html"), &d, &default_context_); 3889 req.Start(); 3890 MessageLoop::current()->Run(); 3891 3892 EXPECT_EQ(URLRequestStatus::FAILED, req.status().status()); 3893 EXPECT_EQ(ERR_UNSAFE_REDIRECT, req.status().error()); 3894} 3895 3896TEST_F(URLRequestTestHTTP, RedirectToInvalidURL) { 3897 ASSERT_TRUE(test_server_.Start()); 3898 3899 TestDelegate d; 3900 URLRequest req(test_server_.GetURL( 3901 "files/redirect-to-invalid-url.html"), &d, &default_context_); 3902 req.Start(); 3903 MessageLoop::current()->Run(); 3904 3905 EXPECT_EQ(URLRequestStatus::FAILED, req.status().status()); 3906 EXPECT_EQ(ERR_INVALID_URL, req.status().error()); 3907} 3908 3909TEST_F(URLRequestTestHTTP, NoUserPassInReferrer) { 3910 ASSERT_TRUE(test_server_.Start()); 3911 3912 TestDelegate d; 3913 URLRequest req( 3914 test_server_.GetURL("echoheader?Referer"), &d, &default_context_); 3915 req.SetReferrer("http://user:pass@foo.com/"); 3916 req.Start(); 3917 MessageLoop::current()->Run(); 3918 3919 EXPECT_EQ(std::string("http://foo.com/"), d.data_received()); 3920} 3921 3922TEST_F(URLRequestTestHTTP, NoFragmentInReferrer) { 3923 ASSERT_TRUE(test_server_.Start()); 3924 3925 TestDelegate d; 3926 URLRequest req( 3927 test_server_.GetURL("echoheader?Referer"), &d, &default_context_); 3928 req.SetReferrer("http://foo.com/test#fragment"); 3929 req.Start(); 3930 MessageLoop::current()->Run(); 3931 3932 EXPECT_EQ(std::string("http://foo.com/test"), d.data_received()); 3933} 3934 3935TEST_F(URLRequestTestHTTP, EmptyReferrerAfterValidReferrer) { 3936 ASSERT_TRUE(test_server_.Start()); 3937 3938 TestDelegate d; 3939 URLRequest req( 3940 test_server_.GetURL("echoheader?Referer"), &d, &default_context_); 3941 req.SetReferrer("http://foo.com/test#fragment"); 3942 req.SetReferrer(""); 3943 req.Start(); 3944 MessageLoop::current()->Run(); 3945 3946 EXPECT_EQ(std::string("None"), d.data_received()); 3947} 3948 3949TEST_F(URLRequestTestHTTP, CancelRedirect) { 3950 ASSERT_TRUE(test_server_.Start()); 3951 3952 TestDelegate d; 3953 { 3954 d.set_cancel_in_received_redirect(true); 3955 URLRequest req( 3956 test_server_.GetURL("files/redirect-test.html"), &d, &default_context_); 3957 req.Start(); 3958 MessageLoop::current()->Run(); 3959 3960 EXPECT_EQ(1, d.response_started_count()); 3961 EXPECT_EQ(0, d.bytes_received()); 3962 EXPECT_FALSE(d.received_data_before_response()); 3963 EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status()); 3964 } 3965} 3966 3967TEST_F(URLRequestTestHTTP, DeferredRedirect) { 3968 ASSERT_TRUE(test_server_.Start()); 3969 3970 TestDelegate d; 3971 { 3972 d.set_quit_on_redirect(true); 3973 URLRequest req( 3974 test_server_.GetURL("files/redirect-test.html"), &d, &default_context_); 3975 req.Start(); 3976 MessageLoop::current()->Run(); 3977 3978 EXPECT_EQ(1, d.received_redirect_count()); 3979 3980 req.FollowDeferredRedirect(); 3981 MessageLoop::current()->Run(); 3982 3983 EXPECT_EQ(1, d.response_started_count()); 3984 EXPECT_FALSE(d.received_data_before_response()); 3985 EXPECT_EQ(URLRequestStatus::SUCCESS, req.status().status()); 3986 3987 base::FilePath path; 3988 PathService::Get(base::DIR_SOURCE_ROOT, &path); 3989 path = path.Append(FILE_PATH_LITERAL("net")); 3990 path = path.Append(FILE_PATH_LITERAL("data")); 3991 path = path.Append(FILE_PATH_LITERAL("url_request_unittest")); 3992 path = path.Append(FILE_PATH_LITERAL("with-headers.html")); 3993 3994 std::string contents; 3995 EXPECT_TRUE(file_util::ReadFileToString(path, &contents)); 3996 EXPECT_EQ(contents, d.data_received()); 3997 } 3998} 3999 4000TEST_F(URLRequestTestHTTP, CancelDeferredRedirect) { 4001 ASSERT_TRUE(test_server_.Start()); 4002 4003 TestDelegate d; 4004 { 4005 d.set_quit_on_redirect(true); 4006 URLRequest req( 4007 test_server_.GetURL("files/redirect-test.html"), &d, &default_context_); 4008 req.Start(); 4009 MessageLoop::current()->Run(); 4010 4011 EXPECT_EQ(1, d.received_redirect_count()); 4012 4013 req.Cancel(); 4014 MessageLoop::current()->Run(); 4015 4016 EXPECT_EQ(1, d.response_started_count()); 4017 EXPECT_EQ(0, d.bytes_received()); 4018 EXPECT_FALSE(d.received_data_before_response()); 4019 EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status()); 4020 } 4021} 4022 4023TEST_F(URLRequestTestHTTP, VaryHeader) { 4024 ASSERT_TRUE(test_server_.Start()); 4025 4026 // populate the cache 4027 { 4028 TestDelegate d; 4029 URLRequest req( 4030 test_server_.GetURL("echoheadercache?foo"), &d, &default_context_); 4031 HttpRequestHeaders headers; 4032 headers.SetHeader("foo", "1"); 4033 req.SetExtraRequestHeaders(headers); 4034 req.Start(); 4035 MessageLoop::current()->Run(); 4036 } 4037 4038 // expect a cache hit 4039 { 4040 TestDelegate d; 4041 URLRequest req( 4042 test_server_.GetURL("echoheadercache?foo"), &d, &default_context_); 4043 HttpRequestHeaders headers; 4044 headers.SetHeader("foo", "1"); 4045 req.SetExtraRequestHeaders(headers); 4046 req.Start(); 4047 MessageLoop::current()->Run(); 4048 4049 EXPECT_TRUE(req.was_cached()); 4050 } 4051 4052 // expect a cache miss 4053 { 4054 TestDelegate d; 4055 URLRequest req( 4056 test_server_.GetURL("echoheadercache?foo"), &d, &default_context_); 4057 HttpRequestHeaders headers; 4058 headers.SetHeader("foo", "2"); 4059 req.SetExtraRequestHeaders(headers); 4060 req.Start(); 4061 MessageLoop::current()->Run(); 4062 4063 EXPECT_FALSE(req.was_cached()); 4064 } 4065} 4066 4067TEST_F(URLRequestTestHTTP, BasicAuth) { 4068 ASSERT_TRUE(test_server_.Start()); 4069 4070 // populate the cache 4071 { 4072 TestDelegate d; 4073 d.set_credentials(AuthCredentials(kUser, kSecret)); 4074 4075 URLRequest r(test_server_.GetURL("auth-basic"), &d, &default_context_); 4076 r.Start(); 4077 4078 MessageLoop::current()->Run(); 4079 4080 EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos); 4081 } 4082 4083 // repeat request with end-to-end validation. since auth-basic results in a 4084 // cachable page, we expect this test to result in a 304. in which case, the 4085 // response should be fetched from the cache. 4086 { 4087 TestDelegate d; 4088 d.set_credentials(AuthCredentials(kUser, kSecret)); 4089 4090 URLRequest r(test_server_.GetURL("auth-basic"), &d, &default_context_); 4091 r.set_load_flags(LOAD_VALIDATE_CACHE); 4092 r.Start(); 4093 4094 MessageLoop::current()->Run(); 4095 4096 EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos); 4097 4098 // Should be the same cached document. 4099 EXPECT_TRUE(r.was_cached()); 4100 } 4101} 4102 4103// Check that Set-Cookie headers in 401 responses are respected. 4104// http://crbug.com/6450 4105TEST_F(URLRequestTestHTTP, BasicAuthWithCookies) { 4106 ASSERT_TRUE(test_server_.Start()); 4107 4108 GURL url_requiring_auth = 4109 test_server_.GetURL("auth-basic?set-cookie-if-challenged"); 4110 4111 // Request a page that will give a 401 containing a Set-Cookie header. 4112 // Verify that when the transaction is restarted, it includes the new cookie. 4113 { 4114 TestNetworkDelegate network_delegate; // Must outlive URLRequest. 4115 TestURLRequestContext context(true); 4116 context.set_network_delegate(&network_delegate); 4117 context.Init(); 4118 4119 TestDelegate d; 4120 d.set_credentials(AuthCredentials(kUser, kSecret)); 4121 4122 URLRequest r(url_requiring_auth, &d, &context); 4123 r.Start(); 4124 4125 MessageLoop::current()->Run(); 4126 4127 EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos); 4128 4129 // Make sure we sent the cookie in the restarted transaction. 4130 EXPECT_TRUE(d.data_received().find("Cookie: got_challenged=true") 4131 != std::string::npos); 4132 } 4133 4134 // Same test as above, except this time the restart is initiated earlier 4135 // (without user intervention since identity is embedded in the URL). 4136 { 4137 TestNetworkDelegate network_delegate; // Must outlive URLRequest. 4138 TestURLRequestContext context(true); 4139 context.set_network_delegate(&network_delegate); 4140 context.Init(); 4141 4142 TestDelegate d; 4143 4144 GURL::Replacements replacements; 4145 std::string username("user2"); 4146 std::string password("secret"); 4147 replacements.SetUsernameStr(username); 4148 replacements.SetPasswordStr(password); 4149 GURL url_with_identity = url_requiring_auth.ReplaceComponents(replacements); 4150 4151 URLRequest r(url_with_identity, &d, &context); 4152 r.Start(); 4153 4154 MessageLoop::current()->Run(); 4155 4156 EXPECT_TRUE(d.data_received().find("user2/secret") != std::string::npos); 4157 4158 // Make sure we sent the cookie in the restarted transaction. 4159 EXPECT_TRUE(d.data_received().find("Cookie: got_challenged=true") 4160 != std::string::npos); 4161 } 4162} 4163 4164// Tests that load timing works as expected with auth and the cache. 4165TEST_F(URLRequestTestHTTP, BasicAuthLoadTiming) { 4166 ASSERT_TRUE(test_server_.Start()); 4167 4168 // populate the cache 4169 { 4170 TestDelegate d; 4171 d.set_credentials(AuthCredentials(kUser, kSecret)); 4172 4173 URLRequest r(test_server_.GetURL("auth-basic"), &d, &default_context_); 4174 r.Start(); 4175 4176 MessageLoop::current()->Run(); 4177 4178 EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos); 4179 4180 LoadTimingInfo load_timing_info_before_auth; 4181 EXPECT_TRUE(default_network_delegate_.GetLoadTimingInfoBeforeAuth( 4182 &load_timing_info_before_auth)); 4183 TestLoadTimingNotReused(load_timing_info_before_auth, 4184 CONNECT_TIMING_HAS_DNS_TIMES); 4185 4186 LoadTimingInfo load_timing_info; 4187 r.GetLoadTimingInfo(&load_timing_info); 4188 // The test server does not support keep alive sockets, so the second 4189 // request with auth should use a new socket. 4190 TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES); 4191 EXPECT_NE(load_timing_info_before_auth.socket_log_id, 4192 load_timing_info.socket_log_id); 4193 EXPECT_LE(load_timing_info_before_auth.receive_headers_end, 4194 load_timing_info.connect_timing.connect_start); 4195 } 4196 4197 // repeat request with end-to-end validation. since auth-basic results in a 4198 // cachable page, we expect this test to result in a 304. in which case, the 4199 // response should be fetched from the cache. 4200 { 4201 TestDelegate d; 4202 d.set_credentials(AuthCredentials(kUser, kSecret)); 4203 4204 URLRequest r(test_server_.GetURL("auth-basic"), &d, &default_context_); 4205 r.set_load_flags(LOAD_VALIDATE_CACHE); 4206 r.Start(); 4207 4208 MessageLoop::current()->Run(); 4209 4210 EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos); 4211 4212 // Should be the same cached document. 4213 EXPECT_TRUE(r.was_cached()); 4214 4215 LoadTimingInfo load_timing_info; 4216 r.GetLoadTimingInfo(&load_timing_info); 4217 TestLoadTimingNoHttpConnection(load_timing_info); 4218 } 4219} 4220 4221// In this test, we do a POST which the server will 302 redirect. 4222// The subsequent transaction should use GET, and should not send the 4223// Content-Type header. 4224// http://code.google.com/p/chromium/issues/detail?id=843 4225TEST_F(URLRequestTestHTTP, Post302RedirectGet) { 4226 ASSERT_TRUE(test_server_.Start()); 4227 4228 const char kData[] = "hello world"; 4229 4230 TestDelegate d; 4231 URLRequest req( 4232 test_server_.GetURL("files/redirect-to-echoall"), &d, &default_context_); 4233 req.set_method("POST"); 4234 req.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData))); 4235 4236 // Set headers (some of which are specific to the POST). 4237 HttpRequestHeaders headers; 4238 headers.AddHeadersFromString( 4239 "Content-Type: multipart/form-data; " 4240 "boundary=----WebKitFormBoundaryAADeAA+NAAWMAAwZ\r\n" 4241 "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9," 4242 "text/plain;q=0.8,image/png,*/*;q=0.5\r\n" 4243 "Accept-Language: en-US,en\r\n" 4244 "Accept-Charset: ISO-8859-1,*,utf-8\r\n" 4245 "Content-Length: 11\r\n" 4246 "Origin: http://localhost:1337/"); 4247 req.SetExtraRequestHeaders(headers); 4248 req.Start(); 4249 MessageLoop::current()->Run(); 4250 4251 std::string mime_type; 4252 req.GetMimeType(&mime_type); 4253 EXPECT_EQ("text/html", mime_type); 4254 4255 const std::string& data = d.data_received(); 4256 4257 // Check that the post-specific headers were stripped: 4258 EXPECT_FALSE(ContainsString(data, "Content-Length:")); 4259 EXPECT_FALSE(ContainsString(data, "Content-Type:")); 4260 EXPECT_FALSE(ContainsString(data, "Origin:")); 4261 4262 // These extra request headers should not have been stripped. 4263 EXPECT_TRUE(ContainsString(data, "Accept:")); 4264 EXPECT_TRUE(ContainsString(data, "Accept-Language:")); 4265 EXPECT_TRUE(ContainsString(data, "Accept-Charset:")); 4266} 4267 4268// The following tests check that we handle mutating the request method for 4269// HTTP redirects as expected. 4270// See http://crbug.com/56373 and http://crbug.com/102130. 4271 4272TEST_F(URLRequestTestHTTP, Redirect301Tests) { 4273 ASSERT_TRUE(test_server_.Start()); 4274 4275 const GURL url = test_server_.GetURL("files/redirect301-to-echo"); 4276 4277 HTTPRedirectMethodTest(url, "POST", "GET", true); 4278 HTTPRedirectMethodTest(url, "PUT", "PUT", true); 4279 HTTPRedirectMethodTest(url, "HEAD", "HEAD", false); 4280} 4281 4282TEST_F(URLRequestTestHTTP, Redirect302Tests) { 4283 ASSERT_TRUE(test_server_.Start()); 4284 4285 const GURL url = test_server_.GetURL("files/redirect302-to-echo"); 4286 4287 HTTPRedirectMethodTest(url, "POST", "GET", true); 4288 HTTPRedirectMethodTest(url, "PUT", "PUT", true); 4289 HTTPRedirectMethodTest(url, "HEAD", "HEAD", false); 4290} 4291 4292TEST_F(URLRequestTestHTTP, Redirect303Tests) { 4293 ASSERT_TRUE(test_server_.Start()); 4294 4295 const GURL url = test_server_.GetURL("files/redirect303-to-echo"); 4296 4297 HTTPRedirectMethodTest(url, "POST", "GET", true); 4298 HTTPRedirectMethodTest(url, "PUT", "GET", true); 4299 HTTPRedirectMethodTest(url, "HEAD", "HEAD", false); 4300} 4301 4302TEST_F(URLRequestTestHTTP, Redirect307Tests) { 4303 ASSERT_TRUE(test_server_.Start()); 4304 4305 const GURL url = test_server_.GetURL("files/redirect307-to-echo"); 4306 4307 HTTPRedirectMethodTest(url, "POST", "POST", true); 4308 HTTPRedirectMethodTest(url, "PUT", "PUT", true); 4309 HTTPRedirectMethodTest(url, "HEAD", "HEAD", false); 4310} 4311 4312TEST_F(URLRequestTestHTTP, InterceptPost302RedirectGet) { 4313 ASSERT_TRUE(test_server_.Start()); 4314 4315 const char kData[] = "hello world"; 4316 4317 TestDelegate d; 4318 URLRequest req(test_server_.GetURL("empty.html"), &d, &default_context_); 4319 req.set_method("POST"); 4320 req.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData))); 4321 HttpRequestHeaders headers; 4322 headers.SetHeader(HttpRequestHeaders::kContentLength, 4323 base::UintToString(arraysize(kData) - 1)); 4324 req.SetExtraRequestHeaders(headers); 4325 4326 URLRequestRedirectJob* job = new URLRequestRedirectJob( 4327 &req, &default_network_delegate_, test_server_.GetURL("echo"), 4328 URLRequestRedirectJob::REDIRECT_302_FOUND); 4329 AddTestInterceptor()->set_main_intercept_job(job); 4330 4331 req.Start(); 4332 MessageLoop::current()->Run(); 4333 EXPECT_EQ("GET", req.method()); 4334} 4335 4336TEST_F(URLRequestTestHTTP, InterceptPost307RedirectPost) { 4337 ASSERT_TRUE(test_server_.Start()); 4338 4339 const char kData[] = "hello world"; 4340 4341 TestDelegate d; 4342 URLRequest req(test_server_.GetURL("empty.html"), &d, &default_context_); 4343 req.set_method("POST"); 4344 req.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData))); 4345 HttpRequestHeaders headers; 4346 headers.SetHeader(HttpRequestHeaders::kContentLength, 4347 base::UintToString(arraysize(kData) - 1)); 4348 req.SetExtraRequestHeaders(headers); 4349 4350 URLRequestRedirectJob* job = new URLRequestRedirectJob( 4351 &req, &default_network_delegate_, test_server_.GetURL("echo"), 4352 URLRequestRedirectJob::REDIRECT_307_TEMPORARY_REDIRECT); 4353 AddTestInterceptor()->set_main_intercept_job(job); 4354 4355 req.Start(); 4356 MessageLoop::current()->Run(); 4357 EXPECT_EQ("POST", req.method()); 4358 EXPECT_EQ(kData, d.data_received()); 4359} 4360 4361// Check that default A-L header is sent. 4362TEST_F(URLRequestTestHTTP, DefaultAcceptLanguage) { 4363 ASSERT_TRUE(test_server_.Start()); 4364 4365 StaticHttpUserAgentSettings settings("en", EmptyString()); 4366 TestNetworkDelegate network_delegate; // Must outlive URLRequests. 4367 TestURLRequestContext context(true); 4368 context.set_network_delegate(&network_delegate); 4369 context.set_http_user_agent_settings(&settings); 4370 context.Init(); 4371 4372 TestDelegate d; 4373 URLRequest req( 4374 test_server_.GetURL("echoheader?Accept-Language"), &d, &context); 4375 req.Start(); 4376 MessageLoop::current()->Run(); 4377 EXPECT_EQ("en", d.data_received()); 4378} 4379 4380// Check that an empty A-L header is not sent. http://crbug.com/77365. 4381TEST_F(URLRequestTestHTTP, EmptyAcceptLanguage) { 4382 ASSERT_TRUE(test_server_.Start()); 4383 4384 StaticHttpUserAgentSettings settings(EmptyString(), EmptyString()); 4385 TestNetworkDelegate network_delegate; // Must outlive URLRequests. 4386 TestURLRequestContext context(true); 4387 context.set_network_delegate(&network_delegate); 4388 context.Init(); 4389 // We override the language after initialization because empty entries 4390 // get overridden by Init(). 4391 context.set_http_user_agent_settings(&settings); 4392 4393 TestDelegate d; 4394 URLRequest req( 4395 test_server_.GetURL("echoheader?Accept-Language"), &d, &context); 4396 req.Start(); 4397 MessageLoop::current()->Run(); 4398 EXPECT_EQ("None", d.data_received()); 4399} 4400 4401// Check that if request overrides the A-L header, the default is not appended. 4402// See http://crbug.com/20894 4403TEST_F(URLRequestTestHTTP, OverrideAcceptLanguage) { 4404 ASSERT_TRUE(test_server_.Start()); 4405 4406 TestDelegate d; 4407 URLRequest req(test_server_.GetURL("echoheader?Accept-Language"), 4408 &d, 4409 &default_context_); 4410 HttpRequestHeaders headers; 4411 headers.SetHeader(HttpRequestHeaders::kAcceptLanguage, "ru"); 4412 req.SetExtraRequestHeaders(headers); 4413 req.Start(); 4414 MessageLoop::current()->Run(); 4415 EXPECT_EQ(std::string("ru"), d.data_received()); 4416} 4417 4418// Check that default A-E header is sent. 4419TEST_F(URLRequestTestHTTP, DefaultAcceptEncoding) { 4420 ASSERT_TRUE(test_server_.Start()); 4421 4422 TestDelegate d; 4423 URLRequest req(test_server_.GetURL("echoheader?Accept-Encoding"), 4424 &d, 4425 &default_context_); 4426 HttpRequestHeaders headers; 4427 req.SetExtraRequestHeaders(headers); 4428 req.Start(); 4429 MessageLoop::current()->Run(); 4430 EXPECT_TRUE(ContainsString(d.data_received(), "gzip")); 4431} 4432 4433// Check that if request overrides the A-E header, the default is not appended. 4434// See http://crbug.com/47381 4435TEST_F(URLRequestTestHTTP, OverrideAcceptEncoding) { 4436 ASSERT_TRUE(test_server_.Start()); 4437 4438 TestDelegate d; 4439 URLRequest req(test_server_.GetURL("echoheader?Accept-Encoding"), 4440 &d, 4441 &default_context_); 4442 HttpRequestHeaders headers; 4443 headers.SetHeader(HttpRequestHeaders::kAcceptEncoding, "identity"); 4444 req.SetExtraRequestHeaders(headers); 4445 req.Start(); 4446 MessageLoop::current()->Run(); 4447 EXPECT_FALSE(ContainsString(d.data_received(), "gzip")); 4448 EXPECT_TRUE(ContainsString(d.data_received(), "identity")); 4449} 4450 4451// Check that setting the A-C header sends the proper header. 4452TEST_F(URLRequestTestHTTP, SetAcceptCharset) { 4453 ASSERT_TRUE(test_server_.Start()); 4454 4455 TestDelegate d; 4456 URLRequest req(test_server_.GetURL("echoheader?Accept-Charset"), 4457 &d, 4458 &default_context_); 4459 HttpRequestHeaders headers; 4460 headers.SetHeader(HttpRequestHeaders::kAcceptCharset, "koi-8r"); 4461 req.SetExtraRequestHeaders(headers); 4462 req.Start(); 4463 MessageLoop::current()->Run(); 4464 EXPECT_EQ(std::string("koi-8r"), d.data_received()); 4465} 4466 4467// Check that default User-Agent header is sent. 4468TEST_F(URLRequestTestHTTP, DefaultUserAgent) { 4469 ASSERT_TRUE(test_server_.Start()); 4470 4471 TestDelegate d; 4472 URLRequest req(test_server_.GetURL("echoheader?User-Agent"), 4473 &d, 4474 &default_context_); 4475 req.Start(); 4476 MessageLoop::current()->Run(); 4477 EXPECT_EQ(req.context()->GetUserAgent(req.url()), d.data_received()); 4478} 4479 4480// Check that if request overrides the User-Agent header, 4481// the default is not appended. 4482TEST_F(URLRequestTestHTTP, OverrideUserAgent) { 4483 ASSERT_TRUE(test_server_.Start()); 4484 4485 TestDelegate d; 4486 URLRequest req(test_server_.GetURL("echoheader?User-Agent"), 4487 &d, 4488 &default_context_); 4489 HttpRequestHeaders headers; 4490 headers.SetHeader(HttpRequestHeaders::kUserAgent, "Lynx (textmode)"); 4491 req.SetExtraRequestHeaders(headers); 4492 req.Start(); 4493 MessageLoop::current()->Run(); 4494 // If the net tests are being run with ChromeFrame then we need to allow for 4495 // the 'chromeframe' suffix which is added to the user agent before the 4496 // closing parentheses. 4497 EXPECT_TRUE(StartsWithASCII(d.data_received(), "Lynx (textmode", true)); 4498} 4499 4500// Check that a NULL HttpUserAgentSettings causes the corresponding empty 4501// User-Agent header to be sent but does not send the Accept-Language and 4502// Accept-Charset headers. 4503TEST_F(URLRequestTestHTTP, EmptyHttpUserAgentSettings) { 4504 ASSERT_TRUE(test_server_.Start()); 4505 4506 TestNetworkDelegate network_delegate; // Must outlive URLRequests. 4507 TestURLRequestContext context(true); 4508 context.set_network_delegate(&network_delegate); 4509 context.Init(); 4510 // We override the HttpUserAgentSettings after initialization because empty 4511 // entries get overridden by Init(). 4512 context.set_http_user_agent_settings(NULL); 4513 4514 struct { 4515 const char* request; 4516 const char* expected_response; 4517 } tests[] = { { "echoheader?Accept-Language", "None" }, 4518 { "echoheader?Accept-Charset", "None" }, 4519 { "echoheader?User-Agent", "" } }; 4520 4521 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); i++) { 4522 TestDelegate d; 4523 URLRequest req(test_server_.GetURL(tests[i].request), &d, &context); 4524 req.Start(); 4525 MessageLoop::current()->Run(); 4526 EXPECT_EQ(tests[i].expected_response, d.data_received()) 4527 << " Request = \"" << tests[i].request << "\""; 4528 } 4529} 4530 4531// Make sure that URLRequest passes on its priority updates to 4532// newly-created jobs after the first one. 4533TEST_F(URLRequestTestHTTP, SetSubsequentJobPriority) { 4534 ASSERT_TRUE(test_server_.Start()); 4535 4536 TestDelegate d; 4537 URLRequest req(test_server_.GetURL("empty.html"), &d, &default_context_); 4538 EXPECT_EQ(DEFAULT_PRIORITY, req.priority()); 4539 4540 scoped_refptr<URLRequestRedirectJob> redirect_job = 4541 new URLRequestRedirectJob( 4542 &req, &default_network_delegate_, test_server_.GetURL("echo"), 4543 URLRequestRedirectJob::REDIRECT_302_FOUND); 4544 AddTestInterceptor()->set_main_intercept_job(redirect_job); 4545 4546 req.SetPriority(LOW); 4547 req.Start(); 4548 EXPECT_TRUE(req.is_pending()); 4549 4550 scoped_refptr<URLRequestTestJob> job = 4551 new URLRequestTestJob(&req, &default_network_delegate_); 4552 AddTestInterceptor()->set_main_intercept_job(job); 4553 4554 // Should trigger |job| to be started. 4555 MessageLoop::current()->Run(); 4556 EXPECT_EQ(LOW, job->priority()); 4557} 4558 4559class HTTPSRequestTest : public testing::Test { 4560 public: 4561 HTTPSRequestTest() : default_context_(true) { 4562 default_context_.set_network_delegate(&default_network_delegate_); 4563 default_context_.Init(); 4564 } 4565 virtual ~HTTPSRequestTest() {} 4566 4567 protected: 4568 TestNetworkDelegate default_network_delegate_; // Must outlive URLRequest. 4569 TestURLRequestContext default_context_; 4570}; 4571 4572TEST_F(HTTPSRequestTest, HTTPSGetTest) { 4573 SpawnedTestServer test_server( 4574 SpawnedTestServer::TYPE_HTTPS, 4575 SpawnedTestServer::kLocalhost, 4576 base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 4577 ASSERT_TRUE(test_server.Start()); 4578 4579 TestDelegate d; 4580 { 4581 URLRequest r(test_server.GetURL(std::string()), &d, &default_context_); 4582 r.Start(); 4583 EXPECT_TRUE(r.is_pending()); 4584 4585 MessageLoop::current()->Run(); 4586 4587 EXPECT_EQ(1, d.response_started_count()); 4588 EXPECT_FALSE(d.received_data_before_response()); 4589 EXPECT_NE(0, d.bytes_received()); 4590 CheckSSLInfo(r.ssl_info()); 4591 EXPECT_EQ(test_server.host_port_pair().host(), 4592 r.GetSocketAddress().host()); 4593 EXPECT_EQ(test_server.host_port_pair().port(), 4594 r.GetSocketAddress().port()); 4595 } 4596} 4597 4598TEST_F(HTTPSRequestTest, HTTPSMismatchedTest) { 4599 SpawnedTestServer::SSLOptions ssl_options( 4600 SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME); 4601 SpawnedTestServer test_server( 4602 SpawnedTestServer::TYPE_HTTPS, 4603 ssl_options, 4604 base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 4605 ASSERT_TRUE(test_server.Start()); 4606 4607 bool err_allowed = true; 4608 for (int i = 0; i < 2 ; i++, err_allowed = !err_allowed) { 4609 TestDelegate d; 4610 { 4611 d.set_allow_certificate_errors(err_allowed); 4612 URLRequest r(test_server.GetURL(std::string()), &d, &default_context_); 4613 4614 r.Start(); 4615 EXPECT_TRUE(r.is_pending()); 4616 4617 MessageLoop::current()->Run(); 4618 4619 EXPECT_EQ(1, d.response_started_count()); 4620 EXPECT_FALSE(d.received_data_before_response()); 4621 EXPECT_TRUE(d.have_certificate_errors()); 4622 if (err_allowed) { 4623 EXPECT_NE(0, d.bytes_received()); 4624 CheckSSLInfo(r.ssl_info()); 4625 } else { 4626 EXPECT_EQ(0, d.bytes_received()); 4627 } 4628 } 4629 } 4630} 4631 4632TEST_F(HTTPSRequestTest, HTTPSExpiredTest) { 4633 SpawnedTestServer::SSLOptions ssl_options( 4634 SpawnedTestServer::SSLOptions::CERT_EXPIRED); 4635 SpawnedTestServer test_server( 4636 SpawnedTestServer::TYPE_HTTPS, 4637 ssl_options, 4638 base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 4639 ASSERT_TRUE(test_server.Start()); 4640 4641 // Iterate from false to true, just so that we do the opposite of the 4642 // previous test in order to increase test coverage. 4643 bool err_allowed = false; 4644 for (int i = 0; i < 2 ; i++, err_allowed = !err_allowed) { 4645 TestDelegate d; 4646 { 4647 d.set_allow_certificate_errors(err_allowed); 4648 URLRequest r(test_server.GetURL(std::string()), &d, &default_context_); 4649 4650 r.Start(); 4651 EXPECT_TRUE(r.is_pending()); 4652 4653 MessageLoop::current()->Run(); 4654 4655 EXPECT_EQ(1, d.response_started_count()); 4656 EXPECT_FALSE(d.received_data_before_response()); 4657 EXPECT_TRUE(d.have_certificate_errors()); 4658 if (err_allowed) { 4659 EXPECT_NE(0, d.bytes_received()); 4660 CheckSSLInfo(r.ssl_info()); 4661 } else { 4662 EXPECT_EQ(0, d.bytes_received()); 4663 } 4664 } 4665 } 4666} 4667 4668// Tests TLSv1.1 -> TLSv1 fallback. Verifies that we don't fall back more 4669// than necessary. 4670TEST_F(HTTPSRequestTest, TLSv1Fallback) { 4671 uint16 default_version_max = SSLConfigService::default_version_max(); 4672 // The OpenSSL library in use may not support TLS 1.1. 4673#if !defined(USE_OPENSSL) 4674 EXPECT_GT(default_version_max, SSL_PROTOCOL_VERSION_TLS1); 4675#endif 4676 if (default_version_max <= SSL_PROTOCOL_VERSION_TLS1) 4677 return; 4678 4679 SpawnedTestServer::SSLOptions ssl_options( 4680 SpawnedTestServer::SSLOptions::CERT_OK); 4681 ssl_options.tls_intolerant = 4682 SpawnedTestServer::SSLOptions::TLS_INTOLERANT_TLS1_1; 4683 SpawnedTestServer test_server( 4684 SpawnedTestServer::TYPE_HTTPS, 4685 ssl_options, 4686 base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 4687 ASSERT_TRUE(test_server.Start()); 4688 4689 TestDelegate d; 4690 TestURLRequestContext context(true); 4691 context.Init(); 4692 d.set_allow_certificate_errors(true); 4693 URLRequest r(test_server.GetURL(std::string()), &d, &context); 4694 r.Start(); 4695 4696 MessageLoop::current()->Run(); 4697 4698 EXPECT_EQ(1, d.response_started_count()); 4699 EXPECT_NE(0, d.bytes_received()); 4700 EXPECT_EQ(static_cast<int>(SSL_CONNECTION_VERSION_TLS1), 4701 SSLConnectionStatusToVersion(r.ssl_info().connection_status)); 4702 EXPECT_TRUE(r.ssl_info().connection_status & SSL_CONNECTION_VERSION_FALLBACK); 4703} 4704 4705// This tests that a load of www.google.com with a certificate error sets 4706// the |certificate_errors_are_fatal| flag correctly. This flag will cause 4707// the interstitial to be fatal. 4708TEST_F(HTTPSRequestTest, HTTPSPreloadedHSTSTest) { 4709 SpawnedTestServer::SSLOptions ssl_options( 4710 SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME); 4711 SpawnedTestServer test_server( 4712 SpawnedTestServer::TYPE_HTTPS, 4713 ssl_options, 4714 base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 4715 ASSERT_TRUE(test_server.Start()); 4716 4717 // We require that the URL be www.google.com in order to pick up the 4718 // preloaded HSTS entries in the TransportSecurityState. This means that we 4719 // have to use a MockHostResolver in order to direct www.google.com to the 4720 // testserver. By default, MockHostResolver maps all hosts to 127.0.0.1. 4721 4722 MockHostResolver host_resolver; 4723 TestNetworkDelegate network_delegate; // Must outlive URLRequest. 4724 TestURLRequestContext context(true); 4725 context.set_network_delegate(&network_delegate); 4726 context.set_host_resolver(&host_resolver); 4727 TransportSecurityState transport_security_state; 4728 context.set_transport_security_state(&transport_security_state); 4729 context.Init(); 4730 4731 TestDelegate d; 4732 URLRequest r(GURL(base::StringPrintf("https://www.google.com:%d", 4733 test_server.host_port_pair().port())), 4734 &d, 4735 &context); 4736 4737 r.Start(); 4738 EXPECT_TRUE(r.is_pending()); 4739 4740 MessageLoop::current()->Run(); 4741 4742 EXPECT_EQ(1, d.response_started_count()); 4743 EXPECT_FALSE(d.received_data_before_response()); 4744 EXPECT_TRUE(d.have_certificate_errors()); 4745 EXPECT_TRUE(d.certificate_errors_are_fatal()); 4746} 4747 4748// This tests that cached HTTPS page loads do not cause any updates to the 4749// TransportSecurityState. 4750TEST_F(HTTPSRequestTest, HTTPSErrorsNoClobberTSSTest) { 4751 // The actual problem -- CERT_MISMATCHED_NAME in this case -- doesn't 4752 // matter. It just has to be any error. 4753 SpawnedTestServer::SSLOptions ssl_options( 4754 SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME); 4755 SpawnedTestServer test_server( 4756 SpawnedTestServer::TYPE_HTTPS, 4757 ssl_options, 4758 base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 4759 ASSERT_TRUE(test_server.Start()); 4760 4761 // We require that the URL be www.google.com in order to pick up the 4762 // preloaded and dynamic HSTS and public key pin entries in the 4763 // TransportSecurityState. This means that we have to use a 4764 // MockHostResolver in order to direct www.google.com to the testserver. 4765 // By default, MockHostResolver maps all hosts to 127.0.0.1. 4766 4767 MockHostResolver host_resolver; 4768 TestNetworkDelegate network_delegate; // Must outlive URLRequest. 4769 TestURLRequestContext context(true); 4770 context.set_network_delegate(&network_delegate); 4771 context.set_host_resolver(&host_resolver); 4772 TransportSecurityState transport_security_state; 4773 TransportSecurityState::DomainState domain_state; 4774 EXPECT_TRUE(transport_security_state.GetDomainState("www.google.com", true, 4775 &domain_state)); 4776 context.set_transport_security_state(&transport_security_state); 4777 context.Init(); 4778 4779 TestDelegate d; 4780 URLRequest r(GURL(base::StringPrintf("https://www.google.com:%d", 4781 test_server.host_port_pair().port())), 4782 &d, 4783 &context); 4784 4785 r.Start(); 4786 EXPECT_TRUE(r.is_pending()); 4787 4788 MessageLoop::current()->Run(); 4789 4790 EXPECT_EQ(1, d.response_started_count()); 4791 EXPECT_FALSE(d.received_data_before_response()); 4792 EXPECT_TRUE(d.have_certificate_errors()); 4793 EXPECT_TRUE(d.certificate_errors_are_fatal()); 4794 4795 // Get a fresh copy of the state, and check that it hasn't been updated. 4796 TransportSecurityState::DomainState new_domain_state; 4797 EXPECT_TRUE(transport_security_state.GetDomainState("www.google.com", true, 4798 &new_domain_state)); 4799 EXPECT_EQ(new_domain_state.upgrade_mode, domain_state.upgrade_mode); 4800 EXPECT_EQ(new_domain_state.include_subdomains, 4801 domain_state.include_subdomains); 4802 EXPECT_TRUE(FingerprintsEqual(new_domain_state.static_spki_hashes, 4803 domain_state.static_spki_hashes)); 4804 EXPECT_TRUE(FingerprintsEqual(new_domain_state.dynamic_spki_hashes, 4805 domain_state.dynamic_spki_hashes)); 4806 EXPECT_TRUE(FingerprintsEqual(new_domain_state.bad_static_spki_hashes, 4807 domain_state.bad_static_spki_hashes)); 4808} 4809 4810// Make sure HSTS preserves a POST request's method and body. 4811TEST_F(HTTPSRequestTest, HSTSPreservesPosts) { 4812 static const char kData[] = "hello world"; 4813 4814 SpawnedTestServer::SSLOptions ssl_options( 4815 SpawnedTestServer::SSLOptions::CERT_OK); 4816 SpawnedTestServer test_server( 4817 SpawnedTestServer::TYPE_HTTPS, 4818 ssl_options, 4819 base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 4820 ASSERT_TRUE(test_server.Start()); 4821 4822 4823 // Per spec, TransportSecurityState expects a domain name, rather than an IP 4824 // address, so a MockHostResolver is needed to redirect www.somewhere.com to 4825 // the SpawnedTestServer. By default, MockHostResolver maps all hosts 4826 // to 127.0.0.1. 4827 MockHostResolver host_resolver; 4828 4829 // Force https for www.somewhere.com. 4830 TransportSecurityState transport_security_state; 4831 base::Time expiry = base::Time::Now() + base::TimeDelta::FromDays(1000); 4832 bool include_subdomains = false; 4833 transport_security_state.AddHSTS("www.somewhere.com", expiry, 4834 include_subdomains); 4835 4836 TestNetworkDelegate network_delegate; // Must outlive URLRequest. 4837 4838 TestURLRequestContext context(true); 4839 context.set_host_resolver(&host_resolver); 4840 context.set_transport_security_state(&transport_security_state); 4841 context.set_network_delegate(&network_delegate); 4842 context.Init(); 4843 4844 TestDelegate d; 4845 // Navigating to https://www.somewhere.com instead of https://127.0.0.1 will 4846 // cause a certificate error. Ignore the error. 4847 d.set_allow_certificate_errors(true); 4848 4849 URLRequest req(GURL(base::StringPrintf("http://www.somewhere.com:%d/echo", 4850 test_server.host_port_pair().port())), 4851 &d, 4852 &context); 4853 req.set_method("POST"); 4854 req.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData))); 4855 4856 req.Start(); 4857 MessageLoop::current()->Run(); 4858 4859 EXPECT_EQ("https", req.url().scheme()); 4860 EXPECT_EQ("POST", req.method()); 4861 EXPECT_EQ(kData, d.data_received()); 4862} 4863 4864TEST_F(HTTPSRequestTest, SSLv3Fallback) { 4865 SpawnedTestServer::SSLOptions ssl_options( 4866 SpawnedTestServer::SSLOptions::CERT_OK); 4867 ssl_options.tls_intolerant = 4868 SpawnedTestServer::SSLOptions::TLS_INTOLERANT_ALL; 4869 SpawnedTestServer test_server( 4870 SpawnedTestServer::TYPE_HTTPS, 4871 ssl_options, 4872 base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 4873 ASSERT_TRUE(test_server.Start()); 4874 4875 TestDelegate d; 4876 TestURLRequestContext context(true); 4877 context.Init(); 4878 d.set_allow_certificate_errors(true); 4879 URLRequest r(test_server.GetURL(std::string()), &d, &context); 4880 r.Start(); 4881 4882 MessageLoop::current()->Run(); 4883 4884 EXPECT_EQ(1, d.response_started_count()); 4885 EXPECT_NE(0, d.bytes_received()); 4886 EXPECT_EQ(static_cast<int>(SSL_CONNECTION_VERSION_SSL3), 4887 SSLConnectionStatusToVersion(r.ssl_info().connection_status)); 4888 EXPECT_TRUE(r.ssl_info().connection_status & SSL_CONNECTION_VERSION_FALLBACK); 4889} 4890 4891namespace { 4892 4893class SSLClientAuthTestDelegate : public TestDelegate { 4894 public: 4895 SSLClientAuthTestDelegate() : on_certificate_requested_count_(0) { 4896 } 4897 virtual void OnCertificateRequested( 4898 URLRequest* request, 4899 SSLCertRequestInfo* cert_request_info) OVERRIDE { 4900 on_certificate_requested_count_++; 4901 MessageLoop::current()->Quit(); 4902 } 4903 int on_certificate_requested_count() { 4904 return on_certificate_requested_count_; 4905 } 4906 private: 4907 int on_certificate_requested_count_; 4908}; 4909 4910} // namespace 4911 4912// TODO(davidben): Test the rest of the code. Specifically, 4913// - Filtering which certificates to select. 4914// - Sending a certificate back. 4915// - Getting a certificate request in an SSL renegotiation sending the 4916// HTTP request. 4917TEST_F(HTTPSRequestTest, ClientAuthTest) { 4918 SpawnedTestServer::SSLOptions ssl_options; 4919 ssl_options.request_client_certificate = true; 4920 SpawnedTestServer test_server( 4921 SpawnedTestServer::TYPE_HTTPS, 4922 ssl_options, 4923 base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 4924 ASSERT_TRUE(test_server.Start()); 4925 4926 SSLClientAuthTestDelegate d; 4927 { 4928 URLRequest r(test_server.GetURL(std::string()), &d, &default_context_); 4929 4930 r.Start(); 4931 EXPECT_TRUE(r.is_pending()); 4932 4933 MessageLoop::current()->Run(); 4934 4935 EXPECT_EQ(1, d.on_certificate_requested_count()); 4936 EXPECT_FALSE(d.received_data_before_response()); 4937 EXPECT_EQ(0, d.bytes_received()); 4938 4939 // Send no certificate. 4940 // TODO(davidben): Get temporary client cert import (with keys) working on 4941 // all platforms so we can test sending a cert as well. 4942 r.ContinueWithCertificate(NULL); 4943 4944 MessageLoop::current()->Run(); 4945 4946 EXPECT_EQ(1, d.response_started_count()); 4947 EXPECT_FALSE(d.received_data_before_response()); 4948 EXPECT_NE(0, d.bytes_received()); 4949 } 4950} 4951 4952TEST_F(HTTPSRequestTest, ResumeTest) { 4953 // Test that we attempt a session resume when making two connections to the 4954 // same host. 4955 SpawnedTestServer::SSLOptions ssl_options; 4956 ssl_options.record_resume = true; 4957 SpawnedTestServer test_server( 4958 SpawnedTestServer::TYPE_HTTPS, 4959 ssl_options, 4960 base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 4961 ASSERT_TRUE(test_server.Start()); 4962 4963 SSLClientSocket::ClearSessionCache(); 4964 4965 { 4966 TestDelegate d; 4967 URLRequest r( 4968 test_server.GetURL("ssl-session-cache"), &d, &default_context_); 4969 4970 r.Start(); 4971 EXPECT_TRUE(r.is_pending()); 4972 4973 MessageLoop::current()->Run(); 4974 4975 EXPECT_EQ(1, d.response_started_count()); 4976 } 4977 4978 reinterpret_cast<HttpCache*>(default_context_.http_transaction_factory())-> 4979 CloseAllConnections(); 4980 4981 { 4982 TestDelegate d; 4983 URLRequest r( 4984 test_server.GetURL("ssl-session-cache"), &d, &default_context_); 4985 4986 r.Start(); 4987 EXPECT_TRUE(r.is_pending()); 4988 4989 MessageLoop::current()->Run(); 4990 4991 // The response will look like; 4992 // insert abc 4993 // lookup abc 4994 // insert xyz 4995 // 4996 // With a newline at the end which makes the split think that there are 4997 // four lines. 4998 4999 EXPECT_EQ(1, d.response_started_count()); 5000 std::vector<std::string> lines; 5001 base::SplitString(d.data_received(), '\n', &lines); 5002 ASSERT_EQ(4u, lines.size()) << d.data_received(); 5003 5004 std::string session_id; 5005 5006 for (size_t i = 0; i < 2; i++) { 5007 std::vector<std::string> parts; 5008 base::SplitString(lines[i], '\t', &parts); 5009 ASSERT_EQ(2u, parts.size()); 5010 if (i == 0) { 5011 EXPECT_EQ("insert", parts[0]); 5012 session_id = parts[1]; 5013 } else { 5014 EXPECT_EQ("lookup", parts[0]); 5015 EXPECT_EQ(session_id, parts[1]); 5016 } 5017 } 5018 } 5019} 5020 5021TEST_F(HTTPSRequestTest, SSLSessionCacheShardTest) { 5022 // Test that sessions aren't resumed when the value of ssl_session_cache_shard 5023 // differs. 5024 SpawnedTestServer::SSLOptions ssl_options; 5025 ssl_options.record_resume = true; 5026 SpawnedTestServer test_server( 5027 SpawnedTestServer::TYPE_HTTPS, 5028 ssl_options, 5029 base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 5030 ASSERT_TRUE(test_server.Start()); 5031 5032 SSLClientSocket::ClearSessionCache(); 5033 5034 { 5035 TestDelegate d; 5036 URLRequest r( 5037 test_server.GetURL("ssl-session-cache"), &d, &default_context_); 5038 5039 r.Start(); 5040 EXPECT_TRUE(r.is_pending()); 5041 5042 MessageLoop::current()->Run(); 5043 5044 EXPECT_EQ(1, d.response_started_count()); 5045 } 5046 5047 // Now create a new HttpCache with a different ssl_session_cache_shard value. 5048 HttpNetworkSession::Params params; 5049 params.host_resolver = default_context_.host_resolver(); 5050 params.cert_verifier = default_context_.cert_verifier(); 5051 params.proxy_service = default_context_.proxy_service(); 5052 params.ssl_config_service = default_context_.ssl_config_service(); 5053 params.http_auth_handler_factory = 5054 default_context_.http_auth_handler_factory(); 5055 params.network_delegate = &default_network_delegate_; 5056 params.http_server_properties = default_context_.http_server_properties(); 5057 params.ssl_session_cache_shard = "alternate"; 5058 5059 scoped_ptr<net::HttpCache> cache(new net::HttpCache( 5060 new net::HttpNetworkSession(params), 5061 net::HttpCache::DefaultBackend::InMemory(0))); 5062 5063 default_context_.set_http_transaction_factory(cache.get()); 5064 5065 { 5066 TestDelegate d; 5067 URLRequest r( 5068 test_server.GetURL("ssl-session-cache"), &d, &default_context_); 5069 5070 r.Start(); 5071 EXPECT_TRUE(r.is_pending()); 5072 5073 MessageLoop::current()->Run(); 5074 5075 // The response will look like; 5076 // insert abc 5077 // insert xyz 5078 // 5079 // With a newline at the end which makes the split think that there are 5080 // three lines. 5081 5082 EXPECT_EQ(1, d.response_started_count()); 5083 std::vector<std::string> lines; 5084 base::SplitString(d.data_received(), '\n', &lines); 5085 ASSERT_EQ(3u, lines.size()); 5086 5087 std::string session_id; 5088 for (size_t i = 0; i < 2; i++) { 5089 std::vector<std::string> parts; 5090 base::SplitString(lines[i], '\t', &parts); 5091 ASSERT_EQ(2u, parts.size()); 5092 EXPECT_EQ("insert", parts[0]); 5093 if (i == 0) { 5094 session_id = parts[1]; 5095 } else { 5096 EXPECT_NE(session_id, parts[1]); 5097 } 5098 } 5099 } 5100} 5101 5102class TestSSLConfigService : public SSLConfigService { 5103 public: 5104 TestSSLConfigService(bool ev_enabled, bool online_rev_checking) 5105 : ev_enabled_(ev_enabled), 5106 online_rev_checking_(online_rev_checking) { 5107 } 5108 5109 // SSLConfigService: 5110 virtual void GetSSLConfig(SSLConfig* config) OVERRIDE { 5111 *config = SSLConfig(); 5112 config->rev_checking_enabled = online_rev_checking_; 5113 config->verify_ev_cert = ev_enabled_; 5114 } 5115 5116 protected: 5117 virtual ~TestSSLConfigService() {} 5118 5119 private: 5120 const bool ev_enabled_; 5121 const bool online_rev_checking_; 5122}; 5123 5124// This the fingerprint of the "Testing CA" certificate used by the testserver. 5125// See net/data/ssl/certificates/ocsp-test-root.pem. 5126static const SHA1HashValue kOCSPTestCertFingerprint = 5127 { { 0xf1, 0xad, 0xf6, 0xce, 0x42, 0xac, 0xe7, 0xb4, 0xf4, 0x24, 5128 0xdb, 0x1a, 0xf7, 0xa0, 0x9f, 0x09, 0xa1, 0xea, 0xf1, 0x5c } }; 5129 5130// This is the policy OID contained in the certificates that testserver 5131// generates. 5132static const char kOCSPTestCertPolicy[] = "1.3.6.1.4.1.11129.2.4.1"; 5133 5134class HTTPSOCSPTest : public HTTPSRequestTest { 5135 public: 5136 HTTPSOCSPTest() 5137 : context_(true), 5138 ev_test_policy_( 5139 new ScopedTestEVPolicy(EVRootCAMetadata::GetInstance(), 5140 kOCSPTestCertFingerprint, 5141 kOCSPTestCertPolicy)) { 5142 } 5143 5144 virtual void SetUp() OVERRIDE { 5145 SetupContext(&context_); 5146 context_.Init(); 5147 5148 scoped_refptr<net::X509Certificate> root_cert = 5149 ImportCertFromFile(GetTestCertsDirectory(), "ocsp-test-root.pem"); 5150 CHECK_NE(static_cast<X509Certificate*>(NULL), root_cert); 5151 test_root_.reset(new ScopedTestRoot(root_cert)); 5152 5153#if defined(USE_NSS) || defined(OS_IOS) 5154 SetURLRequestContextForNSSHttpIO(&context_); 5155 EnsureNSSHttpIOInit(); 5156#endif 5157 } 5158 5159 void DoConnection(const SpawnedTestServer::SSLOptions& ssl_options, 5160 CertStatus* out_cert_status) { 5161 // We always overwrite out_cert_status. 5162 *out_cert_status = 0; 5163 SpawnedTestServer test_server( 5164 SpawnedTestServer::TYPE_HTTPS, 5165 ssl_options, 5166 base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 5167 ASSERT_TRUE(test_server.Start()); 5168 5169 TestDelegate d; 5170 d.set_allow_certificate_errors(true); 5171 URLRequest r(test_server.GetURL(std::string()), &d, &context_); 5172 r.Start(); 5173 5174 MessageLoop::current()->Run(); 5175 5176 EXPECT_EQ(1, d.response_started_count()); 5177 *out_cert_status = r.ssl_info().cert_status; 5178 } 5179 5180 virtual ~HTTPSOCSPTest() { 5181#if defined(USE_NSS) || defined(OS_IOS) 5182 ShutdownNSSHttpIO(); 5183#endif 5184 } 5185 5186 protected: 5187 // SetupContext configures the URLRequestContext that will be used for making 5188 // connetions to testserver. This can be overridden in test subclasses for 5189 // different behaviour. 5190 virtual void SetupContext(URLRequestContext* context) { 5191 context->set_ssl_config_service( 5192 new TestSSLConfigService(true /* check for EV */, 5193 true /* online revocation checking */)); 5194 } 5195 5196 scoped_ptr<ScopedTestRoot> test_root_; 5197 TestURLRequestContext context_; 5198 scoped_ptr<ScopedTestEVPolicy> ev_test_policy_; 5199}; 5200 5201static CertStatus ExpectedCertStatusForFailedOnlineRevocationCheck() { 5202#if defined(OS_WIN) 5203 // Windows can return CERT_STATUS_UNABLE_TO_CHECK_REVOCATION but we don't 5204 // have that ability on other platforms. 5205 return CERT_STATUS_UNABLE_TO_CHECK_REVOCATION; 5206#else 5207 return 0; 5208#endif 5209} 5210 5211// SystemUsesChromiumEVMetadata returns true iff the current operating system 5212// uses Chromium's EV metadata (i.e. EVRootCAMetadata). If it does not, then 5213// several tests are effected because our testing EV certificate won't be 5214// recognised as EV. 5215static bool SystemUsesChromiumEVMetadata() { 5216#if defined(USE_OPENSSL) 5217 // http://crbug.com/117478 - OpenSSL does not support EV validation. 5218 return false; 5219#elif defined(OS_MACOSX) && !defined(OS_IOS) 5220 // On OS X, we use the system to tell us whether a certificate is EV or not 5221 // and the system won't recognise our testing root. 5222 return false; 5223#else 5224 return true; 5225#endif 5226} 5227 5228static bool SystemSupportsOCSP() { 5229#if defined(USE_OPENSSL) 5230 // http://crbug.com/117478 - OpenSSL does not support OCSP. 5231 return false; 5232#elif defined(OS_WIN) 5233 return base::win::GetVersion() >= base::win::VERSION_VISTA; 5234#elif defined(OS_ANDROID) 5235 // TODO(jnd): http://crbug.com/117478 - EV verification is not yet supported. 5236 return false; 5237#else 5238 return true; 5239#endif 5240} 5241 5242TEST_F(HTTPSOCSPTest, Valid) { 5243 if (!SystemSupportsOCSP()) { 5244 LOG(WARNING) << "Skipping test because system doesn't support OCSP"; 5245 return; 5246 } 5247 5248 SpawnedTestServer::SSLOptions ssl_options( 5249 SpawnedTestServer::SSLOptions::CERT_AUTO); 5250 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_OK; 5251 5252 CertStatus cert_status; 5253 DoConnection(ssl_options, &cert_status); 5254 5255 EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS); 5256 5257 EXPECT_EQ(SystemUsesChromiumEVMetadata(), 5258 static_cast<bool>(cert_status & CERT_STATUS_IS_EV)); 5259 5260 EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED); 5261} 5262 5263TEST_F(HTTPSOCSPTest, Revoked) { 5264 if (!SystemSupportsOCSP()) { 5265 LOG(WARNING) << "Skipping test because system doesn't support OCSP"; 5266 return; 5267 } 5268 5269 SpawnedTestServer::SSLOptions ssl_options( 5270 SpawnedTestServer::SSLOptions::CERT_AUTO); 5271 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_REVOKED; 5272 5273 CertStatus cert_status; 5274 DoConnection(ssl_options, &cert_status); 5275 5276#if !(defined(OS_MACOSX) && !defined(OS_IOS)) 5277 // Doesn't pass on OS X yet for reasons that need to be investigated. 5278 EXPECT_EQ(CERT_STATUS_REVOKED, cert_status & CERT_STATUS_ALL_ERRORS); 5279#endif 5280 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV); 5281 EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED); 5282} 5283 5284TEST_F(HTTPSOCSPTest, Invalid) { 5285 if (!SystemSupportsOCSP()) { 5286 LOG(WARNING) << "Skipping test because system doesn't support OCSP"; 5287 return; 5288 } 5289 5290 SpawnedTestServer::SSLOptions ssl_options( 5291 SpawnedTestServer::SSLOptions::CERT_AUTO); 5292 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID; 5293 5294 CertStatus cert_status; 5295 DoConnection(ssl_options, &cert_status); 5296 5297 EXPECT_EQ(ExpectedCertStatusForFailedOnlineRevocationCheck(), 5298 cert_status & CERT_STATUS_ALL_ERRORS); 5299 5300 // Without a positive OCSP response, we shouldn't show the EV status. 5301 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV); 5302 EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED); 5303} 5304 5305class HTTPSEVCRLSetTest : public HTTPSOCSPTest { 5306 protected: 5307 virtual void SetupContext(URLRequestContext* context) OVERRIDE { 5308 context->set_ssl_config_service( 5309 new TestSSLConfigService(true /* check for EV */, 5310 false /* online revocation checking */)); 5311 } 5312}; 5313 5314TEST_F(HTTPSEVCRLSetTest, MissingCRLSetAndInvalidOCSP) { 5315 if (!SystemSupportsOCSP()) { 5316 LOG(WARNING) << "Skipping test because system doesn't support OCSP"; 5317 return; 5318 } 5319 5320 SpawnedTestServer::SSLOptions ssl_options( 5321 SpawnedTestServer::SSLOptions::CERT_AUTO); 5322 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID; 5323 SSLConfigService::SetCRLSet(scoped_refptr<CRLSet>()); 5324 5325 CertStatus cert_status; 5326 DoConnection(ssl_options, &cert_status); 5327 5328 EXPECT_EQ(ExpectedCertStatusForFailedOnlineRevocationCheck(), 5329 cert_status & CERT_STATUS_ALL_ERRORS); 5330 5331 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV); 5332 EXPECT_EQ(SystemUsesChromiumEVMetadata(), 5333 static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED)); 5334} 5335 5336TEST_F(HTTPSEVCRLSetTest, MissingCRLSetAndGoodOCSP) { 5337 if (!SystemSupportsOCSP()) { 5338 LOG(WARNING) << "Skipping test because system doesn't support OCSP"; 5339 return; 5340 } 5341 5342 SpawnedTestServer::SSLOptions ssl_options( 5343 SpawnedTestServer::SSLOptions::CERT_AUTO); 5344 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_OK; 5345 SSLConfigService::SetCRLSet(scoped_refptr<CRLSet>()); 5346 5347 CertStatus cert_status; 5348 DoConnection(ssl_options, &cert_status); 5349 5350 EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS); 5351 5352 EXPECT_EQ(SystemUsesChromiumEVMetadata(), 5353 static_cast<bool>(cert_status & CERT_STATUS_IS_EV)); 5354 EXPECT_EQ(SystemUsesChromiumEVMetadata(), 5355 static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED)); 5356} 5357 5358TEST_F(HTTPSEVCRLSetTest, ExpiredCRLSet) { 5359 if (!SystemSupportsOCSP()) { 5360 LOG(WARNING) << "Skipping test because system doesn't support OCSP"; 5361 return; 5362 } 5363 5364 SpawnedTestServer::SSLOptions ssl_options( 5365 SpawnedTestServer::SSLOptions::CERT_AUTO); 5366 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID; 5367 SSLConfigService::SetCRLSet( 5368 scoped_refptr<CRLSet>(CRLSet::ExpiredCRLSetForTesting())); 5369 5370 CertStatus cert_status; 5371 DoConnection(ssl_options, &cert_status); 5372 5373 EXPECT_EQ(ExpectedCertStatusForFailedOnlineRevocationCheck(), 5374 cert_status & CERT_STATUS_ALL_ERRORS); 5375 5376 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV); 5377 EXPECT_EQ(SystemUsesChromiumEVMetadata(), 5378 static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED)); 5379} 5380 5381TEST_F(HTTPSEVCRLSetTest, FreshCRLSet) { 5382 SpawnedTestServer::SSLOptions ssl_options( 5383 SpawnedTestServer::SSLOptions::CERT_AUTO); 5384 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID; 5385 SSLConfigService::SetCRLSet( 5386 scoped_refptr<CRLSet>(CRLSet::EmptyCRLSetForTesting())); 5387 5388 CertStatus cert_status; 5389 DoConnection(ssl_options, &cert_status); 5390 5391 // With a valid, fresh CRLSet the bad OCSP response shouldn't matter because 5392 // we wont check it. 5393 EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS); 5394 5395 EXPECT_EQ(SystemUsesChromiumEVMetadata(), 5396 static_cast<bool>(cert_status & CERT_STATUS_IS_EV)); 5397 5398 EXPECT_FALSE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED); 5399} 5400 5401TEST_F(HTTPSEVCRLSetTest, ExpiredCRLSetAndRevokedNonEVCert) { 5402 // Test that when EV verification is requested, but online revocation 5403 // checking is disabled, and the leaf certificate is not in fact EV, that 5404 // no revocation checking actually happens. 5405 if (!SystemSupportsOCSP()) { 5406 LOG(WARNING) << "Skipping test because system doesn't support OCSP"; 5407 return; 5408 } 5409 5410 // Unmark the certificate's OID as EV, which should disable revocation 5411 // checking (as per the user preference) 5412 ev_test_policy_.reset(); 5413 5414 SpawnedTestServer::SSLOptions ssl_options( 5415 SpawnedTestServer::SSLOptions::CERT_AUTO); 5416 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_REVOKED; 5417 SSLConfigService::SetCRLSet( 5418 scoped_refptr<CRLSet>(CRLSet::ExpiredCRLSetForTesting())); 5419 5420 CertStatus cert_status; 5421 DoConnection(ssl_options, &cert_status); 5422 5423 EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS); 5424 5425 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV); 5426 EXPECT_FALSE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED); 5427} 5428 5429class HTTPSCRLSetTest : public HTTPSOCSPTest { 5430 protected: 5431 virtual void SetupContext(URLRequestContext* context) OVERRIDE { 5432 context->set_ssl_config_service( 5433 new TestSSLConfigService(false /* check for EV */, 5434 false /* online revocation checking */)); 5435 } 5436}; 5437 5438TEST_F(HTTPSCRLSetTest, ExpiredCRLSet) { 5439 SpawnedTestServer::SSLOptions ssl_options( 5440 SpawnedTestServer::SSLOptions::CERT_AUTO); 5441 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID; 5442 SSLConfigService::SetCRLSet( 5443 scoped_refptr<CRLSet>(CRLSet::ExpiredCRLSetForTesting())); 5444 5445 CertStatus cert_status; 5446 DoConnection(ssl_options, &cert_status); 5447 5448 // If we're not trying EV verification then, even if the CRLSet has expired, 5449 // we don't fall back to online revocation checks. 5450 EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS); 5451 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV); 5452 EXPECT_FALSE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED); 5453} 5454#endif // !defined(OS_IOS) 5455 5456#if !defined(DISABLE_FTP_SUPPORT) 5457class URLRequestTestFTP : public URLRequestTest { 5458 public: 5459 URLRequestTestFTP() 5460 : test_server_(SpawnedTestServer::TYPE_FTP, SpawnedTestServer::kLocalhost, 5461 base::FilePath()) { 5462 } 5463 5464 protected: 5465 SpawnedTestServer test_server_; 5466}; 5467 5468// Make sure an FTP request using an unsafe ports fails. 5469TEST_F(URLRequestTestFTP, UnsafePort) { 5470 ASSERT_TRUE(test_server_.Start()); 5471 5472 URLRequestJobFactoryImpl job_factory; 5473 FtpNetworkLayer ftp_transaction_factory(default_context_.host_resolver()); 5474 5475 GURL url("ftp://127.0.0.1:7"); 5476 job_factory.SetProtocolHandler( 5477 "ftp", 5478 new FtpProtocolHandler(&ftp_transaction_factory)); 5479 default_context_.set_job_factory(&job_factory); 5480 5481 TestDelegate d; 5482 { 5483 URLRequest r(url, &d, &default_context_); 5484 r.Start(); 5485 EXPECT_TRUE(r.is_pending()); 5486 5487 MessageLoop::current()->Run(); 5488 5489 EXPECT_FALSE(r.is_pending()); 5490 EXPECT_EQ(URLRequestStatus::FAILED, r.status().status()); 5491 EXPECT_EQ(ERR_UNSAFE_PORT, r.status().error()); 5492 } 5493} 5494 5495// Flaky, see http://crbug.com/25045. 5496TEST_F(URLRequestTestFTP, DISABLED_FTPDirectoryListing) { 5497 ASSERT_TRUE(test_server_.Start()); 5498 5499 TestDelegate d; 5500 { 5501 URLRequest r(test_server_.GetURL("/"), &d, &default_context_); 5502 r.Start(); 5503 EXPECT_TRUE(r.is_pending()); 5504 5505 MessageLoop::current()->Run(); 5506 5507 EXPECT_FALSE(r.is_pending()); 5508 EXPECT_EQ(1, d.response_started_count()); 5509 EXPECT_FALSE(d.received_data_before_response()); 5510 EXPECT_LT(0, d.bytes_received()); 5511 EXPECT_EQ(test_server_.host_port_pair().host(), 5512 r.GetSocketAddress().host()); 5513 EXPECT_EQ(test_server_.host_port_pair().port(), 5514 r.GetSocketAddress().port()); 5515 } 5516} 5517 5518// Flaky, see http://crbug.com/25045. 5519TEST_F(URLRequestTestFTP, DISABLED_FTPGetTestAnonymous) { 5520 ASSERT_TRUE(test_server_.Start()); 5521 5522 base::FilePath app_path; 5523 PathService::Get(base::DIR_SOURCE_ROOT, &app_path); 5524 app_path = app_path.AppendASCII("LICENSE"); 5525 TestDelegate d; 5526 { 5527 URLRequest r(test_server_.GetURL("/LICENSE"), &d, &default_context_); 5528 r.Start(); 5529 EXPECT_TRUE(r.is_pending()); 5530 5531 MessageLoop::current()->Run(); 5532 5533 int64 file_size = 0; 5534 file_util::GetFileSize(app_path, &file_size); 5535 5536 EXPECT_FALSE(r.is_pending()); 5537 EXPECT_EQ(1, d.response_started_count()); 5538 EXPECT_FALSE(d.received_data_before_response()); 5539 EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size)); 5540 EXPECT_EQ(test_server_.host_port_pair().host(), 5541 r.GetSocketAddress().host()); 5542 EXPECT_EQ(test_server_.host_port_pair().port(), 5543 r.GetSocketAddress().port()); 5544 } 5545} 5546 5547// Flaky, see http://crbug.com/25045. 5548TEST_F(URLRequestTestFTP, DISABLED_FTPGetTest) { 5549 ASSERT_TRUE(test_server_.Start()); 5550 5551 base::FilePath app_path; 5552 PathService::Get(base::DIR_SOURCE_ROOT, &app_path); 5553 app_path = app_path.AppendASCII("LICENSE"); 5554 TestDelegate d; 5555 { 5556 URLRequest r( 5557 test_server_.GetURLWithUserAndPassword("/LICENSE", "chrome", "chrome"), 5558 &d, 5559 &default_context_); 5560 r.Start(); 5561 EXPECT_TRUE(r.is_pending()); 5562 5563 MessageLoop::current()->Run(); 5564 5565 int64 file_size = 0; 5566 file_util::GetFileSize(app_path, &file_size); 5567 5568 EXPECT_FALSE(r.is_pending()); 5569 EXPECT_EQ(test_server_.host_port_pair().host(), 5570 r.GetSocketAddress().host()); 5571 EXPECT_EQ(test_server_.host_port_pair().port(), 5572 r.GetSocketAddress().port()); 5573 EXPECT_EQ(1, d.response_started_count()); 5574 EXPECT_FALSE(d.received_data_before_response()); 5575 EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size)); 5576 5577 LoadTimingInfo load_timing_info; 5578 r.GetLoadTimingInfo(&load_timing_info); 5579 TestLoadTimingNoHttpConnection(load_timing_info); 5580 } 5581} 5582 5583// Flaky, see http://crbug.com/25045. 5584TEST_F(URLRequestTestFTP, DISABLED_FTPCheckWrongPassword) { 5585 ASSERT_TRUE(test_server_.Start()); 5586 5587 base::FilePath app_path; 5588 PathService::Get(base::DIR_SOURCE_ROOT, &app_path); 5589 app_path = app_path.AppendASCII("LICENSE"); 5590 TestDelegate d; 5591 { 5592 URLRequest r( 5593 test_server_.GetURLWithUserAndPassword("/LICENSE", 5594 "chrome", 5595 "wrong_password"), 5596 &d, 5597 &default_context_); 5598 r.Start(); 5599 EXPECT_TRUE(r.is_pending()); 5600 5601 MessageLoop::current()->Run(); 5602 5603 int64 file_size = 0; 5604 file_util::GetFileSize(app_path, &file_size); 5605 5606 EXPECT_FALSE(r.is_pending()); 5607 EXPECT_EQ(1, d.response_started_count()); 5608 EXPECT_FALSE(d.received_data_before_response()); 5609 EXPECT_EQ(d.bytes_received(), 0); 5610 } 5611} 5612 5613// Flaky, see http://crbug.com/25045. 5614TEST_F(URLRequestTestFTP, DISABLED_FTPCheckWrongPasswordRestart) { 5615 ASSERT_TRUE(test_server_.Start()); 5616 5617 base::FilePath app_path; 5618 PathService::Get(base::DIR_SOURCE_ROOT, &app_path); 5619 app_path = app_path.AppendASCII("LICENSE"); 5620 TestDelegate d; 5621 // Set correct login credentials. The delegate will be asked for them when 5622 // the initial login with wrong credentials will fail. 5623 d.set_credentials(AuthCredentials(kChrome, kChrome)); 5624 { 5625 URLRequest r( 5626 test_server_.GetURLWithUserAndPassword("/LICENSE", 5627 "chrome", 5628 "wrong_password"), 5629 &d, 5630 &default_context_); 5631 r.Start(); 5632 EXPECT_TRUE(r.is_pending()); 5633 5634 MessageLoop::current()->Run(); 5635 5636 int64 file_size = 0; 5637 file_util::GetFileSize(app_path, &file_size); 5638 5639 EXPECT_FALSE(r.is_pending()); 5640 EXPECT_EQ(1, d.response_started_count()); 5641 EXPECT_FALSE(d.received_data_before_response()); 5642 EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size)); 5643 } 5644} 5645 5646// Flaky, see http://crbug.com/25045. 5647TEST_F(URLRequestTestFTP, DISABLED_FTPCheckWrongUser) { 5648 ASSERT_TRUE(test_server_.Start()); 5649 5650 base::FilePath app_path; 5651 PathService::Get(base::DIR_SOURCE_ROOT, &app_path); 5652 app_path = app_path.AppendASCII("LICENSE"); 5653 TestDelegate d; 5654 { 5655 URLRequest r( 5656 test_server_.GetURLWithUserAndPassword("/LICENSE", 5657 "wrong_user", 5658 "chrome"), 5659 &d, 5660 &default_context_); 5661 r.Start(); 5662 EXPECT_TRUE(r.is_pending()); 5663 5664 MessageLoop::current()->Run(); 5665 5666 int64 file_size = 0; 5667 file_util::GetFileSize(app_path, &file_size); 5668 5669 EXPECT_FALSE(r.is_pending()); 5670 EXPECT_EQ(1, d.response_started_count()); 5671 EXPECT_FALSE(d.received_data_before_response()); 5672 EXPECT_EQ(d.bytes_received(), 0); 5673 } 5674} 5675 5676// Flaky, see http://crbug.com/25045. 5677TEST_F(URLRequestTestFTP, DISABLED_FTPCheckWrongUserRestart) { 5678 ASSERT_TRUE(test_server_.Start()); 5679 5680 base::FilePath app_path; 5681 PathService::Get(base::DIR_SOURCE_ROOT, &app_path); 5682 app_path = app_path.AppendASCII("LICENSE"); 5683 TestDelegate d; 5684 // Set correct login credentials. The delegate will be asked for them when 5685 // the initial login with wrong credentials will fail. 5686 d.set_credentials(AuthCredentials(kChrome, kChrome)); 5687 { 5688 URLRequest r( 5689 test_server_.GetURLWithUserAndPassword("/LICENSE", 5690 "wrong_user", 5691 "chrome"), 5692 &d, 5693 &default_context_); 5694 r.Start(); 5695 EXPECT_TRUE(r.is_pending()); 5696 5697 MessageLoop::current()->Run(); 5698 5699 int64 file_size = 0; 5700 file_util::GetFileSize(app_path, &file_size); 5701 5702 EXPECT_FALSE(r.is_pending()); 5703 EXPECT_EQ(1, d.response_started_count()); 5704 EXPECT_FALSE(d.received_data_before_response()); 5705 EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size)); 5706 } 5707} 5708 5709// Flaky, see http://crbug.com/25045. 5710TEST_F(URLRequestTestFTP, DISABLED_FTPCacheURLCredentials) { 5711 ASSERT_TRUE(test_server_.Start()); 5712 5713 base::FilePath app_path; 5714 PathService::Get(base::DIR_SOURCE_ROOT, &app_path); 5715 app_path = app_path.AppendASCII("LICENSE"); 5716 5717 scoped_ptr<TestDelegate> d(new TestDelegate); 5718 { 5719 // Pass correct login identity in the URL. 5720 URLRequest r( 5721 test_server_.GetURLWithUserAndPassword("/LICENSE", 5722 "chrome", 5723 "chrome"), 5724 d.get(), 5725 &default_context_); 5726 r.Start(); 5727 EXPECT_TRUE(r.is_pending()); 5728 5729 MessageLoop::current()->Run(); 5730 5731 int64 file_size = 0; 5732 file_util::GetFileSize(app_path, &file_size); 5733 5734 EXPECT_FALSE(r.is_pending()); 5735 EXPECT_EQ(1, d->response_started_count()); 5736 EXPECT_FALSE(d->received_data_before_response()); 5737 EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size)); 5738 } 5739 5740 d.reset(new TestDelegate); 5741 { 5742 // This request should use cached identity from previous request. 5743 URLRequest r(test_server_.GetURL("/LICENSE"), d.get(), &default_context_); 5744 r.Start(); 5745 EXPECT_TRUE(r.is_pending()); 5746 5747 MessageLoop::current()->Run(); 5748 5749 int64 file_size = 0; 5750 file_util::GetFileSize(app_path, &file_size); 5751 5752 EXPECT_FALSE(r.is_pending()); 5753 EXPECT_EQ(1, d->response_started_count()); 5754 EXPECT_FALSE(d->received_data_before_response()); 5755 EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size)); 5756 } 5757} 5758 5759// Flaky, see http://crbug.com/25045. 5760TEST_F(URLRequestTestFTP, DISABLED_FTPCacheLoginBoxCredentials) { 5761 ASSERT_TRUE(test_server_.Start()); 5762 5763 base::FilePath app_path; 5764 PathService::Get(base::DIR_SOURCE_ROOT, &app_path); 5765 app_path = app_path.AppendASCII("LICENSE"); 5766 5767 scoped_ptr<TestDelegate> d(new TestDelegate); 5768 // Set correct login credentials. The delegate will be asked for them when 5769 // the initial login with wrong credentials will fail. 5770 d->set_credentials(AuthCredentials(kChrome, kChrome)); 5771 { 5772 URLRequest r( 5773 test_server_.GetURLWithUserAndPassword("/LICENSE", 5774 "chrome", 5775 "wrong_password"), 5776 d.get(), 5777 &default_context_); 5778 r.Start(); 5779 EXPECT_TRUE(r.is_pending()); 5780 5781 MessageLoop::current()->Run(); 5782 5783 int64 file_size = 0; 5784 file_util::GetFileSize(app_path, &file_size); 5785 5786 EXPECT_FALSE(r.is_pending()); 5787 EXPECT_EQ(1, d->response_started_count()); 5788 EXPECT_FALSE(d->received_data_before_response()); 5789 EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size)); 5790 } 5791 5792 // Use a new delegate without explicit credentials. The cached ones should be 5793 // used. 5794 d.reset(new TestDelegate); 5795 { 5796 // Don't pass wrong credentials in the URL, they would override valid cached 5797 // ones. 5798 URLRequest r(test_server_.GetURL("/LICENSE"), d.get(), &default_context_); 5799 r.Start(); 5800 EXPECT_TRUE(r.is_pending()); 5801 5802 MessageLoop::current()->Run(); 5803 5804 int64 file_size = 0; 5805 file_util::GetFileSize(app_path, &file_size); 5806 5807 EXPECT_FALSE(r.is_pending()); 5808 EXPECT_EQ(1, d->response_started_count()); 5809 EXPECT_FALSE(d->received_data_before_response()); 5810 EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size)); 5811 } 5812} 5813#endif // !defined(DISABLE_FTP_SUPPORT) 5814 5815} // namespace net 5816