url_request_unittest.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <shlobj.h> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/format_macros.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/process_util.h" 24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_piece.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_split.h" 29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/capturing_net_log.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/load_flags.h" 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/load_timing_info.h" 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/load_timing_info_test_util.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_log.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_log_unittest.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_module.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/test_data_directory.h" 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/upload_bytes_element_reader.h" 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/upload_data_stream.h" 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/upload_file_element_reader.h" 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/ev_root_ca_metadata.h" 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/test_root_certs.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_monster.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_store_test_helpers.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/disk_cache/disk_cache.h" 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/ftp/ftp_network_layer.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_cache.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_network_layer.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_network_session.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_request_headers.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_response_headers.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/ocsp/nss_ocsp.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_service.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/ssl_client_socket.h" 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/ssl/ssl_connection_status_flags.h" 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/test/cert_test_util.h" 60b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/test/spawned_test_server/spawned_test_server.h" 61b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/url_request/data_protocol_handler.h" 62b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/url_request/file_protocol_handler.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/ftp_protocol_handler.h" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/static_http_user_agent_settings.h" 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request.h" 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_file_dir_job.h" 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_http_job.h" 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_job_factory_impl.h" 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_redirect_job.h" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_test_job.h" 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_test_util.h" 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/platform_test.h" 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/scoped_com_initializer.h" 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/win/scoped_comptr.h" 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/windows_version.h" 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const base::string16 kChrome(ASCIIToUTF16("chrome")); 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const base::string16 kSecret(ASCIIToUTF16("secret")); 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const base::string16 kUser(ASCIIToUTF16("user")); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests load timing information in the case a fresh connection was used, with 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// no proxy. 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestLoadTimingNotReused(const net::LoadTimingInfo& load_timing_info, 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int connect_timing_flags) { 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(load_timing_info.socket_reused); 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id); 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(load_timing_info.request_start_time.is_null()); 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(load_timing_info.request_start.is_null()); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_LE(load_timing_info.request_start, 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) load_timing_info.connect_timing.connect_start); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExpectConnectTimingHasTimes(load_timing_info.connect_timing, 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) connect_timing_flags); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_LE(load_timing_info.connect_timing.connect_end, 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) load_timing_info.send_start); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_LE(load_timing_info.send_start, load_timing_info.send_end); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_LE(load_timing_info.send_end, load_timing_info.receive_headers_end); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(load_timing_info.proxy_resolve_start.is_null()); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(load_timing_info.proxy_resolve_end.is_null()); 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Same as above, but with proxy times. 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TestLoadTimingNotReusedWithProxy( 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const net::LoadTimingInfo& load_timing_info, 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int connect_timing_flags) { 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(load_timing_info.socket_reused); 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NE(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id); 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(load_timing_info.request_start_time.is_null()); 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(load_timing_info.request_start.is_null()); 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_LE(load_timing_info.request_start, 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_info.proxy_resolve_start); 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_LE(load_timing_info.proxy_resolve_start, 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_info.proxy_resolve_end); 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_LE(load_timing_info.proxy_resolve_end, 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_info.connect_timing.connect_start); 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExpectConnectTimingHasTimes(load_timing_info.connect_timing, 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connect_timing_flags); 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_LE(load_timing_info.connect_timing.connect_end, 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_info.send_start); 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_LE(load_timing_info.send_start, load_timing_info.send_end); 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_LE(load_timing_info.send_end, load_timing_info.receive_headers_end); 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Same as above, but with a reused socket and proxy times. 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TestLoadTimingReusedWithProxy( 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const net::LoadTimingInfo& load_timing_info) { 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(load_timing_info.socket_reused); 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NE(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id); 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(load_timing_info.request_start_time.is_null()); 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(load_timing_info.request_start.is_null()); 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing); 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_LE(load_timing_info.request_start, 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_info.proxy_resolve_start); 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_LE(load_timing_info.proxy_resolve_start, 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_info.proxy_resolve_end); 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_LE(load_timing_info.proxy_resolve_end, 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_info.send_start); 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_LE(load_timing_info.send_start, load_timing_info.send_end); 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_LE(load_timing_info.send_end, load_timing_info.receive_headers_end); 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 15990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Tests load timing information in the case of a cache hit, when no cache 16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// validation request was sent over the wire. 16190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void TestLoadTimingCacheHitNoNetwork( 16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const net::LoadTimingInfo& load_timing_info) { 16390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(load_timing_info.socket_reused); 16490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id); 16590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 16690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(load_timing_info.request_start_time.is_null()); 16790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(load_timing_info.request_start.is_null()); 16890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing); 17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_LE(load_timing_info.request_start, load_timing_info.send_start); 17190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_LE(load_timing_info.send_start, load_timing_info.send_end); 17290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_LE(load_timing_info.send_end, load_timing_info.receive_headers_end); 17390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 17490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(load_timing_info.proxy_resolve_start.is_null()); 17590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(load_timing_info.proxy_resolve_end.is_null()); 17690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 17790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Tests load timing in the case that there is no HTTP response. This can be 17990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// used to test in the case of errors or non-HTTP requests. 18090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void TestLoadTimingNoHttpResponse( 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const net::LoadTimingInfo& load_timing_info) { 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(load_timing_info.socket_reused); 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id); 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Only the request times should be non-null. 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(load_timing_info.request_start_time.is_null()); 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(load_timing_info.request_start.is_null()); 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing); 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(load_timing_info.proxy_resolve_start.is_null()); 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(load_timing_info.proxy_resolve_end.is_null()); 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(load_timing_info.send_start.is_null()); 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(load_timing_info.send_end.is_null()); 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(load_timing_info.receive_headers_end.is_null()); 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::StringPiece TestNetResourceProvider(int key) { 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "header"; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Do a case-insensitive search through |haystack| for |needle|. 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ContainsString(const std::string& haystack, const char* needle) { 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string::const_iterator it = 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::search(haystack.begin(), 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) haystack.end(), 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) needle, 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) needle + strlen(needle), 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::CaseInsensitiveCompare<char>()); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return it != haystack.end(); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FillBuffer(char* buffer, size_t len) { 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool called = false; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!called) { 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) called = true; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int seed = static_cast<int>(Time::Now().ToInternalValue()); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) srand(seed); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < len; i++) { 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer[i] = static_cast<char>(rand()); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!buffer[i]) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer[i] = 'g'; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)UploadDataStream* CreateSimpleUploadData(const char* data) { 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<UploadElementReader> reader( 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new UploadBytesElementReader(data, strlen(data))); 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return UploadDataStream::CreateWithReader(reader.Pass(), 0); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that the SSLInfo of a successful SSL connection has valid values. 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CheckSSLInfo(const SSLInfo& ssl_info) { 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allow ChromeFrame fake SSLInfo to get through. 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ssl_info.cert.get() && 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_info.cert.get()->issuer().GetDisplayName() == "Chrome Internal") { 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // -1 means unknown. 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ssl_info.security_bits, -1); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // -1 means unknown. 0 means no encryption. 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(ssl_info.security_bits, 0); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The cipher suite TLS_NULL_WITH_NULL_NULL (0) must not be negotiated. 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cipher_suite = SSLConnectionStatusToCipherSuite( 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_info.connection_status); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, cipher_suite); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 253eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid CheckFullRequestHeaders(const HttpRequestHeaders& headers, 254eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const GURL& host_url) { 255eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string sent_value; 256eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 257eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(headers.GetHeader("Host", &sent_value)); 258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(GetHostAndOptionalPort(host_url), sent_value); 259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 260eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(headers.GetHeader("Connection", &sent_value)); 261eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("keep-alive", sent_value); 262eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 263eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FingerprintsEqual(const HashValueVector& a, const HashValueVector& b) { 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t size = a.size(); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (size != b.size()) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < size; ++i) { 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!a[i].Equals(b[i])) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A network delegate that allows the user to choose a subset of request stages 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to block in. When blocking, the delegate can do one of the following: 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * synchronously return a pre-specified error code, or 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * asynchronously return that value via an automatically called callback, 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// or 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * block and wait for the user to do a callback. 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Additionally, the user may also specify a redirect URL -- then each request 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// with the current URL different from the redirect target will be redirected 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to that target, in the on-before-URL-request stage, independent of whether 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the delegate blocks in ON_BEFORE_URL_REQUEST or not. 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BlockingNetworkDelegate : public TestNetworkDelegate { 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stages in which the delegate can block. 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum Stage { 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOT_BLOCKED = 0, 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_BEFORE_URL_REQUEST = 1 << 0, 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_BEFORE_SEND_HEADERS = 1 << 1, 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_HEADERS_RECEIVED = 1 << 2, 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_AUTH_REQUIRED = 1 << 3 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Behavior during blocked stages. During other stages, just 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // returns net::OK or NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION. 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum BlockMode { 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SYNCHRONOUS, // No callback, returns specified return values. 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AUTO_CALLBACK, // |this| posts a task to run the callback using the 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // specified return codes. 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USER_CALLBACK, // User takes care of doing a callback. |retval_| and 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |auth_retval_| are ignored. In every blocking stage the 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // message loop is quit. 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a delegate which does not block at all. 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit BlockingNetworkDelegate(BlockMode block_mode); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For users to trigger a callback returning |response|. 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Side-effects: resets |stage_blocked_for_callback_| and stored callbacks. 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only call if |block_mode_| == USER_CALLBACK. 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DoCallback(int response); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DoAuthCallback(NetworkDelegate::AuthRequiredResponse response); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setters. 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_retval(int retval) { 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(USER_CALLBACK, block_mode_); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(ERR_IO_PENDING, retval); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(OK, retval); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) retval_ = retval; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If |auth_retval| == AUTH_REQUIRED_RESPONSE_SET_AUTH, then 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |auth_credentials_| will be passed with the response. 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_auth_retval(AuthRequiredResponse auth_retval) { 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(USER_CALLBACK, block_mode_); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(AUTH_REQUIRED_RESPONSE_IO_PENDING, auth_retval); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) auth_retval_ = auth_retval; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_auth_credentials(const AuthCredentials& auth_credentials) { 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) auth_credentials_ = auth_credentials; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_redirect_url(const GURL& url) { 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirect_url_ = url; 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_block_on(int block_on) { 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) block_on_ = block_on; 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allows the user to check in which state did we block. 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stage stage_blocked_for_callback() const { 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(USER_CALLBACK, block_mode_); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return stage_blocked_for_callback_; 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RunCallback(int response, const CompletionCallback& callback); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RunAuthCallback(AuthRequiredResponse response, 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AuthCallback& callback); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TestNetworkDelegate implementation. 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int OnBeforeURLRequest(URLRequest* request, 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback, 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL* new_url) OVERRIDE; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int OnBeforeSendHeaders(URLRequest* request, 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback, 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders* headers) OVERRIDE; 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int OnHeadersReceived( 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest* request, 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback, 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HttpResponseHeaders* original_response_headers, 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<HttpResponseHeaders>* override_response_headers) OVERRIDE; 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual NetworkDelegate::AuthRequiredResponse OnAuthRequired( 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest* request, 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AuthChallengeInfo& auth_info, 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AuthCallback& callback, 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthCredentials* credentials) OVERRIDE; 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Resets the callbacks and |stage_blocked_for_callback_|. 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Reset(); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Checks whether we should block in |stage|. If yes, returns an error code 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and optionally sets up callback based on |block_mode_|. If no, returns OK. 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int MaybeBlockStage(Stage stage, const CompletionCallback& callback); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Configuration parameters, can be adjusted by public methods: 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BlockMode block_mode_; 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Values returned on blocking stages when mode is SYNCHRONOUS or 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // AUTO_CALLBACK. For USER_CALLBACK these are set automatically to IO_PENDING. 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int retval_; // To be returned in non-auth stages. 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthRequiredResponse auth_retval_; 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL redirect_url_; // Used if non-empty. 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int block_on_; // Bit mask: in which stages to block. 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |auth_credentials_| will be copied to |*target_auth_credential_| on 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // callback. 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthCredentials auth_credentials_; 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthCredentials* target_auth_credentials_; 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Internal variables, not set by not the user: 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Last blocked stage waiting for user callback (unused if |block_mode_| != 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // USER_CALLBACK). 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stage stage_blocked_for_callback_; 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback objects stored during blocking stages. 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompletionCallback callback_; 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthCallback auth_callback_; 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WeakPtrFactory<BlockingNetworkDelegate> weak_factory_; 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BlockingNetworkDelegate); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BlockingNetworkDelegate::BlockingNetworkDelegate(BlockMode block_mode) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : block_mode_(block_mode), 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) retval_(OK), 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) auth_retval_(AUTH_REQUIRED_RESPONSE_NO_ACTION), 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) block_on_(0), 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_auth_credentials_(NULL), 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stage_blocked_for_callback_(NOT_BLOCKED), 422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) weak_factory_(this) { 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BlockingNetworkDelegate::DoCallback(int response) { 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(USER_CALLBACK, block_mode_); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(NOT_BLOCKED, stage_blocked_for_callback_); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(ON_AUTH_REQUIRED, stage_blocked_for_callback_); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompletionCallback callback = callback_; 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Reset(); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunCallback(response, callback); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BlockingNetworkDelegate::DoAuthCallback( 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegate::AuthRequiredResponse response) { 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(USER_CALLBACK, block_mode_); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(ON_AUTH_REQUIRED, stage_blocked_for_callback_); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthCallback auth_callback = auth_callback_; 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Reset(); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAuthCallback(response, auth_callback); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BlockingNetworkDelegate::RunCallback(int response, 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback) { 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(response); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BlockingNetworkDelegate::RunAuthCallback(AuthRequiredResponse response, 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AuthCallback& callback) { 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (auth_retval_ == AUTH_REQUIRED_RESPONSE_SET_AUTH) { 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(target_auth_credentials_ != NULL); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *target_auth_credentials_ = auth_credentials_; 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(response); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int BlockingNetworkDelegate::OnBeforeURLRequest( 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest* request, 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback, 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL* new_url) { 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (redirect_url_ == request->url()) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; // We've already seen this request and redirected elsewhere. 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate::OnBeforeURLRequest(request, callback, new_url); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!redirect_url_.is_empty()) 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *new_url = redirect_url_; 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return MaybeBlockStage(ON_BEFORE_URL_REQUEST, callback); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int BlockingNetworkDelegate::OnBeforeSendHeaders( 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest* request, 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback, 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders* headers) { 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate::OnBeforeSendHeaders(request, callback, headers); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return MaybeBlockStage(ON_BEFORE_SEND_HEADERS, callback); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int BlockingNetworkDelegate::OnHeadersReceived( 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest* request, 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback, 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HttpResponseHeaders* original_response_headers, 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<HttpResponseHeaders>* override_response_headers) { 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate::OnHeadersReceived( 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request, callback, original_response_headers, 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) override_response_headers); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return MaybeBlockStage(ON_HEADERS_RECEIVED, callback); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetworkDelegate::AuthRequiredResponse BlockingNetworkDelegate::OnAuthRequired( 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest* request, 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AuthChallengeInfo& auth_info, 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AuthCallback& callback, 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthCredentials* credentials) { 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate::OnAuthRequired(request, auth_info, callback, 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) credentials); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that the user has provided callback for the previous blocked stage. 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NOT_BLOCKED, stage_blocked_for_callback_); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((block_on_ & ON_AUTH_REQUIRED) == 0) { 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return AUTH_REQUIRED_RESPONSE_NO_ACTION; 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_auth_credentials_ = credentials; 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (block_mode_) { 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SYNCHRONOUS: 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (auth_retval_ == AUTH_REQUIRED_RESPONSE_SET_AUTH) 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *target_auth_credentials_ = auth_credentials_; 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return auth_retval_; 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AUTO_CALLBACK: 51690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask( 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&BlockingNetworkDelegate::RunAuthCallback, 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_factory_.GetWeakPtr(), auth_retval_, callback)); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return AUTH_REQUIRED_RESPONSE_IO_PENDING; 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case USER_CALLBACK: 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) auth_callback_ = callback; 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stage_blocked_for_callback_ = ON_AUTH_REQUIRED; 52590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, 52690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::QuitClosure()); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return AUTH_REQUIRED_RESPONSE_IO_PENDING; 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return AUTH_REQUIRED_RESPONSE_NO_ACTION; // Dummy value. 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BlockingNetworkDelegate::Reset() { 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(NOT_BLOCKED, stage_blocked_for_callback_); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stage_blocked_for_callback_ = NOT_BLOCKED; 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback_.Reset(); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) auth_callback_.Reset(); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int BlockingNetworkDelegate::MaybeBlockStage( 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::Stage stage, 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback) { 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that the user has provided callback for the previous blocked stage. 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NOT_BLOCKED, stage_blocked_for_callback_); 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((block_on_ & stage) == 0) { 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (block_mode_) { 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SYNCHRONOUS: 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(OK, retval_); 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return retval_; 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AUTO_CALLBACK: 55690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask( 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&BlockingNetworkDelegate::RunCallback, 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_factory_.GetWeakPtr(), retval_, callback)); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ERR_IO_PENDING; 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case USER_CALLBACK: 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback_ = callback; 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stage_blocked_for_callback_ = stage; 56590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, 56690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::QuitClosure()); 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ERR_IO_PENDING; 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestURLRequestContextWithProxy : public TestURLRequestContext { 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Does not own |delegate|. 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContextWithProxy(const std::string& proxy, 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegate* delegate) 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : TestURLRequestContext(true) { 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_storage_.set_proxy_service(ProxyService::CreateFixed(proxy)); 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_network_delegate(delegate); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Init(); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestURLRequestContextWithProxy() {} 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Inherit PlatformTest since we require the autorelease pool on Mac OS X. 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRequestTest : public PlatformTest { 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestTest() : default_context_(true) { 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&default_network_delegate_); 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default_context_.set_net_log(&net_log_); 594b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) job_factory_.SetProtocolHandler("data", new DataProtocolHandler); 595b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) job_factory_.SetProtocolHandler("file", new FileProtocolHandler); 596b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) default_context_.set_job_factory(&job_factory_); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.Init(); 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~URLRequestTest() {} 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds the TestJobInterceptor to the default context. 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestJobInterceptor* AddTestInterceptor() { 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestJobInterceptor* protocol_handler_ = new TestJobInterceptor(); 604b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) job_factory_.SetProtocolHandler("http", NULL); 605b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) job_factory_.SetProtocolHandler("http", protocol_handler_); 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return protocol_handler_; 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CapturingNetLog net_log_; 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNetworkDelegate default_network_delegate_; // Must outlive URLRequest. 612b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) URLRequestJobFactoryImpl job_factory_; 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext default_context_; 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, AboutBlankTest) { 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(GURL("about:blank"), &d, &default_context_); 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(!r.is_pending()); 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(d.bytes_received(), 0); 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", r.GetSocketAddress().host()); 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, r.GetSocketAddress().port()); 631eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 632eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch HttpRequestHeaders headers; 633eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(r.GetFullRequestHeaders(&headers)); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, DataURLImageTest) { 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use our nice little Chrome logo. 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(GURL( 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "data:image/png;base64," 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADVklEQVQ4jX2TfUwUBBjG3" 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "w1y+HGcd9dxhXR8T4awOccJGgOSWclHImznLkTlSw0DDQXkrmgYgbUYnlQTqQxIEVxitD" 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "5UMCATRA1CEEg+Qjw3bWDxIauJv/5oumqs39/P827vnucRmYN0gyF01GI5MpCVdW0gO7t" 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "vNC+vqSEtbZefk5NuLv1jdJ46p/zw0HeH4+PHr3h7c1mjoV2t5rKzMx1+fg9bAgK6zHq9" 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "cU5z+LpA3xOtx34+vTeT21onRuzssC3zxbbSwC13d/pFuC7CkIMDxQpF7r/MWq12UctI1" 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dWWm99ypqSYmRUBdKem8MkrO/kgaTt1O7YzlpzE5GIVd0WYUqt57yWf2McHTObYPbVD+Z" 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "wbtlLTVMZ3BW+TnLyXLaWtmEq6WJVbT3HBh3Svj2HQQcm43XwmtoYM6vVKleh0uoWvnzW" 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "3v3MpidruPTQPf0bia7sJOtBM0ufTWNvus/nkDFHF9ZS+uYVjRUasMeHUmyLYtcklTvzW" 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "GFZnNOXczThvpKIzjcahSqIzkvDLayDq6D3eOjtBbNUEIZYyqsvj4V4wY92eNJ4IoyhTb" 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xXX1T5xsV9tm9r4TQwHLiZw/pdDZJea8TKmsmR/K0uLh/GwnCHghTja6lPhphezPfO5/5" 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "MrVvMzNaI3+ERHfrFzPKQukrQGI4d/3EFD/3E2mVNYvi4at7CXWREaxZGD+3hg28zD3gV" 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Md6q5c8GdosynKmSeRuGzpjyl1/9UDGtPR5HeaKT8Wjo17WXk579BXVUhN64ehF9fhRtq" 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/uxxZKzNiZFGD0wRC3NFROZ5mwIPL/96K/rKMMLrIzF9uhHr+/sYH7DAbwlgC4J+R2Z7F" 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Ux1qLnV7MGF40smVSoJ/jvHRfYhQeUJd/SnYtGWhPHR0Sz+GE2F2yth0B36Vcz2KpnufB" 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "JbsysjjW4kblBUiIjiURUWqJY65zxbnTy57GQyH58zgy0QBtTQv5gH15XMdKkYu+TGaJM" 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "nlm2O34uI4b9tflqp1+QEFGzoW/ulmcofcpkZCYJhDfSpme7QcrHa+Xfji8paEQkTkSfm" 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "moRWRNZr/F1KfVMjW+IKEnv2FwZfKdzt0BQR6lClcZR0EfEXEfv/G6W9iLiIyCoReV5En" 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "hORIBHx+ufPj/gLB/zGI/G4Bk0AAAAASUVORK5CYII="), 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 66790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(!r.is_pending()); 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(d.bytes_received(), 911); 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", r.GetSocketAddress().host()); 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, r.GetSocketAddress().port()); 674eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 675eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch HttpRequestHeaders headers; 676eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(r.GetFullRequestHeaders(&headers)); 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, FileTest) { 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath app_path; 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(base::FILE_EXE, &app_path); 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL app_url = FilePathToFileURL(app_path); 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(app_url, &d, &default_context_); 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 69290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 file_size = -1; 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(file_util::GetFileSize(app_path, &file_size)); 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(!r.is_pending()); 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size)); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", r.GetSocketAddress().host()); 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, r.GetSocketAddress().port()); 703eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 704eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch HttpRequestHeaders headers; 705eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(r.GetFullRequestHeaders(&headers)); 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTest, FileTestCancel) { 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath app_path; 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PathService::Get(base::FILE_EXE, &app_path); 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL app_url = FilePathToFileURL(app_path); 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestDelegate d; 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequest r(app_url, &d, &default_context_); 7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) r.Start(); 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(r.is_pending()); 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) r.Cancel(); 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 722eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Async cancellation should be safe even when URLRequest has been already 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // destroyed. 72490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, FileTestFullSpecifiedRange) { 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t buffer_size = 4000; 729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<char[]> buffer(new char[buffer_size]); 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillBuffer(buffer.get(), buffer_size); 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath temp_path; 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(file_util::CreateTemporaryFile(&temp_path)); 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL temp_url = FilePathToFileURL(temp_path); 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(file_util::WriteFile(temp_path, buffer.get(), buffer_size)); 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 file_size; 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(file_util::GetFileSize(temp_path, &file_size)); 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t first_byte_position = 500; 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t last_byte_position = buffer_size - first_byte_position; 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t content_length = last_byte_position - first_byte_position + 1; 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string partial_buffer_string(buffer.get() + first_byte_position, 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer.get() + last_byte_position + 1); 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(temp_url, &d, &default_context_); 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders headers; 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.SetHeader(HttpRequestHeaders::kRange, 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf( 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "bytes=%" PRIuS "-%" PRIuS, 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_byte_position, last_byte_position)); 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.SetExtraRequestHeaders(headers); 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(!r.is_pending()); 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<int>(content_length), d.bytes_received()); 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't use EXPECT_EQ, it will print out a lot of garbage if check failed. 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(partial_buffer_string == d.data_received()); 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 768eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(base::Delete(temp_path, false)); 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, FileTestHalfSpecifiedRange) { 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t buffer_size = 4000; 773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<char[]> buffer(new char[buffer_size]); 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillBuffer(buffer.get(), buffer_size); 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath temp_path; 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(file_util::CreateTemporaryFile(&temp_path)); 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL temp_url = FilePathToFileURL(temp_path); 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(file_util::WriteFile(temp_path, buffer.get(), buffer_size)); 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 file_size; 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(file_util::GetFileSize(temp_path, &file_size)); 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t first_byte_position = 500; 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t last_byte_position = buffer_size - 1; 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t content_length = last_byte_position - first_byte_position + 1; 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string partial_buffer_string(buffer.get() + first_byte_position, 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer.get() + last_byte_position + 1); 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(temp_url, &d, &default_context_); 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders headers; 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.SetHeader(HttpRequestHeaders::kRange, 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("bytes=%" PRIuS "-", 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_byte_position)); 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.SetExtraRequestHeaders(headers); 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 80290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(!r.is_pending()); 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<int>(content_length), d.bytes_received()); 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't use EXPECT_EQ, it will print out a lot of garbage if check failed. 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(partial_buffer_string == d.data_received()); 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 811eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(base::Delete(temp_path, false)); 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, FileTestMultipleRanges) { 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t buffer_size = 400000; 816c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<char[]> buffer(new char[buffer_size]); 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillBuffer(buffer.get(), buffer_size); 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath temp_path; 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(file_util::CreateTemporaryFile(&temp_path)); 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL temp_url = FilePathToFileURL(temp_path); 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(file_util::WriteFile(temp_path, buffer.get(), buffer_size)); 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 file_size; 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(file_util::GetFileSize(temp_path, &file_size)); 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(temp_url, &d, &default_context_); 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders headers; 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.SetHeader(HttpRequestHeaders::kRange, 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "bytes=0-0,10-200,200-300"); 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.SetExtraRequestHeaders(headers); 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 83890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.request_failed()); 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 842eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(base::Delete(temp_path, false)); 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, InvalidUrlTest) { 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(GURL("invalid url"), &d, &default_context_); 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.request_failed()); 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, ResolveShortcutTest) { 8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath app_path; 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(base::DIR_SOURCE_ROOT, &app_path); 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_path = app_path.AppendASCII("net"); 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_path = app_path.AppendASCII("data"); 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_path = app_path.AppendASCII("url_request_unittest"); 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_path = app_path.AppendASCII("with-headers.html"); 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::wstring lnk_path = app_path.value() + L".lnk"; 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::ScopedCOMInitializer com_initializer; 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Temporarily create a shortcut for test 872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::win::ScopedComPtr<IShellLink> shell; 874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(SUCCEEDED(shell.CreateInstance(CLSID_ShellLink, NULL, 875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CLSCTX_INPROC_SERVER))); 876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::win::ScopedComPtr<IPersistFile> persist; 877c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(SUCCEEDED(shell.QueryInterface(persist.Receive()))); 878c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(SUCCEEDED(shell->SetPath(app_path.value().c_str()))); 879c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(SUCCEEDED(shell->SetDescription(L"ResolveShortcutTest"))); 880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(SUCCEEDED(persist->Save(lnk_path.c_str(), TRUE))); 881c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequest r(FilePathToFileURL(base::FilePath(lnk_path)), &d, 8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &default_context_); 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 89190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WIN32_FILE_ATTRIBUTE_DATA data; 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetFileAttributesEx(app_path.value().c_str(), 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetFileExInfoStandard, &data); 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HANDLE file = CreateFile(app_path.value().c_str(), GENERIC_READ, 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_SHARE_READ, NULL, OPEN_EXISTING, 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_ATTRIBUTE_NORMAL, NULL); 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(INVALID_HANDLE_VALUE, file); 900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<char[]> buffer(new char[data.nFileSizeLow]); 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DWORD read_size; 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BOOL result; 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = ReadFile(file, buffer.get(), data.nFileSizeLow, 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &read_size, NULL); 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string content(buffer.get(), read_size); 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloseHandle(file); 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(!r.is_pending()); 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.received_redirect_count()); 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(content, d.data_received()); 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clean the shortcut 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeleteFile(lnk_path.c_str()); 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_WIN) 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, FileDirCancelTest) { 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Put in mock resource provider. 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetModule::SetResourceProvider(TestNetResourceProvider); 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file_path; 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(base::DIR_SOURCE_ROOT, &file_path); 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_path = file_path.Append(FILE_PATH_LITERAL("net")); 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_path = file_path.Append(FILE_PATH_LITERAL("data")); 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(FilePathToFileURL(file_path), &d, &default_context_); 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(req.is_pending()); 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_cancel_in_received_data_pending(true); 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 93590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Take out mock resource provider. 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetModule::SetResourceProvider(NULL); 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, FileDirRedirectNoCrash) { 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There is an implicit redirect when loading a file path that matches a 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // directory and does not end with a slash. Ensure that following such 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // redirects does not crash. See http://crbug.com/18686. 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath path; 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(base::DIR_SOURCE_ROOT, &path); 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.Append(FILE_PATH_LITERAL("net")); 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.Append(FILE_PATH_LITERAL("data")); 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.Append(FILE_PATH_LITERAL("url_request_unittest")); 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(FilePathToFileURL(path), &d, &default_context_); 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 95690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, d.received_redirect_count()); 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LT(0, d.bytes_received()); 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(d.request_failed()); 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(req.status().is_success()); 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Don't accept the url "file:///" on windows. See http://crbug.com/1474. 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, FileDirRedirectSingleSlash) { 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(GURL("file:///"), &d, &default_context_); 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 97090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, d.received_redirect_count()); 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(req.status().is_success()); 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Custom URLRequestJobs for use with interceptor tests 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RestartTestJob : public URLRequestTestJob { 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RestartTestJob(URLRequest* request, NetworkDelegate* network_delegate) 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : URLRequestTestJob(request, network_delegate, true) {} 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void StartAsync() OVERRIDE { 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this->NotifyRestartRequired(); 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~RestartTestJob() {} 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CancelTestJob : public URLRequestTestJob { 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit CancelTestJob(URLRequest* request, NetworkDelegate* network_delegate) 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : URLRequestTestJob(request, network_delegate, true) {} 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void StartAsync() OVERRIDE { 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_->Cancel(); 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~CancelTestJob() {} 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CancelThenRestartTestJob : public URLRequestTestJob { 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit CancelThenRestartTestJob(URLRequest* request, 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegate* network_delegate) 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : URLRequestTestJob(request, network_delegate, true) { 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void StartAsync() OVERRIDE { 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_->Cancel(); 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this->NotifyRestartRequired(); 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~CancelThenRestartTestJob() {} 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An Interceptor for use with interceptor tests 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestInterceptor : URLRequest::Interceptor { 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestInterceptor() 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : intercept_main_request_(false), restart_main_request_(false), 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cancel_main_request_(false), cancel_then_restart_main_request_(false), 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) simulate_main_network_error_(false), 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) intercept_redirect_(false), cancel_redirect_request_(false), 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) intercept_final_response_(false), cancel_final_request_(false), 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_intercept_main_(false), did_restart_main_(false), 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_cancel_main_(false), did_cancel_then_restart_main_(false), 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_simulate_error_main_(false), 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_intercept_redirect_(false), did_cancel_redirect_(false), 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_intercept_final_(false), did_cancel_final_(false) { 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest::Deprecated::RegisterRequestInterceptor(this); 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~TestInterceptor() { 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest::Deprecated::UnregisterRequestInterceptor(this); 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual URLRequestJob* MaybeIntercept( 10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequest* request, 10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkDelegate* network_delegate) OVERRIDE { 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (restart_main_request_) { 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) restart_main_request_ = false; 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_restart_main_ = true; 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new RestartTestJob(request, network_delegate); 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cancel_main_request_) { 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cancel_main_request_ = false; 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_cancel_main_ = true; 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new CancelTestJob(request, network_delegate); 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cancel_then_restart_main_request_) { 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cancel_then_restart_main_request_ = false; 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_cancel_then_restart_main_ = true; 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new CancelThenRestartTestJob(request, network_delegate); 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (simulate_main_network_error_) { 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) simulate_main_network_error_ = false; 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_simulate_error_main_ = true; 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will error since the requeted url is not one of its canned urls 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new URLRequestTestJob(request, network_delegate, true); 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!intercept_main_request_) 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) intercept_main_request_ = false; 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_intercept_main_ = true; 1066c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequestTestJob* job = new URLRequestTestJob(request, 1067c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) network_delegate, 1068c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) main_headers_, 1069c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) main_data_, 1070c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) true); 1071c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) job->set_load_timing_info(main_request_load_timing_info_); 1072c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return job; 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual URLRequestJob* MaybeInterceptRedirect( 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest* request, 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegate* network_delegate, 10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& location) OVERRIDE { 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cancel_redirect_request_) { 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cancel_redirect_request_ = false; 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_cancel_redirect_ = true; 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new CancelTestJob(request, network_delegate); 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!intercept_redirect_) 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) intercept_redirect_ = false; 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_intercept_redirect_ = true; 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new URLRequestTestJob(request, 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate, 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirect_headers_, 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirect_data_, 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true); 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual URLRequestJob* MaybeInterceptResponse( 10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequest* request, NetworkDelegate* network_delegate) OVERRIDE { 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cancel_final_request_) { 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cancel_final_request_ = false; 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_cancel_final_ = true; 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new CancelTestJob(request, network_delegate); 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!intercept_final_response_) 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) intercept_final_response_ = false; 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_intercept_final_ = true; 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new URLRequestTestJob(request, 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate, 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final_headers_, 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final_data_, 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true); 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Whether to intercept the main request, and if so the response to return and 1114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the LoadTimingInfo to use. 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool intercept_main_request_; 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string main_headers_; 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string main_data_; 1118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadTimingInfo main_request_load_timing_info_; 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Other actions we take at MaybeIntercept time 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool restart_main_request_; 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool cancel_main_request_; 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool cancel_then_restart_main_request_; 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool simulate_main_network_error_; 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether to intercept redirects, and if so the response to return. 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool intercept_redirect_; 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string redirect_headers_; 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string redirect_data_; 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Other actions we can take at MaybeInterceptRedirect time 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool cancel_redirect_request_; 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether to intercept final response, and if so the response to return. 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool intercept_final_response_; 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string final_headers_; 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string final_data_; 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Other actions we can take at MaybeInterceptResponse time 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool cancel_final_request_; 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we did something or not 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_intercept_main_; 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_restart_main_; 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_cancel_main_; 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_cancel_then_restart_main_; 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_simulate_error_main_; 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_intercept_redirect_; 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_cancel_redirect_; 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_intercept_final_; 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_cancel_final_; 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Static getters for canned response header and data strings 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static std::string ok_data() { 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return URLRequestTestJob::test_data_1(); 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static std::string ok_headers() { 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return URLRequestTestJob::test_headers(); 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static std::string redirect_data() { 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::string(); 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static std::string redirect_headers() { 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return URLRequestTestJob::test_redirect_headers(); 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static std::string error_data() { 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::string("ohhh nooooo mr. bill!"); 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static std::string error_headers() { 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return URLRequestTestJob::test_error_headers(); 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, Intercept) { 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestInterceptor interceptor; 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // intercept the main request and respond with a simple response 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.intercept_main_request_ = true; 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.main_headers_ = TestInterceptor::ok_headers(); 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.main_data_ = TestInterceptor::ok_data(); 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_); 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SupportsUserData::Data* user_data0 = new base::SupportsUserData::Data(); 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SupportsUserData::Data* user_data1 = new base::SupportsUserData::Data(); 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SupportsUserData::Data* user_data2 = new base::SupportsUserData::Data(); 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.SetUserData(NULL, user_data0); 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.SetUserData(&user_data1, user_data1); 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.SetUserData(&user_data2, user_data2); 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.set_method("GET"); 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 119890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure we can retrieve our specific user data 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(user_data0, req.GetUserData(NULL)); 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(user_data1, req.GetUserData(&user_data1)); 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(user_data2, req.GetUserData(&user_data2)); 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the interceptor got called as expected 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(interceptor.did_intercept_main_); 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we got one good response 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(req.status().is_success()); 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(200, req.response_headers()->response_code()); 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(TestInterceptor::ok_data(), d.data_received()); 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d.received_redirect_count()); 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, InterceptRedirect) { 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestInterceptor interceptor; 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // intercept the main request and respond with a redirect 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.intercept_main_request_ = true; 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.main_headers_ = TestInterceptor::redirect_headers(); 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.main_data_ = TestInterceptor::redirect_data(); 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // intercept that redirect and respond a final OK response 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.intercept_redirect_ = true; 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.redirect_headers_ = TestInterceptor::ok_headers(); 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.redirect_data_ = TestInterceptor::ok_data(); 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_); 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.set_method("GET"); 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 123390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the interceptor got called as expected 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(interceptor.did_intercept_main_); 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(interceptor.did_intercept_redirect_); 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we got one good response 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(req.status().is_success()); 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (req.status().is_success()) { 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(200, req.response_headers()->response_code()); 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(TestInterceptor::ok_data(), d.data_received()); 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d.received_redirect_count()); 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, InterceptServerError) { 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestInterceptor interceptor; 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // intercept the main request to generate a server error response 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.intercept_main_request_ = true; 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.main_headers_ = TestInterceptor::error_headers(); 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.main_data_ = TestInterceptor::error_data(); 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // intercept that error and respond with an OK response 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.intercept_final_response_ = true; 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.final_headers_ = TestInterceptor::ok_headers(); 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.final_data_ = TestInterceptor::ok_data(); 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_); 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.set_method("GET"); 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 126690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the interceptor got called as expected 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(interceptor.did_intercept_main_); 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(interceptor.did_intercept_final_); 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we got one good response 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(req.status().is_success()); 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(200, req.response_headers()->response_code()); 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(TestInterceptor::ok_data(), d.data_received()); 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d.received_redirect_count()); 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, InterceptNetworkError) { 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestInterceptor interceptor; 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // intercept the main request to simulate a network error 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.simulate_main_network_error_ = true; 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // intercept that error and respond with an OK response 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.intercept_final_response_ = true; 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.final_headers_ = TestInterceptor::ok_headers(); 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.final_data_ = TestInterceptor::ok_data(); 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_); 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.set_method("GET"); 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 129590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the interceptor got called as expected 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(interceptor.did_simulate_error_main_); 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(interceptor.did_intercept_final_); 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we received one good response 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(req.status().is_success()); 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(200, req.response_headers()->response_code()); 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(TestInterceptor::ok_data(), d.data_received()); 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d.received_redirect_count()); 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, InterceptRestartRequired) { 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestInterceptor interceptor; 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // restart the main request 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.restart_main_request_ = true; 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // then intercept the new main request and respond with an OK response 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.intercept_main_request_ = true; 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.main_headers_ = TestInterceptor::ok_headers(); 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.main_data_ = TestInterceptor::ok_data(); 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_); 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.set_method("GET"); 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 132490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the interceptor got called as expected 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(interceptor.did_restart_main_); 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(interceptor.did_intercept_main_); 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we received one good response 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(req.status().is_success()); 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (req.status().is_success()) { 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(200, req.response_headers()->response_code()); 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(TestInterceptor::ok_data(), d.data_received()); 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d.received_redirect_count()); 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, InterceptRespectsCancelMain) { 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestInterceptor interceptor; 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // intercept the main request and cancel from within the restarted job 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.cancel_main_request_ = true; 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // setup to intercept final response and override it with an OK response 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.intercept_final_response_ = true; 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.final_headers_ = TestInterceptor::ok_headers(); 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.final_data_ = TestInterceptor::ok_data(); 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_); 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.set_method("GET"); 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 135590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the interceptor got called as expected 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(interceptor.did_cancel_main_); 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(interceptor.did_intercept_final_); 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we see a canceled request 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(req.status().is_success()); 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status()); 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, InterceptRespectsCancelRedirect) { 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestInterceptor interceptor; 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // intercept the main request and respond with a redirect 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.intercept_main_request_ = true; 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.main_headers_ = TestInterceptor::redirect_headers(); 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.main_data_ = TestInterceptor::redirect_data(); 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // intercept the redirect and cancel from within that job 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.cancel_redirect_request_ = true; 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // setup to intercept final response and override it with an OK response 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.intercept_final_response_ = true; 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.final_headers_ = TestInterceptor::ok_headers(); 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.final_data_ = TestInterceptor::ok_data(); 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_); 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.set_method("GET"); 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 138690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the interceptor got called as expected 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(interceptor.did_intercept_main_); 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(interceptor.did_cancel_redirect_); 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(interceptor.did_intercept_final_); 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we see a canceled request 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(req.status().is_success()); 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status()); 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, InterceptRespectsCancelFinal) { 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestInterceptor interceptor; 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // intercept the main request to simulate a network error 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.simulate_main_network_error_ = true; 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // setup to intercept final response and cancel from within that job 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.cancel_final_request_ = true; 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_); 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.set_method("GET"); 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 141190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the interceptor got called as expected 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(interceptor.did_simulate_error_main_); 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(interceptor.did_cancel_final_); 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we see a canceled request 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(req.status().is_success()); 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status()); 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, InterceptRespectsCancelInRestart) { 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestInterceptor interceptor; 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // intercept the main request and cancel then restart from within that job 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.cancel_then_restart_main_request_ = true; 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // setup to intercept final response and override it with an OK response 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.intercept_final_response_ = true; 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.final_headers_ = TestInterceptor::ok_headers(); 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.final_data_ = TestInterceptor::ok_data(); 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_); 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.set_method("GET"); 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 143790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the interceptor got called as expected 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(interceptor.did_cancel_then_restart_main_); 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(interceptor.did_intercept_final_); 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we see a canceled request 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(req.status().is_success()); 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status()); 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)LoadTimingInfo RunLoadTimingTest(const LoadTimingInfo& job_load_timing, 1449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequestContext* context) { 1450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestInterceptor interceptor; 1451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) interceptor.intercept_main_request_ = true; 1452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) interceptor.main_request_load_timing_info_ = job_load_timing; 1453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestDelegate d; 1454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest req(GURL("http://test_intercept/foo"), &d, context); 1455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) req.Start(); 145690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 1457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadTimingInfo resulting_load_timing; 1459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) req.GetLoadTimingInfo(&resulting_load_timing); 1460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // None of these should be modified by the URLRequest. 1462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.socket_reused, resulting_load_timing.socket_reused); 1463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.socket_log_id, resulting_load_timing.socket_log_id); 1464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.send_start, resulting_load_timing.send_start); 1465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.send_end, resulting_load_timing.send_end); 1466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.receive_headers_end, 1467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) resulting_load_timing.receive_headers_end); 1468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return resulting_load_timing; 1470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// "Normal" LoadTimingInfo as returned by a job. Everything is in order, not 1473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// reused. |connect_time_flags| is used to indicate if there should be dns 1474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// or SSL times, and |used_proxy| is used for proxy times. 1475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)LoadTimingInfo NormalLoadTimingInfo(base::TimeTicks now, 1476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int connect_time_flags, 1477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool used_proxy) { 1478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadTimingInfo load_timing; 1479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing.socket_log_id = 1; 1480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (used_proxy) { 1482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing.proxy_resolve_start = now + base::TimeDelta::FromDays(1); 1483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing.proxy_resolve_end = now + base::TimeDelta::FromDays(2); 1484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadTimingInfo::ConnectTiming& connect_timing = load_timing.connect_timing; 1487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (connect_time_flags & CONNECT_TIMING_HAS_DNS_TIMES) { 1488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connect_timing.dns_start = now + base::TimeDelta::FromDays(3); 1489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connect_timing.dns_end = now + base::TimeDelta::FromDays(4); 1490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connect_timing.connect_start = now + base::TimeDelta::FromDays(5); 1492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (connect_time_flags & CONNECT_TIMING_HAS_SSL_TIMES) { 1493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connect_timing.ssl_start = now + base::TimeDelta::FromDays(6); 1494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connect_timing.ssl_end = now + base::TimeDelta::FromDays(7); 1495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connect_timing.connect_end = now + base::TimeDelta::FromDays(8); 1497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing.send_start = now + base::TimeDelta::FromDays(9); 1499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing.send_end = now + base::TimeDelta::FromDays(10); 1500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing.receive_headers_end = now + base::TimeDelta::FromDays(11); 1501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return load_timing; 1502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Same as above, but in the case of a reused socket. 1505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)LoadTimingInfo NormalLoadTimingInfoReused(base::TimeTicks now, 1506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool used_proxy) { 1507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadTimingInfo load_timing; 1508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing.socket_log_id = 1; 1509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing.socket_reused = true; 1510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (used_proxy) { 1512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing.proxy_resolve_start = now + base::TimeDelta::FromDays(1); 1513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing.proxy_resolve_end = now + base::TimeDelta::FromDays(2); 1514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing.send_start = now + base::TimeDelta::FromDays(9); 1517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing.send_end = now + base::TimeDelta::FromDays(10); 1518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing.receive_headers_end = now + base::TimeDelta::FromDays(11); 1519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return load_timing; 1520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Basic test that the intercept + load timing tests work. 1523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(URLRequestTest, InterceptLoadTiming) { 1524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeTicks now = base::TimeTicks::Now(); 1525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadTimingInfo job_load_timing = 1526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_DNS_TIMES, false); 1527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing, 1529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &default_context_); 1530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Nothing should have been changed by the URLRequest. 1532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.proxy_resolve_start, 1533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.proxy_resolve_start); 1534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.proxy_resolve_end, 1535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.proxy_resolve_end); 1536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.connect_timing.dns_start, 1537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.dns_start); 1538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.connect_timing.dns_end, 1539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.dns_end); 1540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.connect_timing.connect_start, 1541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.connect_start); 1542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.connect_timing.connect_end, 1543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.connect_end); 1544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.connect_timing.ssl_start, 1545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.ssl_start); 1546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.connect_timing.ssl_end, 1547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.ssl_end); 1548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Redundant sanity check. 1550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestLoadTimingNotReused(load_timing_result, CONNECT_TIMING_HAS_DNS_TIMES); 1551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Another basic test, with proxy and SSL times, but no DNS times. 1554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(URLRequestTest, InterceptLoadTimingProxy) { 1555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeTicks now = base::TimeTicks::Now(); 1556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadTimingInfo job_load_timing = 1557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_SSL_TIMES, true); 1558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing, 1560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &default_context_); 1561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Nothing should have been changed by the URLRequest. 1563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.proxy_resolve_start, 1564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.proxy_resolve_start); 1565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.proxy_resolve_end, 1566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.proxy_resolve_end); 1567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.connect_timing.dns_start, 1568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.dns_start); 1569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.connect_timing.dns_end, 1570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.dns_end); 1571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.connect_timing.connect_start, 1572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.connect_start); 1573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.connect_timing.connect_end, 1574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.connect_end); 1575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.connect_timing.ssl_start, 1576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.ssl_start); 1577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.connect_timing.ssl_end, 1578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.ssl_end); 1579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Redundant sanity check. 1581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestLoadTimingNotReusedWithProxy(load_timing_result, 1582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CONNECT_TIMING_HAS_SSL_TIMES); 1583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Make sure that URLRequest correctly adjusts proxy times when they're before 1586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// |request_start|, due to already having a connected socket. This happens in 1587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// the case of reusing a SPDY session or HTTP pipeline. The connected socket is 1588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// not considered reused in this test (May be a preconnect). 1589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 1590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// To mix things up from the test above, assumes DNS times but no SSL times. 1591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(URLRequestTest, InterceptLoadTimingEarlyProxyResolution) { 1592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeTicks now = base::TimeTicks::Now(); 1593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadTimingInfo job_load_timing = 1594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_DNS_TIMES, true); 1595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) job_load_timing.proxy_resolve_start = now - base::TimeDelta::FromDays(6); 1596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) job_load_timing.proxy_resolve_end = now - base::TimeDelta::FromDays(5); 1597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) job_load_timing.connect_timing.dns_start = now - base::TimeDelta::FromDays(4); 1598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) job_load_timing.connect_timing.dns_end = now - base::TimeDelta::FromDays(3); 1599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) job_load_timing.connect_timing.connect_start = 1600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) now - base::TimeDelta::FromDays(2); 1601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) job_load_timing.connect_timing.connect_end = 1602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) now - base::TimeDelta::FromDays(1); 1603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing, 1605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &default_context_); 1606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Proxy times, connect times, and DNS times should all be replaced with 1608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // request_start. 1609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(load_timing_result.request_start, 1610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.proxy_resolve_start); 1611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(load_timing_result.request_start, 1612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.proxy_resolve_end); 1613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(load_timing_result.request_start, 1614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.dns_start); 1615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(load_timing_result.request_start, 1616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.dns_end); 1617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(load_timing_result.request_start, 1618c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.connect_start); 1619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(load_timing_result.request_start, 1620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.connect_end); 1621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Other times should have been left null. 1623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestLoadTimingNotReusedWithProxy(load_timing_result, 1624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CONNECT_TIMING_HAS_DNS_TIMES); 1625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Same as above, but in the reused case. 1628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(URLRequestTest, InterceptLoadTimingEarlyProxyResolutionReused) { 1629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeTicks now = base::TimeTicks::Now(); 1630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadTimingInfo job_load_timing = NormalLoadTimingInfoReused(now, true); 1631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) job_load_timing.proxy_resolve_start = now - base::TimeDelta::FromDays(4); 1632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) job_load_timing.proxy_resolve_end = now - base::TimeDelta::FromDays(3); 1633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing, 1635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &default_context_); 1636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Proxy times and connect times should all be replaced with request_start. 1638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(load_timing_result.request_start, 1639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.proxy_resolve_start); 1640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(load_timing_result.request_start, 1641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.proxy_resolve_end); 1642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Other times should have been left null. 1644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestLoadTimingReusedWithProxy(load_timing_result); 1645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Make sure that URLRequest correctly adjusts connect times when they're before 1648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// |request_start|, due to reusing a connected socket. The connected socket is 1649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// not considered reused in this test (May be a preconnect). 1650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 1651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// To mix things up, the request has SSL times, but no DNS times. 1652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(URLRequestTest, InterceptLoadTimingEarlyConnect) { 1653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeTicks now = base::TimeTicks::Now(); 1654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadTimingInfo job_load_timing = 1655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_SSL_TIMES, false); 1656c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) job_load_timing.connect_timing.connect_start = 1657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) now - base::TimeDelta::FromDays(1); 1658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) job_load_timing.connect_timing.ssl_start = now - base::TimeDelta::FromDays(2); 1659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) job_load_timing.connect_timing.ssl_end = now - base::TimeDelta::FromDays(3); 1660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) job_load_timing.connect_timing.connect_end = 1661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) now - base::TimeDelta::FromDays(4); 1662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing, 1664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &default_context_); 1665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Connect times, and SSL times should be replaced with request_start. 1667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(load_timing_result.request_start, 1668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.connect_start); 1669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(load_timing_result.request_start, 1670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.ssl_start); 1671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(load_timing_result.request_start, 1672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.ssl_end); 1673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(load_timing_result.request_start, 1674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.connect_end); 1675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Other times should have been left null. 1677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestLoadTimingNotReused(load_timing_result, CONNECT_TIMING_HAS_SSL_TIMES); 1678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Make sure that URLRequest correctly adjusts connect times when they're before 1681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// |request_start|, due to reusing a connected socket in the case that there 1682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// are also proxy times. The connected socket is not considered reused in this 1683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// test (May be a preconnect). 1684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 1685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// In this test, there are no SSL or DNS times. 1686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(URLRequestTest, InterceptLoadTimingEarlyConnectWithProxy) { 1687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeTicks now = base::TimeTicks::Now(); 1688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadTimingInfo job_load_timing = 1689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY, true); 1690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) job_load_timing.connect_timing.connect_start = 1691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) now - base::TimeDelta::FromDays(1); 1692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) job_load_timing.connect_timing.connect_end = 1693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) now - base::TimeDelta::FromDays(2); 1694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing, 1696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &default_context_); 1697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Connect times should be replaced with proxy_resolve_end. 1699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(load_timing_result.proxy_resolve_end, 1700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.connect_start); 1701c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(load_timing_result.proxy_resolve_end, 1702c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.connect_end); 1703c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1704c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Other times should have been left null. 1705c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestLoadTimingNotReusedWithProxy(load_timing_result, 1706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY); 1707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that two different URL requests have different identifiers. 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, Identifiers) { 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context; 17132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestURLRequest req(GURL("http://example.com"), &d, &context, NULL); 17142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestURLRequest other_req(GURL("http://example.com"), &d, &context, NULL); 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(req.identifier(), other_req.identifier()); 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that a failure to connect to the proxy is reported to the network 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// delegate. 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, NetworkDelegateProxyError) { 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockHostResolver host_resolver; 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_resolver.rules()->AddSimulatedFailure("*"); 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNetworkDelegate network_delegate; // Must outlive URLRequests. 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContextWithProxy context("myproxy:70", &network_delegate); 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(GURL("http://example.com"), &d, &context); 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.set_method("GET"); 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 173390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we see a failed request. 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(req.status().is_success()); 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::FAILED, req.status().status()); 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, req.status().error()); 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.error_count()); 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, network_delegate.last_error()); 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.completed_requests()); 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure that net::NetworkDelegate::NotifyCompleted is called if 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// content is empty. 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, RequestCompletionForEmptyResponse) { 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(GURL("data:,"), &d, &default_context_); 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 175190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", d.data_received()); 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, default_network_delegate_.completed_requests()); 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Make sure that SetPriority actually sets the URLRequest's priority 17572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// correctly, both before and after start. 17582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTest, SetPriorityBasic) { 17592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestDelegate d; 17602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_); 17612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(DEFAULT_PRIORITY, req.priority()); 17622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.SetPriority(LOW); 17642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(LOW, req.priority()); 17652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.Start(); 17672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(LOW, req.priority()); 17682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.SetPriority(MEDIUM); 17702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(MEDIUM, req.priority()); 17712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 17722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Make sure that URLRequest calls SetPriority on a job before calling 17742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Start on it. 17752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTest, SetJobPriorityBeforeJobStart) { 17762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestDelegate d; 17772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_); 17782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(DEFAULT_PRIORITY, req.priority()); 17792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<URLRequestTestJob> job = 17812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new URLRequestTestJob(&req, &default_network_delegate_); 1782868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) AddTestInterceptor()->set_main_intercept_job(job.get()); 17832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(DEFAULT_PRIORITY, job->priority()); 17842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.SetPriority(LOW); 17862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.Start(); 17882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(LOW, job->priority()); 17892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 17902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Make sure that URLRequest passes on its priority updates to its 17922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// job. 17932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTest, SetJobPriority) { 17942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestDelegate d; 17952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_); 17962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<URLRequestTestJob> job = 17982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new URLRequestTestJob(&req, &default_network_delegate_); 1799868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) AddTestInterceptor()->set_main_intercept_job(job.get()); 18002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.SetPriority(LOW); 18022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.Start(); 18032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(LOW, job->priority()); 18042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.SetPriority(MEDIUM); 18062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(MEDIUM, req.priority()); 18072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(MEDIUM, job->priority()); 18082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 18092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(droger): Support SpawnedTestServer on iOS (see http://crbug.com/148666). 18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_IOS) 1812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// A subclass of SpawnedTestServer that uses a statically-configured hostname. 1813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This is to work around mysterious failures in chrome_frame_net_tests. See: 18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/114369 1815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LocalHttpTestServer : public SpawnedTestServer { 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 18172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit LocalHttpTestServer(const base::FilePath& document_root) 1818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : SpawnedTestServer(SpawnedTestServer::TYPE_HTTP, 1819c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScopedCustomUrlRequestTestHttpHost::value(), 1820c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) document_root) {} 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocalHttpTestServer() 1822c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : SpawnedTestServer(SpawnedTestServer::TYPE_HTTP, 1823c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScopedCustomUrlRequestTestHttpHost::value(), 1824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath()) {} 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTest, DelayedCookieCallback) { 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocalHttpTestServer test_server; 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context; 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<DelayedCookieMonster> delayed_cm = 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DelayedCookieMonster(); 18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<CookieStore> cookie_store = delayed_cm; 1835868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) context.set_cookie_store(delayed_cm.get()); 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up a cookie. 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("set-cookie?CookieToNotSend=1"), &d, &context); 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 184590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.set_cookie_count()); 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the cookie is set. 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server.GetURL("echoheader?Cookie"), &d, &context); 18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 185890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("CookieToNotSend=1") 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) != std::string::npos); 18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, DoNotSendCookies) { 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocalHttpTestServer test_server; 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up a cookie. 18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server.GetURL("set-cookie?CookieToNotSend=1"), 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 188090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the cookie is set. 18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("echoheader?Cookie"), &d, &default_context_); 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 189390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("CookieToNotSend=1") 18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) != std::string::npos); 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the cookie isn't sent when LOAD_DO_NOT_SEND_COOKIES is set. 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("echoheader?Cookie"), &d, &default_context_); 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.set_load_flags(LOAD_DO_NOT_SEND_COOKIES); 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 191090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("Cookie: CookieToNotSend=1") 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) == std::string::npos); 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // LOAD_DO_NOT_SEND_COOKIES does not trigger OnGetCookies. 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, DoNotSaveCookies) { 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocalHttpTestServer test_server; 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up a cookie. 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server.GetURL("set-cookie?CookieToNotUpdate=2"), 19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 193490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.set_cookie_count()); 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try to set-up another cookie and update the previous cookie. 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("set-cookie?CookieToNotSave=1&CookieToNotUpdate=1"), 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.set_load_flags(LOAD_DO_NOT_SAVE_COOKIES); 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // LOAD_DO_NOT_SAVE_COOKIES does not trigger OnSetCookie. 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.set_cookie_count()); 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify the cookies weren't saved or updated. 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("echoheader?Cookie"), &d, &default_context_); 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 196990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("CookieToNotSave=1") 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) == std::string::npos); 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("CookieToNotUpdate=2") 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) != std::string::npos); 19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.set_cookie_count()); 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, DoNotSendCookies_ViaPolicy) { 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocalHttpTestServer test_server; 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up a cookie. 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server.GetURL("set-cookie?CookieToNotSend=1"), 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 199590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the cookie is set. 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("echoheader?Cookie"), &d, &default_context_); 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 200990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("CookieToNotSend=1") 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) != std::string::npos); 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the cookie isn't sent. 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_cookie_options(TestNetworkDelegate::NO_GET_COOKIES); 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("echoheader?Cookie"), &d, &default_context_); 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 202790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("Cookie: CookieToNotSend=1") 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) == std::string::npos); 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.blocked_get_cookies_count()); 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, DoNotSaveCookies_ViaPolicy) { 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocalHttpTestServer test_server; 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up a cookie. 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server.GetURL("set-cookie?CookieToNotUpdate=2"), 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 205090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try to set-up another cookie and update the previous cookie. 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_cookie_options(TestNetworkDelegate::NO_SET_COOKIE); 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("set-cookie?CookieToNotSave=1&CookieToNotUpdate=1"), 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 206890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, network_delegate.blocked_set_cookie_count()); 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify the cookies weren't saved or updated. 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("echoheader?Cookie"), &d, &default_context_); 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 208290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("CookieToNotSave=1") 20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) == std::string::npos); 20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("CookieToNotUpdate=2") 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) != std::string::npos); 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, DoNotSaveEmptyCookies) { 20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocalHttpTestServer test_server; 20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up an empty cookie. 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server.GetURL("set-cookie"), &d, &default_context_); 21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 210590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.set_cookie_count()); 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, DoNotSendCookies_ViaPolicy_Async) { 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocalHttpTestServer test_server; 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up a cookie. 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server.GetURL("set-cookie?CookieToNotSend=1"), 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 212690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the cookie is set. 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("echoheader?Cookie"), &d, &default_context_); 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 214090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("CookieToNotSend=1") 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) != std::string::npos); 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the cookie isn't sent. 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_cookie_options(TestNetworkDelegate::NO_GET_COOKIES); 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("echoheader?Cookie"), &d, &default_context_); 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 215890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("Cookie: CookieToNotSend=1") 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) == std::string::npos); 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.blocked_get_cookies_count()); 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, DoNotSaveCookies_ViaPolicy_Async) { 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocalHttpTestServer test_server; 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up a cookie. 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server.GetURL("set-cookie?CookieToNotUpdate=2"), 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 218190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try to set-up another cookie and update the previous cookie. 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_cookie_options(TestNetworkDelegate::NO_SET_COOKIE); 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("set-cookie?CookieToNotSave=1&CookieToNotUpdate=1"), 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 219990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, network_delegate.blocked_set_cookie_count()); 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify the cookies weren't saved or updated. 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("echoheader?Cookie"), &d, &default_context_); 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 221390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("CookieToNotSave=1") 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) == std::string::npos); 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("CookieToNotUpdate=2") 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) != std::string::npos); 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// FixedDateNetworkDelegate swaps out the server's HTTP Date response header 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// value for the |fixed_date| argument given to the constructor. 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FixedDateNetworkDelegate : public TestNetworkDelegate { 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit FixedDateNetworkDelegate(const std::string& fixed_date) 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : fixed_date_(fixed_date) {} 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~FixedDateNetworkDelegate() {} 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // net::NetworkDelegate implementation 22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int OnHeadersReceived( 22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequest* request, 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CompletionCallback& callback, 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::HttpResponseHeaders* original_response_headers, 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::HttpResponseHeaders>* override_response_headers) 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OVERRIDE; 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string fixed_date_; 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FixedDateNetworkDelegate); 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int FixedDateNetworkDelegate::OnHeadersReceived( 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequest* request, 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CompletionCallback& callback, 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::HttpResponseHeaders* original_response_headers, 22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::HttpResponseHeaders>* override_response_headers) { 22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpResponseHeaders* new_response_headers = 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new net::HttpResponseHeaders(original_response_headers->raw_headers()); 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_response_headers->RemoveHeader("Date"); 22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_response_headers->AddHeader("Date: " + fixed_date_); 22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *override_response_headers = new_response_headers; 22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TestNetworkDelegate::OnHeadersReceived(request, 22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback, 22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_response_headers, 22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) override_response_headers); 22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that cookie expiration times are adjusted for server/client clock 22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// skew and that we handle incorrect timezone specifier "UTC" in HTTP Date 22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// headers by defaulting to GMT. (crbug.com/135131) 22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, AcceptClockSkewCookieWithWrongDateTimezone) { 22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocalHttpTestServer test_server; 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up an expired cookie. 22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server.GetURL( 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "set-cookie?StillGood=1;expires=Mon,18-Apr-1977,22:50:13,GMT"), 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 228290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the cookie is not set. 22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("echoheader?Cookie"), &d, &default_context_); 22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 229290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("StillGood=1") == std::string::npos); 22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up a cookie with clock skew and "UTC" HTTP Date timezone specifier. 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FixedDateNetworkDelegate network_delegate("18-Apr-1977 22:49:13 UTC"); 22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server.GetURL( 23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "set-cookie?StillGood=1;expires=Mon,18-Apr-1977,22:50:13,GMT"), 23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 230690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the cookie is set. 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("echoheader?Cookie"), &d, &default_context_); 23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 231690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("StillGood=1") != std::string::npos); 23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that it is impossible to change the referrer in the extra headers of 23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// an URLRequest. 23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, DoNotOverrideReferrer) { 23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocalHttpTestServer test_server; 23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If extra headers contain referer and the request contains a referer, 23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // only the latter shall be respected. 23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("echoheader?Referer"), &d, &default_context_); 2335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) req.SetReferrer("http://foo.com/"); 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders headers; 23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.SetHeader(HttpRequestHeaders::kReferer, "http://bar.com/"); 23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.SetExtraRequestHeaders(headers); 23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 234290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("http://foo.com/", d.data_received()); 23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If extra headers contain a referer but the request does not, no referer 23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // shall be sent in the header. 23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("echoheader?Referer"), &d, &default_context_); 23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders headers; 23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.SetHeader(HttpRequestHeaders::kReferer, "http://bar.com/"); 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.SetExtraRequestHeaders(headers); 23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.set_load_flags(LOAD_VALIDATE_CACHE); 23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 236090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("None", d.data_received()); 23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRequestTestHTTP : public URLRequestTest { 23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestTestHTTP() 23692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : test_server_(base::FilePath(FILE_PATH_LITERAL( 23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "net/data/url_request_unittest"))) { 23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Requests |redirect_url|, which must return a HTTP 3xx redirect. 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |request_method| is the method to use for the initial request. 23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |redirect_method| is the method that is expected to be used for the second 23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // request, after redirection. 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If |include_data| is true, data is uploaded with the request. The 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // response body is expected to match it exactly, if and only if 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |request_method| == |redirect_method|. 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void HTTPRedirectMethodTest(const GURL& redirect_url, 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& request_method, 23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& redirect_method, 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool include_data) { 23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char kData[] = "hello world"; 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(redirect_url, &d, &default_context_); 23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.set_method(request_method); 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (include_data) { 23902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData))); 23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders headers; 23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.SetHeader(HttpRequestHeaders::kContentLength, 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::UintToString(arraysize(kData) - 1)); 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.SetExtraRequestHeaders(headers); 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 239790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(redirect_method, req.method()); 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::SUCCESS, req.status().status()); 24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, req.status().error()); 24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (include_data) { 24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (request_method == redirect_method) { 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kData, d.data_received()); 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(kData, d.data_received()); 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasFailure()) 24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Request method was: " << request_method; 24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void HTTPUploadDataOperationTest(const std::string& method) { 24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kMsgSize = 20000; // multiple of 10 24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kIterations = 50; 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char* uploadBytes = new char[kMsgSize+1]; 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char* ptr = uploadBytes; 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char marker = 'a'; 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int idx = 0; idx < kMsgSize/10; idx++) { 24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(ptr, "----------", 10); 24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptr += 10; 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (idx % 100 == 0) { 24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptr--; 24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *ptr++ = marker; 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (++marker > 'z') 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) marker = 'a'; 24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uploadBytes[kMsgSize] = '\0'; 24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kIterations; ++i) { 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(test_server_.GetURL("echo"), &d, &default_context_); 24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.set_method(method.c_str()); 24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) r.set_upload(make_scoped_ptr(CreateSimpleUploadData(uploadBytes))); 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 244090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1, d.response_started_count()) 24432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << "request failed: " << r.status().status() 24442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << ", os error: " << r.status().error(); 24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(uploadBytes, d.data_received()); 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete[] uploadBytes; 24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddChunksToUpload(URLRequest* r) { 24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r->AppendChunkToUpload("a", 1, false); 24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r->AppendChunkToUpload("bcd", 3, false); 24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r->AppendChunkToUpload("this is a longer chunk than before.", 35, false); 24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r->AppendChunkToUpload("\r\n\r\n", 4, false); 24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r->AppendChunkToUpload("0", 1, false); 24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r->AppendChunkToUpload("2323", 4, true); 24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void VerifyReceivedDataMatchesChunks(URLRequest* r, TestDelegate* d) { 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This should match the chunks sent by AddChunksToUpload(). 24632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string expected_data = 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "abcdthis is a longer chunk than before.\r\n\r\n02323"; 24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1, d->response_started_count()) 24672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << "request failed: " << r->status().status() 24682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << ", os error: " << r->status().error(); 24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d->received_data_before_response()); 24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected_data.size(), static_cast<size_t>(d->bytes_received())); 24732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected_data, d->data_received()); 24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool DoManyCookiesRequest(int num_cookies) { 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(test_server_.GetURL("set-many-cookies?" + 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::IntToString(num_cookies)), 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 248690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_success = r.status().is_success(); 24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_success) { 24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Requests handled by ChromeFrame send a less precise error message, 24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ERR_CONNECTION_ABORTED. 24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.status().error() == ERR_RESPONSE_HEADERS_TOO_BIG || 24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.status().error() == ERR_CONNECTION_ABORTED); 24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The test server appears to be unable to handle subsequent requests 24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // after this error is triggered. Force it to restart. 24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(test_server_.Stop()); 24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(test_server_.Start()); 24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return is_success; 25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocalHttpTestServer test_server_; 25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In this unit test, we're using the HTTPTestServer as a proxy server and 25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// issuing a CONNECT request with the magic host name "www.redirect.com". 25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The HTTPTestServer will return a 302 response, which we should not 25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// follow. 25112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, ProxyTunnelRedirectTest) { 25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNetworkDelegate network_delegate; // Must outlive URLRequest. 25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContextWithProxy context( 25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.host_port_pair().ToString(), 25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &network_delegate); 25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(GURL("https://www.redirect.com/"), &d, &context); 25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 252590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::FAILED, r.status().status()); 25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, r.status().error()); 25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should not have followed the redirect. 25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d.received_redirect_count()); 25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is the same as the previous test, but checks that the network delegate 25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// registers the error. 25372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateTunnelConnectionFailed) { 25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNetworkDelegate network_delegate; // Must outlive URLRequest. 25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContextWithProxy context( 25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.host_port_pair().ToString(), 25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &network_delegate); 25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(GURL("https://www.redirect.com/"), &d, &context); 25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::FAILED, r.status().status()); 25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, r.status().error()); 25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should not have followed the redirect. 25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d.received_redirect_count()); 25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.error_count()); 25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, network_delegate.last_error()); 25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we can block and asynchronously return OK in various stages. 25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateBlockAsynchronously) { 25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const BlockingNetworkDelegate::Stage blocking_stages[] = { 25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST, 25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS, 25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::ON_HEADERS_RECEIVED 25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const size_t blocking_stages_length = arraysize(blocking_stages); 25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate network_delegate( 25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::USER_CALLBACK); 25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_block_on( 25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST | 25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS | 25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::ON_HEADERS_RECEIVED); 25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(test_server_.GetURL("empty.html"), &d, &context); 25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < blocking_stages_length; ++i) { 259290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(blocking_stages[i], 25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.stage_blocked_for_callback()); 25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.DoCallback(OK); 25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 259790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(200, r.GetResponseCode()); 25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.created_requests()); 26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.destroyed_requests()); 26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.destroyed_requests()); 26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the network delegate can block and cancel a request. 26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequest) { 26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate network_delegate( 26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::AUTO_CALLBACK); 26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_block_on(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST); 26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_retval(ERR_EMPTY_RESPONSE); 26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContextWithProxy context( 26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.host_port_pair().ToString(), 26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &network_delegate); 26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest r(test_server_.GetURL(std::string()), &d, &context); 26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 262490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::FAILED, r.status().status()); 26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_EMPTY_RESPONSE, r.status().error()); 26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.created_requests()); 26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.destroyed_requests()); 26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.destroyed_requests()); 26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper function for NetworkDelegateCancelRequestAsynchronously and 26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NetworkDelegateCancelRequestSynchronously. Sets up a blocking network 26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// delegate operating in |block_mode| and a request for |url|. It blocks the 26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// request in |stage| and cancels it with ERR_BLOCKED_BY_CLIENT. 26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkDelegateCancelRequest(BlockingNetworkDelegate::BlockMode block_mode, 26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::Stage stage, 26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url) { 26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate network_delegate(block_mode); 26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_retval(ERR_BLOCKED_BY_CLIENT); 26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_block_on(stage); 26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(url, &d, &context); 26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 265490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::FAILED, r.status().status()); 26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_BLOCKED_BY_CLIENT, r.status().error()); 26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.created_requests()); 26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.destroyed_requests()); 26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.destroyed_requests()); 26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following 3 tests check that the network delegate can cancel a request 26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// synchronously in various stages of the request. 26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestSynchronously1) { 26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegateCancelRequest(BlockingNetworkDelegate::SYNCHRONOUS, 26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST, 2670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_server_.GetURL(std::string())); 26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestSynchronously2) { 26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegateCancelRequest(BlockingNetworkDelegate::SYNCHRONOUS, 26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS, 2677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_server_.GetURL(std::string())); 26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestSynchronously3) { 26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegateCancelRequest(BlockingNetworkDelegate::SYNCHRONOUS, 26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::ON_HEADERS_RECEIVED, 2684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_server_.GetURL(std::string())); 26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following 3 tests check that the network delegate can cancel a request 26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// asynchronously in various stages of the request. 26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestAsynchronously1) { 26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegateCancelRequest(BlockingNetworkDelegate::AUTO_CALLBACK, 26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST, 2693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_server_.GetURL(std::string())); 26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestAsynchronously2) { 26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegateCancelRequest(BlockingNetworkDelegate::AUTO_CALLBACK, 26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS, 2700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_server_.GetURL(std::string())); 27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestAsynchronously3) { 27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegateCancelRequest(BlockingNetworkDelegate::AUTO_CALLBACK, 27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::ON_HEADERS_RECEIVED, 2707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_server_.GetURL(std::string())); 27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the network delegate can block and redirect a request to a new 27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URL. 27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateRedirectRequest) { 27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate network_delegate( 27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::AUTO_CALLBACK); 27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_block_on(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST); 27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL redirect_url(test_server_.GetURL("simple.html")); 27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_redirect_url(redirect_url); 27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContextWithProxy context( 27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.host_port_pair().ToString(), 27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &network_delegate); 27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL original_url(test_server_.GetURL("empty.html")); 27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(original_url, &d, &context); 27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 273190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, r.status().error()); 27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(redirect_url, r.url()); 27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(original_url, r.original_url()); 27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2U, r.url_chain().size()); 27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.created_requests()); 27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.destroyed_requests()); 27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.destroyed_requests()); 27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the network delegate can block and redirect a request to a new 27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URL by setting a redirect_url and returning in OnBeforeURLRequest directly. 27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateRedirectRequestSynchronously) { 27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate network_delegate( 27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::SYNCHRONOUS); 27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL redirect_url(test_server_.GetURL("simple.html")); 27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_redirect_url(redirect_url); 27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContextWithProxy context( 27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.host_port_pair().ToString(), 27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &network_delegate); 27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL original_url(test_server_.GetURL("empty.html")); 27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(original_url, &d, &context); 27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 276490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, r.status().error()); 27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(redirect_url, r.url()); 27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(original_url, r.original_url()); 27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2U, r.url_chain().size()); 27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.created_requests()); 27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.destroyed_requests()); 27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.destroyed_requests()); 27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that redirects caused by the network delegate preserve POST data. 27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateRedirectRequestPost) { 27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kData[] = "hello world"; 27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate network_delegate( 27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::AUTO_CALLBACK); 27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_block_on(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST); 27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL redirect_url(test_server_.GetURL("echo")); 27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_redirect_url(redirect_url); 27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL original_url(test_server_.GetURL("empty.html")); 27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(original_url, &d, &context); 27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.set_method("POST"); 27982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) r.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData))); 27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders headers; 28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.SetHeader(HttpRequestHeaders::kContentLength, 28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::UintToString(arraysize(kData) - 1)); 28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.SetExtraRequestHeaders(headers); 28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 280490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, r.status().error()); 28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(redirect_url, r.url()); 28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(original_url, r.original_url()); 28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2U, r.url_chain().size()); 28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.created_requests()); 28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.destroyed_requests()); 28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("POST", r.method()); 28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kData, d.data_received()); 28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.destroyed_requests()); 28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the network delegate can synchronously complete OnAuthRequired 28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by taking no action. This indicates that the NetworkDelegate does not want to 28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// handle the challenge, and is passing the buck along to the 28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URLRequest::Delegate. 28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredSyncNoAction) { 28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate network_delegate( 28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::SYNCHRONOUS); 28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_credentials(AuthCredentials(kUser, kSecret)); 28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server_.GetURL("auth-basic")); 28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(url, &d, &context); 28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 2840eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2841eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::MessageLoop::current()->Run(); 2842eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2843eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 2844eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(0, r.status().error()); 2845eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(200, r.GetResponseCode()); 2846eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(d.auth_required_called()); 2847eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(1, network_delegate.created_requests()); 2848eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(0, network_delegate.destroyed_requests()); 2849eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 2850eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(1, network_delegate.destroyed_requests()); 2851eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 2852eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2853eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(URLRequestTestHTTP, 2854eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NetworkDelegateOnAuthRequiredSyncNoAction_GetFullRequestHeaders) { 2855eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server_.Start()); 2856eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2857eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestDelegate d; 2858eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BlockingNetworkDelegate network_delegate( 2859eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BlockingNetworkDelegate::SYNCHRONOUS); 2860eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2861eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestURLRequestContext context(true); 2862eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch context.set_network_delegate(&network_delegate); 2863eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch context.Init(); 2864eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2865eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch d.set_credentials(AuthCredentials(kUser, kSecret)); 2866eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2867eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch { 2868eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GURL url(test_server_.GetURL("auth-basic")); 2869eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch URLRequest r(url, &d, &context); 2870eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch r.Start(); 2871eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2872eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch { 2873eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch HttpRequestHeaders headers; 2874eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(r.GetFullRequestHeaders(&headers)); 2875eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(headers.HasHeader("Authorization")); 2876eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 2877eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 287890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, r.status().error()); 28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(200, r.GetResponseCode()); 28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.auth_required_called()); 28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.created_requests()); 28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.destroyed_requests()); 28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.destroyed_requests()); 28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the network delegate can synchronously complete OnAuthRequired 28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by setting credentials. 28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredSyncSetAuth) { 28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate network_delegate( 28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::SYNCHRONOUS); 28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED); 28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_auth_retval( 29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegate::AUTH_REQUIRED_RESPONSE_SET_AUTH); 29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_auth_credentials(AuthCredentials(kUser, kSecret)); 29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server_.GetURL("auth-basic")); 29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(url, &d, &context); 29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 291290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, r.status().error()); 29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(200, r.GetResponseCode()); 29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.auth_required_called()); 29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.created_requests()); 29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.destroyed_requests()); 29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.destroyed_requests()); 29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2924eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Same as above, but also tests that GetFullRequestHeaders returns the proper 2925eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// headers (for the first or second request) when called at the proper times. 2926eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(URLRequestTestHTTP, 2927eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NetworkDelegateOnAuthRequiredSyncSetAuth_GetFullRequestHeaders) { 2928eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server_.Start()); 2929eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2930eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestDelegate d; 2931eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BlockingNetworkDelegate network_delegate( 2932eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BlockingNetworkDelegate::SYNCHRONOUS); 2933eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED); 2934eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch network_delegate.set_auth_retval( 2935eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NetworkDelegate::AUTH_REQUIRED_RESPONSE_SET_AUTH); 2936eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2937eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch network_delegate.set_auth_credentials(AuthCredentials(kUser, kSecret)); 2938eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2939eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestURLRequestContext context(true); 2940eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch context.set_network_delegate(&network_delegate); 2941eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch context.Init(); 2942eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2943eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch { 2944eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GURL url(test_server_.GetURL("auth-basic")); 2945eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch URLRequest r(url, &d, &context); 2946eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch r.Start(); 2947eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::MessageLoop::current()->Run(); 2948eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2949eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 2950eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(0, r.status().error()); 2951eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(200, r.GetResponseCode()); 2952eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(d.auth_required_called()); 2953eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(1, network_delegate.created_requests()); 2954eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(0, network_delegate.destroyed_requests()); 2955eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2956eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch { 2957eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch HttpRequestHeaders headers; 2958eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(r.GetFullRequestHeaders(&headers)); 2959eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(headers.HasHeader("Authorization")); 2960eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 2961eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 2962eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(1, network_delegate.destroyed_requests()); 2963eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 2964eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the network delegate can synchronously complete OnAuthRequired 29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by cancelling authentication. 29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredSyncCancel) { 29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate network_delegate( 29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::SYNCHRONOUS); 29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED); 29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_auth_retval( 29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegate::AUTH_REQUIRED_RESPONSE_CANCEL_AUTH); 29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server_.GetURL("auth-basic")); 29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(url, &d, &context); 29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 298590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, r.status().error()); 29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(401, r.GetResponseCode()); 29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.auth_required_called()); 29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.created_requests()); 29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.destroyed_requests()); 29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.destroyed_requests()); 29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the network delegate can asynchronously complete OnAuthRequired 29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by taking no action. This indicates that the NetworkDelegate does not want 29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to handle the challenge, and is passing the buck along to the 30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URLRequest::Delegate. 30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredAsyncNoAction) { 30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate network_delegate( 30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::AUTO_CALLBACK); 30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED); 30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_credentials(AuthCredentials(kUser, kSecret)); 30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server_.GetURL("auth-basic")); 30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(url, &d, &context); 30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 301990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, r.status().error()); 30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(200, r.GetResponseCode()); 30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.auth_required_called()); 30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.created_requests()); 30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.destroyed_requests()); 30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.destroyed_requests()); 30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the network delegate can asynchronously complete OnAuthRequired 30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by setting credentials. 30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredAsyncSetAuth) { 30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate network_delegate( 30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::AUTO_CALLBACK); 30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED); 30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_auth_retval( 30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegate::AUTH_REQUIRED_RESPONSE_SET_AUTH); 30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthCredentials auth_credentials(kUser, kSecret); 30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_auth_credentials(auth_credentials); 30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server_.GetURL("auth-basic")); 30525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(url, &d, &context); 30535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 305490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 30555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, r.status().error()); 30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(200, r.GetResponseCode()); 30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.auth_required_called()); 30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.created_requests()); 30625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.destroyed_requests()); 30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.destroyed_requests()); 30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the network delegate can asynchronously complete OnAuthRequired 30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by cancelling authentication. 30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredAsyncCancel) { 30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate network_delegate( 30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::AUTO_CALLBACK); 30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED); 30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_auth_retval( 30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegate::AUTH_REQUIRED_RESPONSE_CANCEL_AUTH); 30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server_.GetURL("auth-basic")); 30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(url, &d, &context); 30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 308790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, r.status().error()); 30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(401, r.GetResponseCode()); 30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.auth_required_called()); 30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.created_requests()); 30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.destroyed_requests()); 30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.destroyed_requests()); 30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we can handle when a network request was canceled while we were 31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// waiting for the network delegate. 31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Part 1: Request is cancelled while waiting for OnBeforeURLRequest callback. 31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelWhileWaiting1) { 31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 31045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 31065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate network_delegate( 31075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::USER_CALLBACK); 31085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_block_on(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST); 31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest r(test_server_.GetURL(std::string()), &d, &context); 31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 311890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST, 31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.stage_blocked_for_callback()); 31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.completed_requests()); 31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cancel before callback. 31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Cancel(); 31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that network delegate is notified. 31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.completed_requests()); 31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status()); 31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_ABORTED, r.status().error()); 31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.created_requests()); 31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.destroyed_requests()); 31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.destroyed_requests()); 31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we can handle when a network request was canceled while we were 31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// waiting for the network delegate. 31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Part 2: Request is cancelled while waiting for OnBeforeSendHeaders callback. 31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelWhileWaiting2) { 31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 31415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate network_delegate( 31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::USER_CALLBACK); 31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_block_on( 31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS); 31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 31475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest r(test_server_.GetURL(std::string()), &d, &context); 31525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 315490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 31555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS, 31565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.stage_blocked_for_callback()); 31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.completed_requests()); 31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cancel before callback. 31595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Cancel(); 31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that network delegate is notified. 31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.completed_requests()); 31625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status()); 31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_ABORTED, r.status().error()); 31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.created_requests()); 31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.destroyed_requests()); 31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.destroyed_requests()); 31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we can handle when a network request was canceled while we were 31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// waiting for the network delegate. 31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Part 3: Request is cancelled while waiting for OnHeadersReceived callback. 31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelWhileWaiting3) { 31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate network_delegate( 31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::USER_CALLBACK); 31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_block_on(BlockingNetworkDelegate::ON_HEADERS_RECEIVED); 31805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 31835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest r(test_server_.GetURL(std::string()), &d, &context); 31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 318990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(BlockingNetworkDelegate::ON_HEADERS_RECEIVED, 31915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.stage_blocked_for_callback()); 31925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.completed_requests()); 31935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cancel before callback. 31945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Cancel(); 31955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that network delegate is notified. 31965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.completed_requests()); 31975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status()); 31985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_ABORTED, r.status().error()); 31995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.created_requests()); 32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.destroyed_requests()); 32015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.destroyed_requests()); 32035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we can handle when a network request was canceled while we were 32065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// waiting for the network delegate. 32075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Part 4: Request is cancelled while waiting for OnAuthRequired callback. 32085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelWhileWaiting4) { 32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 32105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate network_delegate( 32135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::USER_CALLBACK); 32145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED); 32155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 32185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 32195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 32215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(test_server_.GetURL("auth-basic"), &d, &context); 32225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 322490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(BlockingNetworkDelegate::ON_AUTH_REQUIRED, 32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.stage_blocked_for_callback()); 32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.completed_requests()); 32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cancel before callback. 32295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Cancel(); 32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that network delegate is notified. 32315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.completed_requests()); 32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status()); 32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_ABORTED, r.status().error()); 32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.created_requests()); 32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.destroyed_requests()); 32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.destroyed_requests()); 32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In this unit test, we're using the HTTPTestServer as a proxy server and 32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// issuing a CONNECT request with the magic host name "www.server-auth.com". 32425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The HTTPTestServer will return a 401 response, which we should balk at. 32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, UnexpectedServerAuthTest) { 32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 32455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNetworkDelegate network_delegate; // Must outlive URLRequest. 32475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContextWithProxy context( 32485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.host_port_pair().ToString(), 32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &network_delegate); 32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 32525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 32535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(GURL("https://www.server-auth.com/"), &d, &context); 32545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::FAILED, r.status().status()); 32615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, r.status().error()); 32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, GetTest_NoCache) { 32665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 32695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest r(test_server_.GetURL(std::string()), &d, &default_context_); 32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 32735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 32745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 327590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, d.bytes_received()); 32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(test_server_.host_port_pair().host(), 32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.GetSocketAddress().host()); 32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(test_server_.host_port_pair().port(), 32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.GetSocketAddress().port()); 32845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(eroman): Add back the NetLog tests... 32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test has the server send a large number of cookies to the client. 32905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// To ensure that no number of cookies causes a crash, a galloping binary 32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// search is used to estimate that maximum number of cookies that are accepted 32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by the browser. Beyond the maximum number, the request will fail with 32935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ERR_RESPONSE_HEADERS_TOO_BIG. 32942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 32952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// http://crbug.com/177916 32962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_GetTest_ManyCookies DISABLED_GetTest_ManyCookies 32972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 32982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_GetTest_ManyCookies GetTest_ManyCookies 32992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // defined(OS_WIN) 33002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, MAYBE_GetTest_ManyCookies) { 33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 33025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int lower_bound = 0; 33045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int upper_bound = 1; 33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Double the number of cookies until the response header limits are 33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // exceeded. 33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (DoManyCookiesRequest(upper_bound)) { 33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lower_bound = upper_bound; 33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upper_bound *= 2; 33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LT(upper_bound, 1000000); 33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int tolerance = upper_bound * 0.005; 33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tolerance < 2) 33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tolerance = 2; 33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Perform a binary search to find the highest possible number of cookies, 33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // within the desired tolerance. 33205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (upper_bound - lower_bound >= tolerance) { 33215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_cookies = (lower_bound + upper_bound) / 2; 33225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (DoManyCookiesRequest(num_cookies)) 33245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lower_bound = num_cookies; 33255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 33265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upper_bound = num_cookies; 33275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Success: the test did not crash. 33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, GetTest) { 33325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 33335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 33355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest r(test_server_.GetURL(std::string()), &d, &default_context_); 33375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 33395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 33405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 334190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, d.bytes_received()); 33465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(test_server_.host_port_pair().host(), 33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.GetSocketAddress().host()); 33485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(test_server_.host_port_pair().port(), 33495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.GetSocketAddress().port()); 33505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3353eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(URLRequestTestHTTP, GetTest_GetFullRequestHeaders) { 3354eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server_.Start()); 3355eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3356eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestDelegate d; 3357eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch { 3358eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GURL test_url(test_server_.GetURL(std::string())); 3359eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch URLRequest r(test_url, &d, &default_context_); 3360eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3361eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch HttpRequestHeaders headers; 3362eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(r.GetFullRequestHeaders(&headers)); 3363eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3364eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch r.Start(); 3365eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(r.is_pending()); 3366eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3367eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::MessageLoop::current()->Run(); 3368eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3369eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(1, d.response_started_count()); 3370eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(d.received_data_before_response()); 3371eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_NE(0, d.bytes_received()); 3372eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(test_server_.host_port_pair().host(), 3373eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch r.GetSocketAddress().host()); 3374eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(test_server_.host_port_pair().port(), 3375eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch r.GetSocketAddress().port()); 3376eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3377eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(d.have_full_request_headers()); 3378eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CheckFullRequestHeaders(d.full_request_headers(), test_url); 3379eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 3380eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 3381eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 33822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, GetTestLoadTiming) { 33832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 33842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 33852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestDelegate d; 33862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 3387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest r(test_server_.GetURL(std::string()), &d, &default_context_); 33882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 33892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) r.Start(); 33902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(r.is_pending()); 33912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 339290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 33932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 33942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadTimingInfo load_timing_info; 33952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) r.GetLoadTimingInfo(&load_timing_info); 33962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES); 33972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 33982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 33992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 34002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(0, d.bytes_received()); 34012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(test_server_.host_port_pair().host(), 34022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) r.GetSocketAddress().host()); 34032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(test_server_.host_port_pair().port(), 34042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) r.GetSocketAddress().port()); 34052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 34062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 34072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, GetZippedTest) { 34095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 34105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Parameter that specifies the Content-Length field in the response: 34125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // C - Compressed length. 34135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // U - Uncompressed length. 34145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // L - Large length (larger than both C & U). 34155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // M - Medium length (between C & U). 34165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // S - Small length (smaller than both C & U). 34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char test_parameters[] = "CULMS"; 34185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int num_tests = arraysize(test_parameters)- 1; // Skip NULL. 34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // C & U should be OK. 34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // L & M are larger than the data sent, and show an error. 34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // S has too little data, but we seem to accept it. 34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool test_expect_success[num_tests] = 34235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { true, true, false, false, true }; 34245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < num_tests ; i++) { 34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 34285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string test_file = 34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("compressedfiles/BullRunSpeech.txt?%c", 34305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_parameters[i]); 34315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNetworkDelegate network_delegate; // Must outlive URLRequest. 34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 34345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(test_server_.GetURL(test_file), &d, &context); 34385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 34395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 34405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 344190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 34425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 34445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 34455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << " Received " << d.bytes_received() << " bytes" 34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " status = " << r.status().status() 34475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " error = " << r.status().error(); 34485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (test_expect_success[i]) { 34495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()) 34505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " Parameter = \"" << test_file << "\""; 34515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 34525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::FAILED, r.status().status()); 34535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_CONTENT_LENGTH_MISMATCH, r.status().error()) 34545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " Parameter = \"" << test_file << "\""; 34555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, HTTPSToHTTPRedirectNoRefererTest) { 34615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 34625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer https_test_server( 3464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::TYPE_HTTPS, SpawnedTestServer::kLocalhost, 34652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 34665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_test_server.Start()); 34675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An https server is sent a request with an https referer, 34695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and responds with a redirect to an http url. The http 34705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // server should not be sent the referer. 3471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL http_destination = test_server_.GetURL(std::string()); 34725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 34735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(https_test_server.GetURL( 34745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "server-redirect?" + http_destination.spec()), &d, &default_context_); 3475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) req.SetReferrer("https://www.referrer.com/"); 34765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 347790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 34785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 34805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.received_redirect_count()); 34815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(http_destination, req.url()); 34825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(), req.referrer()); 34835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, RedirectLoadTiming) { 34862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 34872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL destination_url = test_server_.GetURL(std::string()); 3489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL original_url = 3490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_server_.GetURL("server-redirect?" + destination_url.spec()); 34912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestDelegate d; 34922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequest req(original_url, &d, &default_context_); 34932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.Start(); 349490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 34952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 34972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, d.received_redirect_count()); 34982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(destination_url, req.url()); 34992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(original_url, req.original_url()); 35002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(2U, req.url_chain().size()); 35012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(original_url, req.url_chain()[0]); 35022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(destination_url, req.url_chain()[1]); 35032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadTimingInfo load_timing_info_before_redirect; 35052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(default_network_delegate_.GetLoadTimingInfoBeforeRedirect( 35062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &load_timing_info_before_redirect)); 35072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestLoadTimingNotReused(load_timing_info_before_redirect, 35082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CONNECT_TIMING_HAS_DNS_TIMES); 35092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadTimingInfo load_timing_info; 35112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.GetLoadTimingInfo(&load_timing_info); 35122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES); 35132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check that a new socket was used on redirect, since the server does not 35152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // supposed keep-alive sockets, and that the times before the redirect are 35162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // before the ones recorded for the second request. 35172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(load_timing_info_before_redirect.socket_log_id, 35182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) load_timing_info.socket_log_id); 35192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_LE(load_timing_info_before_redirect.receive_headers_end, 35202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) load_timing_info.connect_timing.connect_start); 35212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 35222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, MultipleRedirectTest) { 35245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 35255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL destination_url = test_server_.GetURL(std::string()); 3527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL middle_redirect_url = 3528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_server_.GetURL("server-redirect?" + destination_url.spec()); 35295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL original_url = test_server_.GetURL( 35305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "server-redirect?" + middle_redirect_url.spec()); 35315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 35325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(original_url, &d, &default_context_); 35335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 353490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 35355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 35375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, d.received_redirect_count()); 35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(destination_url, req.url()); 35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(original_url, req.original_url()); 35405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3U, req.url_chain().size()); 35415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(original_url, req.url_chain()[0]); 35425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(middle_redirect_url, req.url_chain()[1]); 35435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(destination_url, req.url_chain()[2]); 35445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 35475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kExtraHeader[] = "Allow-Snafu"; 35495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kExtraValue[] = "fubar"; 35505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RedirectWithAdditionalHeadersDelegate : public TestDelegate { 35522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnReceivedRedirect(net::URLRequest* request, 35532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& new_url, 35542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool* defer_redirect) OVERRIDE { 35555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate::OnReceivedRedirect(request, new_url, defer_redirect); 35565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request->SetExtraRequestHeaderByName(kExtraHeader, kExtraValue, false); 35575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 35595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 35615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, RedirectWithAdditionalHeadersTest) { 35635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 35645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL destination_url = test_server_.GetURL( 35665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "echoheader?" + std::string(kExtraHeader)); 35675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL original_url = test_server_.GetURL( 35685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "server-redirect?" + destination_url.spec()); 35695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RedirectWithAdditionalHeadersDelegate d; 35705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(original_url, &d, &default_context_); 35715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 357290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 35735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string value; 35755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HttpRequestHeaders& headers = req.extra_request_headers(); 35765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(headers.GetHeader(kExtraHeader, &value)); 35775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kExtraValue, value); 35785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(req.is_pending()); 35795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(req.is_redirecting()); 35805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kExtraValue, d.data_received()); 35815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 35842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kExtraHeaderToRemove[] = "To-Be-Removed"; 35862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class RedirectWithHeaderRemovalDelegate : public TestDelegate { 35882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnReceivedRedirect(net::URLRequest* request, 35892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& new_url, 35902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool* defer_redirect) OVERRIDE { 35912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestDelegate::OnReceivedRedirect(request, new_url, defer_redirect); 35922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request->RemoveRequestHeaderByName(kExtraHeaderToRemove); 35932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 35942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 35952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 35972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, RedirectWithHeaderRemovalTest) { 35992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 36002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 36012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL destination_url = test_server_.GetURL( 36022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "echoheader?" + std::string(kExtraHeaderToRemove)); 36032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL original_url = test_server_.GetURL( 36042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "server-redirect?" + destination_url.spec()); 36052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RedirectWithHeaderRemovalDelegate d; 36062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequest req(original_url, &d, &default_context_); 36072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.SetExtraRequestHeaderByName(kExtraHeaderToRemove, "dummy", false); 36082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.Start(); 360990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 36102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 36112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string value; 36122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const HttpRequestHeaders& headers = req.extra_request_headers(); 36132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(headers.GetHeader(kExtraHeaderToRemove, &value)); 36142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(req.is_pending()); 36152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(req.is_redirecting()); 36162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("None", d.data_received()); 36172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 36182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 36195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, CancelTest) { 36205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 36215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 36225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(GURL("http://www.google.com/"), &d, &default_context_); 36235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 36255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 36265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Cancel(); 36285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 362990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 36305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We expect to receive OnResponseStarted even though the request has been 36325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // cancelled. 36335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 36345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d.bytes_received()); 36355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 36365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, CancelTest2) { 36405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 36415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 36435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest r(test_server_.GetURL(std::string()), &d, &default_context_); 36455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_cancel_in_response_started(true); 36475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 36495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 36505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 36525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 36545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d.bytes_received()); 36555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 36565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status()); 36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, CancelTest3) { 36615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 36625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 36645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest r(test_server_.GetURL(std::string()), &d, &default_context_); 36665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_cancel_in_received_data(true); 36685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 36705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 36715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 367290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 36735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 36755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There is no guarantee about how much data was received 36765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // before the cancel was issued. It could have been 0 bytes, 36775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // or it could have been all the bytes. 36785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // EXPECT_EQ(0, d.bytes_received()); 36795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 36805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status()); 36815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, CancelTest4) { 36855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 36865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 36885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest r(test_server_.GetURL(std::string()), &d, &default_context_); 36905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 36925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 36935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The request will be implicitly canceled when it is destroyed. The 36955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // test delegate must not post a quit message when this happens because 36965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this test doesn't actually have a message loop. The quit message would 36975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // get put on this thread's message queue and the next test would exit 36985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // early, causing problems. 36995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_quit_on_complete(false); 37005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expect things to just cleanup properly. 37025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we won't actually get a received reponse here because we've never run the 37045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // message loop 37055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 37065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d.bytes_received()); 37075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, CancelTest5) { 37105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 37115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // populate cache 37135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 37145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 37155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(test_server_.GetURL("cachetime"), &d, &default_context_); 37165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 371790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 37185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 37195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // cancel read from cache (see bug 990242) 37225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 37235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 37245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(test_server_.GetURL("cachetime"), &d, &default_context_); 37255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 37265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Cancel(); 372790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 37285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status()); 37305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 37315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d.bytes_received()); 37325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 37335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, PostTest) { 37375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 37385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HTTPUploadDataOperationTest("POST"); 37395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, PutTest) { 37425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 37435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HTTPUploadDataOperationTest("PUT"); 37445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, PostEmptyTest) { 37475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 37485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 37505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 37515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(test_server_.GetURL("echo"), &d, &default_context_); 37525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.set_method("POST"); 37535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 37555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 37565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 37585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1, d.response_started_count()) 37602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << "request failed: " << r.status().status() 37612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << ", error: " << r.status().error(); 37625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 37645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().empty()); 37655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, PostFileTest) { 37695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 37705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 37725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 37735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(test_server_.GetURL("echo"), &d, &default_context_); 37745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.set_method("POST"); 37755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath dir; 37775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(base::DIR_EXE, &dir); 37785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_util::SetCurrentDirectory(dir); 37795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedVector<UploadElementReader> element_readers; 37815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath path; 37835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(base::DIR_SOURCE_ROOT, &path); 37845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.Append(FILE_PATH_LITERAL("net")); 37855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.Append(FILE_PATH_LITERAL("data")); 37865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.Append(FILE_PATH_LITERAL("url_request_unittest")); 37875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.Append(FILE_PATH_LITERAL("with-headers.html")); 37887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) element_readers.push_back( 37897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) new UploadFileElementReader(base::MessageLoopProxy::current().get(), 37907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) path, 37917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 0, 37927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) kuint64max, 37937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Time())); 37945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This file should just be ignored in the upload stream. 37962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element_readers.push_back(new UploadFileElementReader( 37977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::MessageLoopProxy::current().get(), 37982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL( 37995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "c:\\path\\to\\non\\existant\\file.randomness.12345")), 38007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 0, 38017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) kuint64max, 38027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Time())); 38032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) r.set_upload(make_scoped_ptr(new UploadDataStream(&element_readers, 0))); 38045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 38065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 38075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 380890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 38095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 size = 0; 38112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(true, file_util::GetFileSize(path, &size)); 3812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<char[]> buf(new char[size]); 38135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(size, file_util::ReadFile(path, buf.get(), size)); 38155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1, d.response_started_count()) 38172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << "request failed: " << r.status().status() 38182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << ", error: " << r.status().error(); 38195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 38215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(size, d.bytes_received()); 38232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(std::string(&buf[0], size), d.data_received()); 38245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, TestPostChunkedDataBeforeStart) { 38285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 38295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 38315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 38325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(test_server_.GetURL("echo"), &d, &default_context_); 38335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.EnableChunkedUpload(); 38345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.set_method("POST"); 38355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChunksToUpload(&r); 38365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 38375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 38385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 383990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 38405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VerifyReceivedDataMatchesChunks(&r, &d); 38425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, TestPostChunkedDataJustAfterStart) { 38462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 38472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 38482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestDelegate d; 38492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 38502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequest r(test_server_.GetURL("echo"), &d, &default_context_); 38512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) r.EnableChunkedUpload(); 38522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) r.set_method("POST"); 38532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) r.Start(); 38542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(r.is_pending()); 38552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddChunksToUpload(&r); 385690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 38572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 38582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VerifyReceivedDataMatchesChunks(&r, &d); 38592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 38602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 38612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 38625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, TestPostChunkedDataAfterStart) { 38635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 38645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 38665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 38675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(test_server_.GetURL("echo"), &d, &default_context_); 38685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.EnableChunkedUpload(); 38695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.set_method("POST"); 38705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 38715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 38725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 387390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 38745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChunksToUpload(&r); 387590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 38765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VerifyReceivedDataMatchesChunks(&r, &d); 38785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, ResponseHeadersTest) { 38825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 38835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 38855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 38865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURL("files/with-headers.html"), &d, &default_context_); 38875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 388890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 38895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HttpResponseHeaders* headers = req.response_headers(); 38915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simple sanity check that response_info() accesses the same data. 38935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(headers, req.response_info().headers.get()); 38945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string header; 38965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(headers->GetNormalizedHeader("cache-control", &header)); 38975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("private", header); 38985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) header.clear(); 39005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(headers->GetNormalizedHeader("content-type", &header)); 39015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("text/html; charset=ISO-8859-1", header); 39025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The response has two "X-Multiple-Entries" headers. 39045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This verfies our output has them concatenated together. 39055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) header.clear(); 39065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(headers->GetNormalizedHeader("x-multiple-entries", &header)); 39075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("a, b", header); 39085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, ProcessSTS) { 3911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options; 3912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer https_test_server( 3913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::TYPE_HTTPS, 39145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options, 39152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest"))); 39165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_test_server.Start()); 39175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 39195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest request( 39205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) https_test_server.GetURL("files/hsts-headers.html"), 39215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 39225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 39235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request.Start(); 392490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 39255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransportSecurityState* security_state = 39275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.transport_security_state(); 39285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool sni_available = true; 39295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransportSecurityState::DomainState domain_state; 39305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(security_state->GetDomainState( 3931c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::kLocalhost, sni_available, &domain_state)); 39325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(TransportSecurityState::DomainState::MODE_FORCE_HTTPS, 39335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) domain_state.upgrade_mode); 39347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_TRUE(domain_state.sts_include_subdomains); 39357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_FALSE(domain_state.pkp_include_subdomains); 3936eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_ANDROID) 3937eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Android's CertVerifyProc does not (yet) handle pins. 3938eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#else 3939eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(domain_state.HasPublicKeyPins()); 3940eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif 3941eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 3942eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3943eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Android's CertVerifyProc does not (yet) handle pins. Therefore, it will 3944eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// reject HPKP headers, and a test setting only HPKP headers will fail (no 3945eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// DomainState present because header rejected). 3946eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_ANDROID) 3947eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define MAYBE_ProcessPKP DISABLED_ProcessPKP 3948eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#else 3949eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define MAYBE_ProcessPKP ProcessPKP 3950eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif 3951eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3952eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Tests that enabling HPKP on a domain does not affect the HSTS 3953eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// validity/expiration. 3954eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(URLRequestTestHTTP, MAYBE_ProcessPKP) { 3955eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SpawnedTestServer::SSLOptions ssl_options; 3956eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SpawnedTestServer https_test_server( 3957eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SpawnedTestServer::TYPE_HTTPS, 3958eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ssl_options, 3959eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest"))); 3960eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(https_test_server.Start()); 3961eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3962eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestDelegate d; 3963eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch URLRequest request( 3964eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch https_test_server.GetURL("files/hpkp-headers.html"), 3965eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch &d, 3966eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch &default_context_); 3967eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch request.Start(); 3968eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::MessageLoop::current()->Run(); 3969eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3970eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TransportSecurityState* security_state = 3971eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch default_context_.transport_security_state(); 3972eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool sni_available = true; 3973eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TransportSecurityState::DomainState domain_state; 3974eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(security_state->GetDomainState( 3975eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SpawnedTestServer::kLocalhost, sni_available, &domain_state)); 3976eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(TransportSecurityState::DomainState::MODE_DEFAULT, 3977eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch domain_state.upgrade_mode); 3978eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(domain_state.sts_include_subdomains); 3979eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(domain_state.pkp_include_subdomains); 3980eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(domain_state.HasPublicKeyPins()); 3981eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_NE(domain_state.upgrade_expiry, 3982eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch domain_state.dynamic_spki_hashes_expiry); 39835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, ProcessSTSOnce) { 3986c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options; 3987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer https_test_server( 3988c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::TYPE_HTTPS, 39895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options, 39902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest"))); 39915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_test_server.Start()); 39925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 39945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest request( 39955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) https_test_server.GetURL("files/hsts-multiple-headers.html"), 39965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 39975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 39985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request.Start(); 399990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 40005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should have set parameters from the first header, not the second. 40025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransportSecurityState* security_state = 40035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.transport_security_state(); 40045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool sni_available = true; 40055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransportSecurityState::DomainState domain_state; 40065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(security_state->GetDomainState( 4007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::kLocalhost, sni_available, &domain_state)); 40085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(TransportSecurityState::DomainState::MODE_FORCE_HTTPS, 40095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) domain_state.upgrade_mode); 40107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_FALSE(domain_state.sts_include_subdomains); 40117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_FALSE(domain_state.pkp_include_subdomains); 40125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4014c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(URLRequestTestHTTP, ProcessSTSAndPKP) { 4015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options; 4016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer https_test_server( 4017c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::TYPE_HTTPS, 4018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options, 4019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest"))); 4020c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(https_test_server.Start()); 4021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4022c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestDelegate d; 4023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest request( 4024c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) https_test_server.GetURL("files/hsts-and-hpkp-headers.html"), 4025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &d, 4026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &default_context_); 4027c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) request.Start(); 402890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 4029c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // We should have set parameters from the first header, not the second. 4031c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TransportSecurityState* security_state = 4032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default_context_.transport_security_state(); 4033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool sni_available = true; 4034c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TransportSecurityState::DomainState domain_state; 4035c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(security_state->GetDomainState( 4036c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::kLocalhost, sni_available, &domain_state)); 4037c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(TransportSecurityState::DomainState::MODE_FORCE_HTTPS, 4038c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) domain_state.upgrade_mode); 4039c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_ANDROID) 4040c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Android's CertVerifyProc does not (yet) handle pins. 4041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else 4042c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(domain_state.HasPublicKeyPins()); 4043c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 4044c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NE(domain_state.upgrade_expiry, 4045c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) domain_state.dynamic_spki_hashes_expiry); 4046c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 40477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Even though there is an HSTS header asserting includeSubdomains, it is 40487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // the *second* such header, and we MUST process only the first. 40497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_FALSE(domain_state.sts_include_subdomains); 40507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // includeSubdomains does not occur in the test HPKP header. 40517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_FALSE(domain_state.pkp_include_subdomains); 4052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 4053c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4054eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Tests that when multiple HPKP headers are present, asserting different 4055eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// policies, that only the first such policy is processed. 4056eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(URLRequestTestHTTP, ProcessSTSAndPKP2) { 4057eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SpawnedTestServer::SSLOptions ssl_options; 4058eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SpawnedTestServer https_test_server( 4059eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SpawnedTestServer::TYPE_HTTPS, 4060eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ssl_options, 4061eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest"))); 4062eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(https_test_server.Start()); 4063eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 4064eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestDelegate d; 4065eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch URLRequest request( 4066eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch https_test_server.GetURL("files/hsts-and-hpkp-headers2.html"), 4067eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch &d, 4068eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch &default_context_); 4069eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch request.Start(); 4070eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::MessageLoop::current()->Run(); 4071eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 4072eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TransportSecurityState* security_state = 4073eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch default_context_.transport_security_state(); 4074eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool sni_available = true; 4075eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TransportSecurityState::DomainState domain_state; 4076eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(security_state->GetDomainState( 4077eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SpawnedTestServer::kLocalhost, sni_available, &domain_state)); 4078eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(TransportSecurityState::DomainState::MODE_FORCE_HTTPS, 4079eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch domain_state.upgrade_mode); 4080eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_ANDROID) 4081eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Android's CertVerifyProc does not (yet) handle pins. 4082eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#else 4083eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(domain_state.HasPublicKeyPins()); 4084eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif 4085eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_NE(domain_state.upgrade_expiry, 4086eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch domain_state.dynamic_spki_hashes_expiry); 4087eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 4088eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(domain_state.sts_include_subdomains); 4089eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(domain_state.pkp_include_subdomains); 4090eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 4091eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 40925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, ContentTypeNormalizationTest) { 40935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 40945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 40965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server_.GetURL( 40975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/content-type-normalization.html"), &d, &default_context_); 40985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 409990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 41005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string mime_type; 41025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.GetMimeType(&mime_type); 41035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("text/html", mime_type); 41045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string charset; 41065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.GetCharset(&charset); 41075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("utf-8", charset); 41085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Cancel(); 41095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 41105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4111b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)TEST_F(URLRequestTestHTTP, ProtocolHandlerAndFactoryRestrictRedirects) { 4112b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Test URLRequestJobFactory::ProtocolHandler::IsSafeRedirectTarget(). 4113b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) GURL file_url("file:///foo.txt"); 4114b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) GURL data_url("data:,foo"); 4115b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) FileProtocolHandler file_protocol_handler; 4116b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_FALSE(file_protocol_handler.IsSafeRedirectTarget(file_url)); 4117b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DataProtocolHandler data_protocol_handler; 4118b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_TRUE(data_protocol_handler.IsSafeRedirectTarget(data_url)); 4119b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 4120b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Test URLRequestJobFactoryImpl::IsSafeRedirectTarget(). 4121b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_FALSE(job_factory_.IsSafeRedirectTarget(file_url)); 4122b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_TRUE(job_factory_.IsSafeRedirectTarget(data_url)); 4123b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 4124b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 41255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, RestrictRedirects) { 41265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 41275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 41295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server_.GetURL( 41305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/redirect-to-file.html"), &d, &default_context_); 41315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 413290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 41335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::FAILED, req.status().status()); 41355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_UNSAFE_REDIRECT, req.status().error()); 41365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 41375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, RedirectToInvalidURL) { 41395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 41405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 41425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server_.GetURL( 41435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/redirect-to-invalid-url.html"), &d, &default_context_); 41445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 414590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 41465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::FAILED, req.status().status()); 41485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_INVALID_URL, req.status().error()); 41495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 41505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NoUserPassInReferrer) { 41525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 41535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 41555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 41565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURL("echoheader?Referer"), &d, &default_context_); 4157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) req.SetReferrer("http://user:pass@foo.com/"); 41585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 415990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 41605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("http://foo.com/"), d.data_received()); 41625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 41635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(URLRequestTestHTTP, NoFragmentInReferrer) { 4165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 4166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestDelegate d; 4168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest req( 4169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_server_.GetURL("echoheader?Referer"), &d, &default_context_); 4170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) req.SetReferrer("http://foo.com/test#fragment"); 4171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) req.Start(); 417290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 4173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string("http://foo.com/test"), d.data_received()); 4175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 4176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(URLRequestTestHTTP, EmptyReferrerAfterValidReferrer) { 4178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 4179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestDelegate d; 4181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest req( 4182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_server_.GetURL("echoheader?Referer"), &d, &default_context_); 4183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) req.SetReferrer("http://foo.com/test#fragment"); 4184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) req.SetReferrer(""); 4185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) req.Start(); 418690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 4187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string("None"), d.data_received()); 4189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 4190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 41915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, CancelRedirect) { 41925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 41935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 41955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 41965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_cancel_in_received_redirect(true); 41975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 41985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURL("files/redirect-test.html"), &d, &default_context_); 41995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 420090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 42015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 42035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d.bytes_received()); 42045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 42055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status()); 42065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, DeferredRedirect) { 42105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 42115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 42135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 42145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_quit_on_redirect(true); 4215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GURL test_url(test_server_.GetURL("files/redirect-test.html")); 4216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch URLRequest req(test_url, &d, &default_context_); 4217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 4218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch req.Start(); 4219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::MessageLoop::current()->Run(); 4220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 4221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(1, d.received_redirect_count()); 4222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 4223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch req.FollowDeferredRedirect(); 4224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::MessageLoop::current()->Run(); 4225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 4226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(1, d.response_started_count()); 4227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(d.received_data_before_response()); 4228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(URLRequestStatus::SUCCESS, req.status().status()); 4229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 4230eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::FilePath path; 4231eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PathService::Get(base::DIR_SOURCE_ROOT, &path); 4232eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch path = path.Append(FILE_PATH_LITERAL("net")); 4233eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch path = path.Append(FILE_PATH_LITERAL("data")); 4234eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch path = path.Append(FILE_PATH_LITERAL("url_request_unittest")); 4235eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch path = path.Append(FILE_PATH_LITERAL("with-headers.html")); 4236eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 4237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string contents; 4238eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(file_util::ReadFileToString(path, &contents)); 4239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(contents, d.data_received()); 4240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 4241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 4242eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 4243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(URLRequestTestHTTP, DeferredRedirect_GetFullRequestHeaders) { 4244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(test_server_.Start()); 4245eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 4246eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestDelegate d; 4247eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch { 4248eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch d.set_quit_on_redirect(true); 4249eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GURL test_url(test_server_.GetURL("files/redirect-test.html")); 4250eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch URLRequest req(test_url, &d, &default_context_); 4251eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 4252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(d.have_full_request_headers()); 4253eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 42545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 425590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 42565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.received_redirect_count()); 4258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(d.have_full_request_headers()); 4259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CheckFullRequestHeaders(d.full_request_headers(), test_url); 4260eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch d.ClearFullRequestHeaders(); 42615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.FollowDeferredRedirect(); 426390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 42645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4265eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GURL target_url(test_server_.GetURL("files/with-headers.html")); 42665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 4267eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(d.have_full_request_headers()); 4268eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CheckFullRequestHeaders(d.full_request_headers(), target_url); 42695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 42705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::SUCCESS, req.status().status()); 42715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath path; 42735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(base::DIR_SOURCE_ROOT, &path); 42745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.Append(FILE_PATH_LITERAL("net")); 42755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.Append(FILE_PATH_LITERAL("data")); 42765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.Append(FILE_PATH_LITERAL("url_request_unittest")); 42775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.Append(FILE_PATH_LITERAL("with-headers.html")); 42785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string contents; 42805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(file_util::ReadFileToString(path, &contents)); 42815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(contents, d.data_received()); 42825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, CancelDeferredRedirect) { 42865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 42875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 42895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 42905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_quit_on_redirect(true); 42915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 42925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURL("files/redirect-test.html"), &d, &default_context_); 42935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 429490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 42955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.received_redirect_count()); 42975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Cancel(); 429990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 43005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 43025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d.bytes_received()); 43035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 43045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status()); 43055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 43075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, VaryHeader) { 43095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 43105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 431190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Populate the cache. 43125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 43135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 43145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 43155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURL("echoheadercache?foo"), &d, &default_context_); 43165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders headers; 43175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.SetHeader("foo", "1"); 43185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.SetExtraRequestHeaders(headers); 43195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 432090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 432190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 432290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) LoadTimingInfo load_timing_info; 432390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) req.GetLoadTimingInfo(&load_timing_info); 432490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES); 43255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 432790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Expect a cache hit. 43285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 43295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 43305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 43315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURL("echoheadercache?foo"), &d, &default_context_); 43325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders headers; 43335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.SetHeader("foo", "1"); 43345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.SetExtraRequestHeaders(headers); 43355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 433690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 43375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(req.was_cached()); 433990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 434090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) LoadTimingInfo load_timing_info; 434190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) req.GetLoadTimingInfo(&load_timing_info); 434290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TestLoadTimingCacheHitNoNetwork(load_timing_info); 43435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 434590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Expect a cache miss. 43465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 43475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 43485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 43495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURL("echoheadercache?foo"), &d, &default_context_); 43505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders headers; 43515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.SetHeader("foo", "2"); 43525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.SetExtraRequestHeaders(headers); 43535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 435490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 43555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(req.was_cached()); 435790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 435890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) LoadTimingInfo load_timing_info; 435990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) req.GetLoadTimingInfo(&load_timing_info); 436090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES); 43615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 43635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, BasicAuth) { 43655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 43665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // populate the cache 43685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 43695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 43705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_credentials(AuthCredentials(kUser, kSecret)); 43715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(test_server_.GetURL("auth-basic"), &d, &default_context_); 43735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 43745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 437590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 43765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos); 43785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // repeat request with end-to-end validation. since auth-basic results in a 43815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // cachable page, we expect this test to result in a 304. in which case, the 43825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // response should be fetched from the cache. 43835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 43845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 43855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_credentials(AuthCredentials(kUser, kSecret)); 43865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(test_server_.GetURL("auth-basic"), &d, &default_context_); 43885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.set_load_flags(LOAD_VALIDATE_CACHE); 43895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 43905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 439190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 43925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos); 43945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should be the same cached document. 43965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.was_cached()); 43975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 43995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that Set-Cookie headers in 401 responses are respected. 44015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/6450 44025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, BasicAuthWithCookies) { 44035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 44045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url_requiring_auth = 44065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURL("auth-basic?set-cookie-if-challenged"); 44075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Request a page that will give a 401 containing a Set-Cookie header. 44095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that when the transaction is restarted, it includes the new cookie. 44105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 44112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNetworkDelegate network_delegate; // Must outlive URLRequest. 44125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 44135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 44145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 44155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 44175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_credentials(AuthCredentials(kUser, kSecret)); 44185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(url_requiring_auth, &d, &context); 44205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 44215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 442290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 44235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos); 44255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure we sent the cookie in the restarted transaction. 44275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("Cookie: got_challenged=true") 44285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) != std::string::npos); 44295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Same test as above, except this time the restart is initiated earlier 44325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (without user intervention since identity is embedded in the URL). 44335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 44342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNetworkDelegate network_delegate; // Must outlive URLRequest. 44355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 44365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 44375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 44385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 44405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL::Replacements replacements; 44425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string username("user2"); 44435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string password("secret"); 44445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacements.SetUsernameStr(username); 44455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacements.SetPasswordStr(password); 44465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url_with_identity = url_requiring_auth.ReplaceComponents(replacements); 44475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(url_with_identity, &d, &context); 44495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 44505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 44525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("user2/secret") != std::string::npos); 44545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure we sent the cookie in the restarted transaction. 44565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("Cookie: got_challenged=true") 44575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) != std::string::npos); 44585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that load timing works as expected with auth and the cache. 44622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, BasicAuthLoadTiming) { 44632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 44642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 44652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // populate the cache 44662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 44672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestDelegate d; 44682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) d.set_credentials(AuthCredentials(kUser, kSecret)); 44692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 44702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequest r(test_server_.GetURL("auth-basic"), &d, &default_context_); 44712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) r.Start(); 44722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 447390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 44742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 44752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos); 44762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 44772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadTimingInfo load_timing_info_before_auth; 44782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(default_network_delegate_.GetLoadTimingInfoBeforeAuth( 44792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &load_timing_info_before_auth)); 44802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestLoadTimingNotReused(load_timing_info_before_auth, 44812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CONNECT_TIMING_HAS_DNS_TIMES); 44822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 44832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadTimingInfo load_timing_info; 44842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) r.GetLoadTimingInfo(&load_timing_info); 44852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The test server does not support keep alive sockets, so the second 44862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // request with auth should use a new socket. 44872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES); 44882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(load_timing_info_before_auth.socket_log_id, 44892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) load_timing_info.socket_log_id); 44902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_LE(load_timing_info_before_auth.receive_headers_end, 44912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) load_timing_info.connect_timing.connect_start); 44922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 44932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 449490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Repeat request with end-to-end validation. Since auth-basic results in a 449590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // cachable page, we expect this test to result in a 304. In which case, the 44962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // response should be fetched from the cache. 44972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 44982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestDelegate d; 44992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) d.set_credentials(AuthCredentials(kUser, kSecret)); 45002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 45012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequest r(test_server_.GetURL("auth-basic"), &d, &default_context_); 45022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) r.set_load_flags(LOAD_VALIDATE_CACHE); 45032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) r.Start(); 45042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 450590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 45062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 45072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos); 45082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 45092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Should be the same cached document. 45102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(r.was_cached()); 45112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 451290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Since there was a request that went over the wire, the load timing 451390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // information should include connection times. 45142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadTimingInfo load_timing_info; 45152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) r.GetLoadTimingInfo(&load_timing_info); 451690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES); 45172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 45182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 45192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 45205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In this test, we do a POST which the server will 302 redirect. 45215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The subsequent transaction should use GET, and should not send the 45225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Content-Type header. 45235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://code.google.com/p/chromium/issues/detail?id=843 45245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, Post302RedirectGet) { 45255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 45265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kData[] = "hello world"; 45285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 45305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 45315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURL("files/redirect-to-echoall"), &d, &default_context_); 45325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.set_method("POST"); 45332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData))); 45345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set headers (some of which are specific to the POST). 45365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders headers; 45375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.AddHeadersFromString( 45385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Content-Type: multipart/form-data; " 45395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "boundary=----WebKitFormBoundaryAADeAA+NAAWMAAwZ\r\n" 45405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9," 45415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "text/plain;q=0.8,image/png,*/*;q=0.5\r\n" 45425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Accept-Language: en-US,en\r\n" 45435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Accept-Charset: ISO-8859-1,*,utf-8\r\n" 45445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Content-Length: 11\r\n" 45455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Origin: http://localhost:1337/"); 45465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.SetExtraRequestHeaders(headers); 45475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 454890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 45495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string mime_type; 45515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.GetMimeType(&mime_type); 45525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("text/html", mime_type); 45535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& data = d.data_received(); 45555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that the post-specific headers were stripped: 45575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(ContainsString(data, "Content-Length:")); 45585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(ContainsString(data, "Content-Type:")); 45595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(ContainsString(data, "Origin:")); 45605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These extra request headers should not have been stripped. 45625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ContainsString(data, "Accept:")); 45635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ContainsString(data, "Accept-Language:")); 45645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ContainsString(data, "Accept-Charset:")); 45655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 45665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following tests check that we handle mutating the request method for 45685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HTTP redirects as expected. 45695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See http://crbug.com/56373 and http://crbug.com/102130. 45705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, Redirect301Tests) { 45725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 45735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL url = test_server_.GetURL("files/redirect301-to-echo"); 45755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HTTPRedirectMethodTest(url, "POST", "GET", true); 45775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HTTPRedirectMethodTest(url, "PUT", "PUT", true); 45785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HTTPRedirectMethodTest(url, "HEAD", "HEAD", false); 45795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 45805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, Redirect302Tests) { 45825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 45835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL url = test_server_.GetURL("files/redirect302-to-echo"); 45855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HTTPRedirectMethodTest(url, "POST", "GET", true); 45875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HTTPRedirectMethodTest(url, "PUT", "PUT", true); 45885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HTTPRedirectMethodTest(url, "HEAD", "HEAD", false); 45895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 45905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, Redirect303Tests) { 45925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 45935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL url = test_server_.GetURL("files/redirect303-to-echo"); 45955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HTTPRedirectMethodTest(url, "POST", "GET", true); 45975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HTTPRedirectMethodTest(url, "PUT", "GET", true); 45985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HTTPRedirectMethodTest(url, "HEAD", "HEAD", false); 45995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 46005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, Redirect307Tests) { 46025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 46035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL url = test_server_.GetURL("files/redirect307-to-echo"); 46055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HTTPRedirectMethodTest(url, "POST", "POST", true); 46075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HTTPRedirectMethodTest(url, "PUT", "PUT", true); 46085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HTTPRedirectMethodTest(url, "HEAD", "HEAD", false); 46095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 46105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, InterceptPost302RedirectGet) { 46125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 46135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kData[] = "hello world"; 46155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 46175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server_.GetURL("empty.html"), &d, &default_context_); 46185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.set_method("POST"); 46192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData))); 46205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders headers; 46215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.SetHeader(HttpRequestHeaders::kContentLength, 46225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::UintToString(arraysize(kData) - 1)); 46235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.SetExtraRequestHeaders(headers); 46245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestRedirectJob* job = new URLRequestRedirectJob( 46262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &req, &default_network_delegate_, test_server_.GetURL("echo"), 46272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequestRedirectJob::REDIRECT_302_FOUND); 46285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddTestInterceptor()->set_main_intercept_job(job); 46295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 463190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 46325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("GET", req.method()); 46335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 46345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, InterceptPost307RedirectPost) { 46365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 46375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kData[] = "hello world"; 46395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 46415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server_.GetURL("empty.html"), &d, &default_context_); 46425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.set_method("POST"); 46432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData))); 46445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders headers; 46455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.SetHeader(HttpRequestHeaders::kContentLength, 46465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::UintToString(arraysize(kData) - 1)); 46475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.SetExtraRequestHeaders(headers); 46485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestRedirectJob* job = new URLRequestRedirectJob( 46502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &req, &default_network_delegate_, test_server_.GetURL("echo"), 46515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestRedirectJob::REDIRECT_307_TEMPORARY_REDIRECT); 46525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddTestInterceptor()->set_main_intercept_job(job); 46535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 465590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 46565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("POST", req.method()); 46575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kData, d.data_received()); 46585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 46595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that default A-L header is sent. 46615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, DefaultAcceptLanguage) { 46625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 46635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StaticHttpUserAgentSettings settings("en", EmptyString()); 46652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNetworkDelegate network_delegate; // Must outlive URLRequests. 46665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 46675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 46685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_http_user_agent_settings(&settings); 46695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 46705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 46725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 46735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURL("echoheader?Accept-Language"), &d, &context); 46745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 467590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 46765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("en", d.data_received()); 46775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 46785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that an empty A-L header is not sent. http://crbug.com/77365. 46805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, EmptyAcceptLanguage) { 46815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 46825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StaticHttpUserAgentSettings settings(EmptyString(), EmptyString()); 46842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNetworkDelegate network_delegate; // Must outlive URLRequests. 46855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 46865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 46875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 46885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We override the language after initialization because empty entries 46895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // get overridden by Init(). 46905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_http_user_agent_settings(&settings); 46915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 46935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 46945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURL("echoheader?Accept-Language"), &d, &context); 46955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 469690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 46975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("None", d.data_received()); 46985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 46995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that if request overrides the A-L header, the default is not appended. 47015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See http://crbug.com/20894 47025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, OverrideAcceptLanguage) { 47035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 47045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 47065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server_.GetURL("echoheader?Accept-Language"), 47075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 47085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 47095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders headers; 47105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.SetHeader(HttpRequestHeaders::kAcceptLanguage, "ru"); 47115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.SetExtraRequestHeaders(headers); 47125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 471390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 47145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("ru"), d.data_received()); 47155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 47165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that default A-E header is sent. 47185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, DefaultAcceptEncoding) { 47195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 47205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 47225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server_.GetURL("echoheader?Accept-Encoding"), 47235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 47245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 47255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders headers; 47265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.SetExtraRequestHeaders(headers); 47275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 472890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 47295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ContainsString(d.data_received(), "gzip")); 47305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 47315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that if request overrides the A-E header, the default is not appended. 47335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See http://crbug.com/47381 47345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, OverrideAcceptEncoding) { 47355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 47365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 47385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server_.GetURL("echoheader?Accept-Encoding"), 47395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 47405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 47415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders headers; 47425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.SetHeader(HttpRequestHeaders::kAcceptEncoding, "identity"); 47435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.SetExtraRequestHeaders(headers); 47445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 474590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 47465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(ContainsString(d.data_received(), "gzip")); 47475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ContainsString(d.data_received(), "identity")); 47485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 47495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Check that setting the A-C header sends the proper header. 47512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, SetAcceptCharset) { 47525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 47535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 47555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server_.GetURL("echoheader?Accept-Charset"), 47565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 47575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 47585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders headers; 47595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.SetHeader(HttpRequestHeaders::kAcceptCharset, "koi-8r"); 47605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.SetExtraRequestHeaders(headers); 47615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 476290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 47635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("koi-8r"), d.data_received()); 47645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 47655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that default User-Agent header is sent. 47675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, DefaultUserAgent) { 47685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 47695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 47715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server_.GetURL("echoheader?User-Agent"), 47725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 47735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 47745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 477590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 47765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(req.context()->GetUserAgent(req.url()), d.data_received()); 47775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 47785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that if request overrides the User-Agent header, 47805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the default is not appended. 47815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, OverrideUserAgent) { 47825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 47835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 47855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server_.GetURL("echoheader?User-Agent"), 47865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 47875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 47885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders headers; 47895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.SetHeader(HttpRequestHeaders::kUserAgent, "Lynx (textmode)"); 47905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.SetExtraRequestHeaders(headers); 47915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 479290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 47935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the net tests are being run with ChromeFrame then we need to allow for 47945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the 'chromeframe' suffix which is added to the user agent before the 47955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // closing parentheses. 47965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(StartsWithASCII(d.data_received(), "Lynx (textmode", true)); 47975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 47985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that a NULL HttpUserAgentSettings causes the corresponding empty 48005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// User-Agent header to be sent but does not send the Accept-Language and 48015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Accept-Charset headers. 48025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, EmptyHttpUserAgentSettings) { 48035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 48045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNetworkDelegate network_delegate; // Must outlive URLRequests. 48065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 48075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 48085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 48095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We override the HttpUserAgentSettings after initialization because empty 48105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // entries get overridden by Init(). 48115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_http_user_agent_settings(NULL); 48125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct { 48145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* request; 48155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* expected_response; 48165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } tests[] = { { "echoheader?Accept-Language", "None" }, 48175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "echoheader?Accept-Charset", "None" }, 48185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "echoheader?User-Agent", "" } }; 48195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); i++) { 48215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 48225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server_.GetURL(tests[i].request), &d, &context); 48235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 482490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 48255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(tests[i].expected_response, d.data_received()) 48265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " Request = \"" << tests[i].request << "\""; 48275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 48295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Make sure that URLRequest passes on its priority updates to 48312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// newly-created jobs after the first one. 48322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, SetSubsequentJobPriority) { 48332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 48342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 48352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestDelegate d; 48362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequest req(test_server_.GetURL("empty.html"), &d, &default_context_); 48372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(DEFAULT_PRIORITY, req.priority()); 48382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 48392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<URLRequestRedirectJob> redirect_job = 48402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new URLRequestRedirectJob( 48412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &req, &default_network_delegate_, test_server_.GetURL("echo"), 48422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequestRedirectJob::REDIRECT_302_FOUND); 4843868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) AddTestInterceptor()->set_main_intercept_job(redirect_job.get()); 48442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 48452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.SetPriority(LOW); 48462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.Start(); 48472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(req.is_pending()); 48482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 48492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<URLRequestTestJob> job = 48502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new URLRequestTestJob(&req, &default_network_delegate_); 4851868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) AddTestInterceptor()->set_main_intercept_job(job.get()); 48522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 48532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Should trigger |job| to be started. 485490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 48552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(LOW, job->priority()); 48562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 48572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 48585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HTTPSRequestTest : public testing::Test { 48595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 48605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HTTPSRequestTest() : default_context_(true) { 48615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&default_network_delegate_); 48625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.Init(); 48635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~HTTPSRequestTest() {} 48655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 48672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNetworkDelegate default_network_delegate_; // Must outlive URLRequest. 48685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext default_context_; 48695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 48705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(HTTPSRequestTest, HTTPSGetTest) { 4872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer test_server( 4873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::TYPE_HTTPS, 4874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::kLocalhost, 4875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 48765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 48775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 48795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest r(test_server.GetURL(std::string()), &d, &default_context_); 48815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 48825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 48835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 488490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 48855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 48875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 48885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, d.bytes_received()); 48895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckSSLInfo(r.ssl_info()); 48905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(test_server.host_port_pair().host(), 48915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.GetSocketAddress().host()); 48925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(test_server.host_port_pair().port(), 48935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.GetSocketAddress().port()); 48945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 48965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSRequestTest, HTTPSMismatchedTest) { 4898c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options( 4899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME); 4900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer test_server( 4901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::TYPE_HTTPS, 4902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options, 4903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 49045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 49055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool err_allowed = true; 49075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 2 ; i++, err_allowed = !err_allowed) { 49085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 49095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 49105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_allow_certificate_errors(err_allowed); 4911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest r(test_server.GetURL(std::string()), &d, &default_context_); 49125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 49145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 49155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 491690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 49175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 49195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 49205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.have_certificate_errors()); 49215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err_allowed) { 49225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, d.bytes_received()); 49235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckSSLInfo(r.ssl_info()); 49245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 49255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d.bytes_received()); 49265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 49305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSRequestTest, HTTPSExpiredTest) { 4932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options( 4933c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions::CERT_EXPIRED); 4934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer test_server( 4935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::TYPE_HTTPS, 4936c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options, 4937c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 49385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 49395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Iterate from false to true, just so that we do the opposite of the 49415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // previous test in order to increase test coverage. 49425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool err_allowed = false; 49435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 2 ; i++, err_allowed = !err_allowed) { 49445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 49455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 49465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_allow_certificate_errors(err_allowed); 4947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest r(test_server.GetURL(std::string()), &d, &default_context_); 49485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 49505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 49515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 49535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 49555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 49565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.have_certificate_errors()); 49575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err_allowed) { 49585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, d.bytes_received()); 49595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckSSLInfo(r.ssl_info()); 49605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 49615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d.bytes_received()); 49625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 49665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests TLSv1.1 -> TLSv1 fallback. Verifies that we don't fall back more 49685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// than necessary. 49695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSRequestTest, TLSv1Fallback) { 49705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16 default_version_max = SSLConfigService::default_version_max(); 49715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The OpenSSL library in use may not support TLS 1.1. 49725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(USE_OPENSSL) 49735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(default_version_max, SSL_PROTOCOL_VERSION_TLS1); 49745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 49755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (default_version_max <= SSL_PROTOCOL_VERSION_TLS1) 49765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 49775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options( 4979c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions::CERT_OK); 49805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.tls_intolerant = 4981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions::TLS_INTOLERANT_TLS1_1; 4982c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer test_server( 4983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::TYPE_HTTPS, 4984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options, 4985c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 49865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 49875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 49895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 49905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 49915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_allow_certificate_errors(true); 4992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest r(test_server.GetURL(std::string()), &d, &context); 49935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 49945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 499590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 49965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 49985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, d.bytes_received()); 49995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<int>(SSL_CONNECTION_VERSION_TLS1), 50005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLConnectionStatusToVersion(r.ssl_info().connection_status)); 50015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.ssl_info().connection_status & SSL_CONNECTION_VERSION_FALLBACK); 50025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 50035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This tests that a load of www.google.com with a certificate error sets 50055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the |certificate_errors_are_fatal| flag correctly. This flag will cause 50065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the interstitial to be fatal. 50075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSRequestTest, HTTPSPreloadedHSTSTest) { 5008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options( 5009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME); 5010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer test_server( 5011c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::TYPE_HTTPS, 5012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options, 5013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 50145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 50155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We require that the URL be www.google.com in order to pick up the 50175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // preloaded HSTS entries in the TransportSecurityState. This means that we 50185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // have to use a MockHostResolver in order to direct www.google.com to the 50192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // testserver. By default, MockHostResolver maps all hosts to 127.0.0.1. 50205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockHostResolver host_resolver; 50222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNetworkDelegate network_delegate; // Must outlive URLRequest. 50235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 50245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 50255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_host_resolver(&host_resolver); 50265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransportSecurityState transport_security_state; 50275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_transport_security_state(&transport_security_state); 50285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 50295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 50312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequest r(GURL(base::StringPrintf("https://www.google.com:%d", 50322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_server.host_port_pair().port())), 50335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 50345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &context); 50355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 50375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 50385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 503990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 50405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 50425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 50435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.have_certificate_errors()); 50445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.certificate_errors_are_fatal()); 50455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 50465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This tests that cached HTTPS page loads do not cause any updates to the 50485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TransportSecurityState. 50495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSRequestTest, HTTPSErrorsNoClobberTSSTest) { 50505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The actual problem -- CERT_MISMATCHED_NAME in this case -- doesn't 50515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // matter. It just has to be any error. 5052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options( 5053c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME); 5054c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer test_server( 5055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::TYPE_HTTPS, 5056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options, 5057c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 50585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 50595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We require that the URL be www.google.com in order to pick up the 50615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // preloaded and dynamic HSTS and public key pin entries in the 50625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TransportSecurityState. This means that we have to use a 50635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MockHostResolver in order to direct www.google.com to the testserver. 50642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // By default, MockHostResolver maps all hosts to 127.0.0.1. 50655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockHostResolver host_resolver; 50672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNetworkDelegate network_delegate; // Must outlive URLRequest. 50685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 50695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 50705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_host_resolver(&host_resolver); 50715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransportSecurityState transport_security_state; 50725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransportSecurityState::DomainState domain_state; 50735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(transport_security_state.GetDomainState("www.google.com", true, 50745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &domain_state)); 50755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_transport_security_state(&transport_security_state); 50765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 50775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 50792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequest r(GURL(base::StringPrintf("https://www.google.com:%d", 50802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_server.host_port_pair().port())), 50815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 50825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &context); 50835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 50855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 50865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 508790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 50885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 50905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 50915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.have_certificate_errors()); 50925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.certificate_errors_are_fatal()); 50935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get a fresh copy of the state, and check that it hasn't been updated. 50955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransportSecurityState::DomainState new_domain_state; 50965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(transport_security_state.GetDomainState("www.google.com", true, 50975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &new_domain_state)); 50985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(new_domain_state.upgrade_mode, domain_state.upgrade_mode); 50997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(new_domain_state.sts_include_subdomains, 51007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) domain_state.sts_include_subdomains); 51017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(new_domain_state.pkp_include_subdomains, 51027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) domain_state.pkp_include_subdomains); 51035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(FingerprintsEqual(new_domain_state.static_spki_hashes, 51045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) domain_state.static_spki_hashes)); 51055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(FingerprintsEqual(new_domain_state.dynamic_spki_hashes, 51065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) domain_state.dynamic_spki_hashes)); 51075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(FingerprintsEqual(new_domain_state.bad_static_spki_hashes, 51085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) domain_state.bad_static_spki_hashes)); 51095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 51105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Make sure HSTS preserves a POST request's method and body. 51122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(HTTPSRequestTest, HSTSPreservesPosts) { 51132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static const char kData[] = "hello world"; 51142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options( 5116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions::CERT_OK); 5117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer test_server( 5118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::TYPE_HTTPS, 5119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options, 5120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 51212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_server.Start()); 51222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 51232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 51242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Per spec, TransportSecurityState expects a domain name, rather than an IP 51252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // address, so a MockHostResolver is needed to redirect www.somewhere.com to 5126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the SpawnedTestServer. By default, MockHostResolver maps all hosts 5127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // to 127.0.0.1. 51282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockHostResolver host_resolver; 51292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 51302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Force https for www.somewhere.com. 51312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TransportSecurityState transport_security_state; 51322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time expiry = base::Time::Now() + base::TimeDelta::FromDays(1000); 51332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool include_subdomains = false; 51342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transport_security_state.AddHSTS("www.somewhere.com", expiry, 51352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) include_subdomains); 51362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 51372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNetworkDelegate network_delegate; // Must outlive URLRequest. 51382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 51392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestURLRequestContext context(true); 51402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context.set_host_resolver(&host_resolver); 51412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context.set_transport_security_state(&transport_security_state); 51422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context.set_network_delegate(&network_delegate); 51432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context.Init(); 51442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 51452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestDelegate d; 51462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Navigating to https://www.somewhere.com instead of https://127.0.0.1 will 51472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // cause a certificate error. Ignore the error. 51482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) d.set_allow_certificate_errors(true); 51492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 51502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequest req(GURL(base::StringPrintf("http://www.somewhere.com:%d/echo", 51512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_server.host_port_pair().port())), 51522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &d, 51532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &context); 51542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.set_method("POST"); 51552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData))); 51562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 51572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.Start(); 515890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 51592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 51602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("https", req.url().scheme()); 51612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("POST", req.method()); 51622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kData, d.data_received()); 5163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch LoadTimingInfo load_timing_info; 5165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch network_delegate.GetLoadTimingInfoBeforeRedirect(&load_timing_info); 5166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // LoadTimingInfo of HSTS redirects is similar to that of network cache hits 5167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestLoadTimingCacheHitNoNetwork(load_timing_info); 51682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 51692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 51705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSRequestTest, SSLv3Fallback) { 5171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options( 5172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions::CERT_OK); 5173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options.tls_intolerant = 5174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions::TLS_INTOLERANT_ALL; 5175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer test_server( 5176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::TYPE_HTTPS, 5177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options, 5178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 51795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 51805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 51825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 51835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 51845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_allow_certificate_errors(true); 5185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest r(test_server.GetURL(std::string()), &d, &context); 51865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 51875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 518890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 51895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 51915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, d.bytes_received()); 51925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<int>(SSL_CONNECTION_VERSION_SSL3), 51935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLConnectionStatusToVersion(r.ssl_info().connection_status)); 51945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.ssl_info().connection_status & SSL_CONNECTION_VERSION_FALLBACK); 51955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 51965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 51985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SSLClientAuthTestDelegate : public TestDelegate { 52005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 52015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLClientAuthTestDelegate() : on_certificate_requested_count_(0) { 52025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnCertificateRequested( 52045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest* request, 52052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SSLCertRequestInfo* cert_request_info) OVERRIDE { 52065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) on_certificate_requested_count_++; 520790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Quit(); 52085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int on_certificate_requested_count() { 52105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return on_certificate_requested_count_; 52115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 52135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int on_certificate_requested_count_; 52145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 52155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 52175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(davidben): Test the rest of the code. Specifically, 52195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Filtering which certificates to select. 52205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Sending a certificate back. 52215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Getting a certificate request in an SSL renegotiation sending the 52225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HTTP request. 52235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSRequestTest, ClientAuthTest) { 5224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options; 52255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.request_client_certificate = true; 5226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer test_server( 5227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::TYPE_HTTPS, 5228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options, 5229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 52305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 52315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLClientAuthTestDelegate d; 52335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest r(test_server.GetURL(std::string()), &d, &default_context_); 52355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 52375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 52385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 523990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 52405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.on_certificate_requested_count()); 52425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 52435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d.bytes_received()); 52445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send no certificate. 52465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(davidben): Get temporary client cert import (with keys) working on 52475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // all platforms so we can test sending a cert as well. 52485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.ContinueWithCertificate(NULL); 52495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 52515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 52535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 52545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, d.bytes_received()); 52555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 52575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSRequestTest, ResumeTest) { 52595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test that we attempt a session resume when making two connections to the 52605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // same host. 5261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options; 52625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.record_resume = true; 5263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer test_server( 5264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::TYPE_HTTPS, 5265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options, 5266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 52675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 52685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLClientSocket::ClearSessionCache(); 52705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 52725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 52735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r( 52745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("ssl-session-cache"), &d, &default_context_); 52755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 52775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 52785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 527990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 52805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 52825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<HttpCache*>(default_context_.http_transaction_factory())-> 52855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloseAllConnections(); 52865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 52885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 52895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r( 52905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("ssl-session-cache"), &d, &default_context_); 52915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 52935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 52945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 529590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 52965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The response will look like; 52985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // insert abc 52995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // lookup abc 53005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // insert xyz 53015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 53025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // With a newline at the end which makes the split think that there are 53035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // four lines. 53045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 53065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> lines; 53075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SplitString(d.data_received(), '\n', &lines); 53085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(4u, lines.size()) << d.data_received(); 53095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string session_id; 53115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < 2; i++) { 53135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> parts; 53145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SplitString(lines[i], '\t', &parts); 53155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2u, parts.size()); 53165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i == 0) { 53175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("insert", parts[0]); 53185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_id = parts[1]; 53195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 53205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("lookup", parts[0]); 53215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(session_id, parts[1]); 53225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 53265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSRequestTest, SSLSessionCacheShardTest) { 53285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test that sessions aren't resumed when the value of ssl_session_cache_shard 53295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // differs. 5330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options; 53315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.record_resume = true; 5332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer test_server( 5333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::TYPE_HTTPS, 5334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options, 5335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 53365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 53375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLClientSocket::ClearSessionCache(); 53395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 53415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 53425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r( 53435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("ssl-session-cache"), &d, &default_context_); 53445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 53465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 53475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 534890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 53495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 53515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now create a new HttpCache with a different ssl_session_cache_shard value. 53545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpNetworkSession::Params params; 53555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.host_resolver = default_context_.host_resolver(); 53565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.cert_verifier = default_context_.cert_verifier(); 53577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) params.transport_security_state = default_context_.transport_security_state(); 53585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.proxy_service = default_context_.proxy_service(); 53595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.ssl_config_service = default_context_.ssl_config_service(); 53605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.http_auth_handler_factory = 53615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.http_auth_handler_factory(); 53622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.network_delegate = &default_network_delegate_; 53635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.http_server_properties = default_context_.http_server_properties(); 53645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.ssl_session_cache_shard = "alternate"; 53655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<net::HttpCache> cache(new net::HttpCache( 53675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new net::HttpNetworkSession(params), 53685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpCache::DefaultBackend::InMemory(0))); 53695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_http_transaction_factory(cache.get()); 53715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 53735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 53745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r( 53755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("ssl-session-cache"), &d, &default_context_); 53765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 53785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 53795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 538090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 53815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The response will look like; 53835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // insert abc 53845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // insert xyz 53855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 53865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // With a newline at the end which makes the split think that there are 53875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // three lines. 53885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 53905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> lines; 53915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SplitString(d.data_received(), '\n', &lines); 53925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3u, lines.size()); 53935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string session_id; 53955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < 2; i++) { 53965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> parts; 53975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SplitString(lines[i], '\t', &parts); 53985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2u, parts.size()); 53995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("insert", parts[0]); 54005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i == 0) { 54015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_id = parts[1]; 54025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 54035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(session_id, parts[1]); 54045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 54085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestSSLConfigService : public SSLConfigService { 54105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 54115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestSSLConfigService(bool ev_enabled, bool online_rev_checking) 54125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : ev_enabled_(ev_enabled), 54135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) online_rev_checking_(online_rev_checking) { 54145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SSLConfigService: 54175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void GetSSLConfig(SSLConfig* config) OVERRIDE { 54185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *config = SSLConfig(); 54195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config->rev_checking_enabled = online_rev_checking_; 54205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config->verify_ev_cert = ev_enabled_; 54215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 54245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestSSLConfigService() {} 54255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 54275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool ev_enabled_; 54285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool online_rev_checking_; 54295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 54305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This the fingerprint of the "Testing CA" certificate used by the testserver. 54325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See net/data/ssl/certificates/ocsp-test-root.pem. 54335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const SHA1HashValue kOCSPTestCertFingerprint = 54345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0xf1, 0xad, 0xf6, 0xce, 0x42, 0xac, 0xe7, 0xb4, 0xf4, 0x24, 54355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0xdb, 0x1a, 0xf7, 0xa0, 0x9f, 0x09, 0xa1, 0xea, 0xf1, 0x5c } }; 54365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is the policy OID contained in the certificates that testserver 54385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// generates. 54395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kOCSPTestCertPolicy[] = "1.3.6.1.4.1.11129.2.4.1"; 54405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HTTPSOCSPTest : public HTTPSRequestTest { 54425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 54435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HTTPSOCSPTest() 54445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : context_(true), 54455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ev_test_policy_( 54465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ScopedTestEVPolicy(EVRootCAMetadata::GetInstance(), 54475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kOCSPTestCertFingerprint, 54485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kOCSPTestCertPolicy)) { 54495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 54525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetupContext(&context_); 54535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_.Init(); 54545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::X509Certificate> root_cert = 54565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ImportCertFromFile(GetTestCertsDirectory(), "ocsp-test-root.pem"); 54575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK_NE(static_cast<X509Certificate*>(NULL), root_cert); 5458868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) test_root_.reset(new ScopedTestRoot(root_cert.get())); 54595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_NSS) || defined(OS_IOS) 54615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetURLRequestContextForNSSHttpIO(&context_); 54625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnsureNSSHttpIOInit(); 54635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 54645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void DoConnection(const SpawnedTestServer::SSLOptions& ssl_options, 54675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CertStatus* out_cert_status) { 54682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We always overwrite out_cert_status. 54692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *out_cert_status = 0; 5470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer test_server( 5471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::TYPE_HTTPS, 5472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options, 5473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 54745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 54755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 54775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_allow_certificate_errors(true); 5478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest r(test_server.GetURL(std::string()), &d, &context_); 54795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 54805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 548190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 54825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 54845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_cert_status = r.ssl_info().cert_status; 54855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~HTTPSOCSPTest() { 54882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_NSS) || defined(OS_IOS) 54895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShutdownNSSHttpIO(); 54905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 54915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 54945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SetupContext configures the URLRequestContext that will be used for making 54955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // connetions to testserver. This can be overridden in test subclasses for 54965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // different behaviour. 54975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetupContext(URLRequestContext* context) { 54985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context->set_ssl_config_service( 54995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new TestSSLConfigService(true /* check for EV */, 55005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true /* online revocation checking */)); 55015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 55025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ScopedTestRoot> test_root_; 55045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context_; 55055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ScopedTestEVPolicy> ev_test_policy_; 55065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 55075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static CertStatus ExpectedCertStatusForFailedOnlineRevocationCheck() { 55095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 55105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Windows can return CERT_STATUS_UNABLE_TO_CHECK_REVOCATION but we don't 55115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // have that ability on other platforms. 55125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CERT_STATUS_UNABLE_TO_CHECK_REVOCATION; 55135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 55145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 55155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 55165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 55175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SystemUsesChromiumEVMetadata returns true iff the current operating system 55195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// uses Chromium's EV metadata (i.e. EVRootCAMetadata). If it does not, then 55205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// several tests are effected because our testing EV certificate won't be 55215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// recognised as EV. 55225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static bool SystemUsesChromiumEVMetadata() { 55235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_OPENSSL) 55245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://crbug.com/117478 - OpenSSL does not support EV validation. 55255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 55262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_MACOSX) && !defined(OS_IOS) 55275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On OS X, we use the system to tell us whether a certificate is EV or not 55285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and the system won't recognise our testing root. 55295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 55305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 55315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 55325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 55335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 55345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static bool SystemSupportsOCSP() { 55365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_OPENSSL) 55375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://crbug.com/117478 - OpenSSL does not support OCSP. 55385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 55395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_WIN) 55405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::win::GetVersion() >= base::win::VERSION_VISTA; 55415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_ANDROID) 55425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(jnd): http://crbug.com/117478 - EV verification is not yet supported. 55435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 55445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 55455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 55465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 55475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 55485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSOCSPTest, Valid) { 55505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!SystemSupportsOCSP()) { 55515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Skipping test because system doesn't support OCSP"; 55525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 55535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 55545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options( 5556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions::CERT_AUTO); 5557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_OK; 55585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CertStatus cert_status; 55605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoConnection(ssl_options, &cert_status); 55615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS); 55635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(SystemUsesChromiumEVMetadata(), 55655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<bool>(cert_status & CERT_STATUS_IS_EV)); 55665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED); 55685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 55695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSOCSPTest, Revoked) { 55715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!SystemSupportsOCSP()) { 55725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Skipping test because system doesn't support OCSP"; 55735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 55745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 55755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options( 5577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions::CERT_AUTO); 5578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_REVOKED; 55795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CertStatus cert_status; 55815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoConnection(ssl_options, &cert_status); 55825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !(defined(OS_MACOSX) && !defined(OS_IOS)) 55845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Doesn't pass on OS X yet for reasons that need to be investigated. 55855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(CERT_STATUS_REVOKED, cert_status & CERT_STATUS_ALL_ERRORS); 55865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 55875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV); 55885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED); 55895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 55905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSOCSPTest, Invalid) { 55925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!SystemSupportsOCSP()) { 55935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Skipping test because system doesn't support OCSP"; 55945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 55955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 55965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options( 5598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions::CERT_AUTO); 5599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID; 56005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CertStatus cert_status; 56025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoConnection(ssl_options, &cert_status); 56035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ExpectedCertStatusForFailedOnlineRevocationCheck(), 56055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cert_status & CERT_STATUS_ALL_ERRORS); 56065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Without a positive OCSP response, we shouldn't show the EV status. 56085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV); 56095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED); 56105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 56115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HTTPSEVCRLSetTest : public HTTPSOCSPTest { 56135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 56145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetupContext(URLRequestContext* context) OVERRIDE { 56155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context->set_ssl_config_service( 56165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new TestSSLConfigService(true /* check for EV */, 56175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false /* online revocation checking */)); 56185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 56195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 56205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSEVCRLSetTest, MissingCRLSetAndInvalidOCSP) { 56225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!SystemSupportsOCSP()) { 56235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Skipping test because system doesn't support OCSP"; 56245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 56255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 56265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options( 5628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions::CERT_AUTO); 5629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID; 56305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLConfigService::SetCRLSet(scoped_refptr<CRLSet>()); 56315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CertStatus cert_status; 56335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoConnection(ssl_options, &cert_status); 56345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ExpectedCertStatusForFailedOnlineRevocationCheck(), 56365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cert_status & CERT_STATUS_ALL_ERRORS); 56375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV); 56395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(SystemUsesChromiumEVMetadata(), 56405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED)); 56415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 56425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSEVCRLSetTest, MissingCRLSetAndGoodOCSP) { 56445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!SystemSupportsOCSP()) { 56455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Skipping test because system doesn't support OCSP"; 56465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 56475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 56485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options( 5650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions::CERT_AUTO); 5651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_OK; 56525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLConfigService::SetCRLSet(scoped_refptr<CRLSet>()); 56535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CertStatus cert_status; 56555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoConnection(ssl_options, &cert_status); 56565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS); 56585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(SystemUsesChromiumEVMetadata(), 56605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<bool>(cert_status & CERT_STATUS_IS_EV)); 56615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(SystemUsesChromiumEVMetadata(), 56625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED)); 56635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 56645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSEVCRLSetTest, ExpiredCRLSet) { 56665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!SystemSupportsOCSP()) { 56675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Skipping test because system doesn't support OCSP"; 56685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 56695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 56705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options( 5672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions::CERT_AUTO); 5673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID; 56745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLConfigService::SetCRLSet( 56755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<CRLSet>(CRLSet::ExpiredCRLSetForTesting())); 56765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CertStatus cert_status; 56785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoConnection(ssl_options, &cert_status); 56795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ExpectedCertStatusForFailedOnlineRevocationCheck(), 56815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cert_status & CERT_STATUS_ALL_ERRORS); 56825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV); 56845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(SystemUsesChromiumEVMetadata(), 56855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED)); 56865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 56875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSEVCRLSetTest, FreshCRLSet) { 5689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options( 5690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions::CERT_AUTO); 5691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID; 56925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLConfigService::SetCRLSet( 56935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<CRLSet>(CRLSet::EmptyCRLSetForTesting())); 56945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CertStatus cert_status; 56965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoConnection(ssl_options, &cert_status); 56975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // With a valid, fresh CRLSet the bad OCSP response shouldn't matter because 56995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we wont check it. 57005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS); 57015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(SystemUsesChromiumEVMetadata(), 57035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<bool>(cert_status & CERT_STATUS_IS_EV)); 57045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED); 57065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 57075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSEVCRLSetTest, ExpiredCRLSetAndRevokedNonEVCert) { 57095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test that when EV verification is requested, but online revocation 57105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // checking is disabled, and the leaf certificate is not in fact EV, that 57115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // no revocation checking actually happens. 57125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!SystemSupportsOCSP()) { 57135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Skipping test because system doesn't support OCSP"; 57145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 57155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unmark the certificate's OID as EV, which should disable revocation 57185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // checking (as per the user preference) 57195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ev_test_policy_.reset(); 57205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5721c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options( 5722c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions::CERT_AUTO); 5723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_REVOKED; 57245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLConfigService::SetCRLSet( 57255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<CRLSet>(CRLSet::ExpiredCRLSetForTesting())); 57265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CertStatus cert_status; 57285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoConnection(ssl_options, &cert_status); 57295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS); 57315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV); 57335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED); 57345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 57355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HTTPSCRLSetTest : public HTTPSOCSPTest { 57375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 57385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetupContext(URLRequestContext* context) OVERRIDE { 57395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context->set_ssl_config_service( 57405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new TestSSLConfigService(false /* check for EV */, 57415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false /* online revocation checking */)); 57425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 57445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSCRLSetTest, ExpiredCRLSet) { 5746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options( 5747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions::CERT_AUTO); 5748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID; 57495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLConfigService::SetCRLSet( 57505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<CRLSet>(CRLSet::ExpiredCRLSetForTesting())); 57515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CertStatus cert_status; 57535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoConnection(ssl_options, &cert_status); 57545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we're not trying EV verification then, even if the CRLSet has expired, 57565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we don't fall back to online revocation checks. 57575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS); 57585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV); 57595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED); 57605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 57615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // !defined(OS_IOS) 57625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(DISABLE_FTP_SUPPORT) 57645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRequestTestFTP : public URLRequestTest { 57655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 57665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestTestFTP() 5767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : test_server_(SpawnedTestServer::TYPE_FTP, SpawnedTestServer::kLocalhost, 57682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath()) { 57695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 5772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer test_server_; 57735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 57745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure an FTP request using an unsafe ports fails. 57762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestFTP, UnsafePort) { 57775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 57785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestJobFactoryImpl job_factory; 5780b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) FtpNetworkLayer ftp_transaction_factory(default_context_.host_resolver()); 57815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("ftp://127.0.0.1:7"); 57835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) job_factory.SetProtocolHandler( 57845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ftp", 5785b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) new FtpProtocolHandler(&ftp_transaction_factory)); 57865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_job_factory(&job_factory); 57875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 57895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 57905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(url, &d, &default_context_); 57915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 57925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 57935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 579490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 57955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(r.is_pending()); 57975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::FAILED, r.status().status()); 57985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_UNSAFE_PORT, r.status().error()); 57995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 58015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, see http://crbug.com/25045. 58035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestFTP, DISABLED_FTPDirectoryListing) { 58045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 58055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 58075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 58085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(test_server_.GetURL("/"), &d, &default_context_); 58095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 58105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 58115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 581290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 58135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(r.is_pending()); 58155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 58165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 58175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LT(0, d.bytes_received()); 58185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(test_server_.host_port_pair().host(), 58195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.GetSocketAddress().host()); 58205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(test_server_.host_port_pair().port(), 58215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.GetSocketAddress().port()); 58225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 58245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, see http://crbug.com/25045. 58265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestFTP, DISABLED_FTPGetTestAnonymous) { 58275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 58285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath app_path; 58305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(base::DIR_SOURCE_ROOT, &app_path); 58315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_path = app_path.AppendASCII("LICENSE"); 58325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 58335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 58345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(test_server_.GetURL("/LICENSE"), &d, &default_context_); 58355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 58365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 58375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 583890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 58395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 file_size = 0; 58415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_util::GetFileSize(app_path, &file_size); 58425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(r.is_pending()); 58445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 58455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 58465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size)); 58475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(test_server_.host_port_pair().host(), 58485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.GetSocketAddress().host()); 58495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(test_server_.host_port_pair().port(), 58505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.GetSocketAddress().port()); 58515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 58535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, see http://crbug.com/25045. 58555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestFTP, DISABLED_FTPGetTest) { 58565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 58575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath app_path; 58595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(base::DIR_SOURCE_ROOT, &app_path); 58605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_path = app_path.AppendASCII("LICENSE"); 58615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 58625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 58635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r( 58645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURLWithUserAndPassword("/LICENSE", "chrome", "chrome"), 58655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 58665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 58675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 58685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 58695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 587090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 58715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 file_size = 0; 58735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_util::GetFileSize(app_path, &file_size); 58745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(r.is_pending()); 58765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(test_server_.host_port_pair().host(), 58775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.GetSocketAddress().host()); 58785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(test_server_.host_port_pair().port(), 58795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.GetSocketAddress().port()); 58805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 58815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 58825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size)); 58832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 58842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadTimingInfo load_timing_info; 58852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) r.GetLoadTimingInfo(&load_timing_info); 588690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TestLoadTimingNoHttpResponse(load_timing_info); 58875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 58895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, see http://crbug.com/25045. 58915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestFTP, DISABLED_FTPCheckWrongPassword) { 58925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 58935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath app_path; 58955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(base::DIR_SOURCE_ROOT, &app_path); 58965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_path = app_path.AppendASCII("LICENSE"); 58975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 58985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 58995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r( 59005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURLWithUserAndPassword("/LICENSE", 59015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "chrome", 59025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "wrong_password"), 59035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 59045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 59055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 59065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 59075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 590890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 59095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 file_size = 0; 59115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_util::GetFileSize(app_path, &file_size); 59125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(r.is_pending()); 59145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 59155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 59165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(d.bytes_received(), 0); 59175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 59185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 59195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, see http://crbug.com/25045. 59215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestFTP, DISABLED_FTPCheckWrongPasswordRestart) { 59225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 59235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath app_path; 59255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(base::DIR_SOURCE_ROOT, &app_path); 59265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_path = app_path.AppendASCII("LICENSE"); 59275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 59285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set correct login credentials. The delegate will be asked for them when 59295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the initial login with wrong credentials will fail. 59305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_credentials(AuthCredentials(kChrome, kChrome)); 59315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 59325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r( 59335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURLWithUserAndPassword("/LICENSE", 59345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "chrome", 59355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "wrong_password"), 59365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 59375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 59385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 59395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 59405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 594190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 59425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 file_size = 0; 59445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_util::GetFileSize(app_path, &file_size); 59455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(r.is_pending()); 59475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 59485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 59495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size)); 59505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 59515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 59525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, see http://crbug.com/25045. 59545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestFTP, DISABLED_FTPCheckWrongUser) { 59555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 59565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath app_path; 59585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(base::DIR_SOURCE_ROOT, &app_path); 59595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_path = app_path.AppendASCII("LICENSE"); 59605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 59615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 59625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r( 59635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURLWithUserAndPassword("/LICENSE", 59645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "wrong_user", 59655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "chrome"), 59665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 59675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 59685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 59695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 59705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 597190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 59725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 file_size = 0; 59745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_util::GetFileSize(app_path, &file_size); 59755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(r.is_pending()); 59775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 59785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 59795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(d.bytes_received(), 0); 59805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 59815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 59825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, see http://crbug.com/25045. 59845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestFTP, DISABLED_FTPCheckWrongUserRestart) { 59855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 59865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath app_path; 59885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(base::DIR_SOURCE_ROOT, &app_path); 59895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_path = app_path.AppendASCII("LICENSE"); 59905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 59915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set correct login credentials. The delegate will be asked for them when 59925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the initial login with wrong credentials will fail. 59935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_credentials(AuthCredentials(kChrome, kChrome)); 59945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 59955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r( 59965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURLWithUserAndPassword("/LICENSE", 59975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "wrong_user", 59985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "chrome"), 59995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 60005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 60015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 60025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 60035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 600490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 60055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 file_size = 0; 60075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_util::GetFileSize(app_path, &file_size); 60085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(r.is_pending()); 60105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 60115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 60125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size)); 60135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 60145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 60155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, see http://crbug.com/25045. 60175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestFTP, DISABLED_FTPCacheURLCredentials) { 60185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 60195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath app_path; 60215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(base::DIR_SOURCE_ROOT, &app_path); 60225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_path = app_path.AppendASCII("LICENSE"); 60235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<TestDelegate> d(new TestDelegate); 60255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 60265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pass correct login identity in the URL. 60275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r( 60285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURLWithUserAndPassword("/LICENSE", 60295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "chrome", 60305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "chrome"), 60315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.get(), 60325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 60335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 60345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 60355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 603690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 60375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 file_size = 0; 60395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_util::GetFileSize(app_path, &file_size); 60405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(r.is_pending()); 60425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d->response_started_count()); 60435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d->received_data_before_response()); 60445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size)); 60455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 60465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.reset(new TestDelegate); 60485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 60495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This request should use cached identity from previous request. 60505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(test_server_.GetURL("/LICENSE"), d.get(), &default_context_); 60515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 60525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 60535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 60555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 file_size = 0; 60575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_util::GetFileSize(app_path, &file_size); 60585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(r.is_pending()); 60605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d->response_started_count()); 60615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d->received_data_before_response()); 60625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size)); 60635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 60645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 60655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, see http://crbug.com/25045. 60675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestFTP, DISABLED_FTPCacheLoginBoxCredentials) { 60685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 60695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath app_path; 60715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(base::DIR_SOURCE_ROOT, &app_path); 60725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_path = app_path.AppendASCII("LICENSE"); 60735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<TestDelegate> d(new TestDelegate); 60755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set correct login credentials. The delegate will be asked for them when 60765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the initial login with wrong credentials will fail. 60775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d->set_credentials(AuthCredentials(kChrome, kChrome)); 60785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 60795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r( 60805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURLWithUserAndPassword("/LICENSE", 60815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "chrome", 60825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "wrong_password"), 60835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.get(), 60845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 60855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 60865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 60875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 608890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 60895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 file_size = 0; 60915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_util::GetFileSize(app_path, &file_size); 60925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(r.is_pending()); 60945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d->response_started_count()); 60955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d->received_data_before_response()); 60965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size)); 60975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 60985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use a new delegate without explicit credentials. The cached ones should be 61005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // used. 61015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.reset(new TestDelegate); 61025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 61035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't pass wrong credentials in the URL, they would override valid cached 61045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ones. 61055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(test_server_.GetURL("/LICENSE"), d.get(), &default_context_); 61065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 61075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 61085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 610990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 61105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 file_size = 0; 61125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_util::GetFileSize(app_path, &file_size); 61135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(r.is_pending()); 61155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d->response_started_count()); 61165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d->received_data_before_response()); 61175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size)); 61185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 61195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 61205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // !defined(DISABLE_FTP_SUPPORT) 61215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 6123