url_request_unittest.cc revision 010d83a9304c5a91596085d917d248abff47903a
1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "build/build_config.h" 6 7#if defined(OS_WIN) 8#include <windows.h> 9#include <shlobj.h> 10#endif 11 12#include <algorithm> 13#include <string> 14 15#include "base/basictypes.h" 16#include "base/bind.h" 17#include "base/compiler_specific.h" 18#include "base/file_util.h" 19#include "base/files/scoped_temp_dir.h" 20#include "base/format_macros.h" 21#include "base/memory/weak_ptr.h" 22#include "base/message_loop/message_loop.h" 23#include "base/message_loop/message_loop_proxy.h" 24#include "base/path_service.h" 25#include "base/run_loop.h" 26#include "base/strings/string_number_conversions.h" 27#include "base/strings/string_piece.h" 28#include "base/strings/string_split.h" 29#include "base/strings/string_util.h" 30#include "base/strings/stringprintf.h" 31#include "base/strings/utf_string_conversions.h" 32#include "net/base/capturing_net_log.h" 33#include "net/base/filename_util.h" 34#include "net/base/load_flags.h" 35#include "net/base/load_timing_info.h" 36#include "net/base/load_timing_info_test_util.h" 37#include "net/base/net_errors.h" 38#include "net/base/net_log.h" 39#include "net/base/net_log_unittest.h" 40#include "net/base/net_module.h" 41#include "net/base/net_util.h" 42#include "net/base/request_priority.h" 43#include "net/base/test_data_directory.h" 44#include "net/base/upload_bytes_element_reader.h" 45#include "net/base/upload_data_stream.h" 46#include "net/base/upload_file_element_reader.h" 47#include "net/cert/ev_root_ca_metadata.h" 48#include "net/cert/mock_cert_verifier.h" 49#include "net/cert/test_root_certs.h" 50#include "net/cookies/cookie_monster.h" 51#include "net/cookies/cookie_store_test_helpers.h" 52#include "net/disk_cache/disk_cache.h" 53#include "net/dns/mock_host_resolver.h" 54#include "net/ftp/ftp_network_layer.h" 55#include "net/http/http_byte_range.h" 56#include "net/http/http_cache.h" 57#include "net/http/http_network_layer.h" 58#include "net/http/http_network_session.h" 59#include "net/http/http_request_headers.h" 60#include "net/http/http_response_headers.h" 61#include "net/http/http_util.h" 62#include "net/ocsp/nss_ocsp.h" 63#include "net/proxy/proxy_service.h" 64#include "net/socket/ssl_client_socket.h" 65#include "net/ssl/ssl_connection_status_flags.h" 66#include "net/test/cert_test_util.h" 67#include "net/test/spawned_test_server/spawned_test_server.h" 68#include "net/url_request/data_protocol_handler.h" 69#include "net/url_request/static_http_user_agent_settings.h" 70#include "net/url_request/url_request.h" 71#include "net/url_request/url_request_http_job.h" 72#include "net/url_request/url_request_job_factory_impl.h" 73#include "net/url_request/url_request_redirect_job.h" 74#include "net/url_request/url_request_test_job.h" 75#include "net/url_request/url_request_test_util.h" 76#include "testing/gtest/include/gtest/gtest.h" 77#include "testing/platform_test.h" 78 79#if !defined(DISABLE_FILE_SUPPORT) 80#include "net/url_request/file_protocol_handler.h" 81#include "net/url_request/url_request_file_dir_job.h" 82#endif 83 84#if !defined(DISABLE_FTP_SUPPORT) 85#include "net/url_request/ftp_protocol_handler.h" 86#endif 87 88#if defined(OS_WIN) 89#include "base/win/scoped_com_initializer.h" 90#include "base/win/scoped_comptr.h" 91#include "base/win/windows_version.h" 92#endif 93 94using base::ASCIIToUTF16; 95using base::Time; 96 97namespace net { 98 99namespace { 100 101const base::string16 kChrome(ASCIIToUTF16("chrome")); 102const base::string16 kSecret(ASCIIToUTF16("secret")); 103const base::string16 kUser(ASCIIToUTF16("user")); 104 105// Tests load timing information in the case a fresh connection was used, with 106// no proxy. 107void TestLoadTimingNotReused(const net::LoadTimingInfo& load_timing_info, 108 int connect_timing_flags) { 109 EXPECT_FALSE(load_timing_info.socket_reused); 110 EXPECT_NE(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id); 111 112 EXPECT_FALSE(load_timing_info.request_start_time.is_null()); 113 EXPECT_FALSE(load_timing_info.request_start.is_null()); 114 115 EXPECT_LE(load_timing_info.request_start, 116 load_timing_info.connect_timing.connect_start); 117 ExpectConnectTimingHasTimes(load_timing_info.connect_timing, 118 connect_timing_flags); 119 EXPECT_LE(load_timing_info.connect_timing.connect_end, 120 load_timing_info.send_start); 121 EXPECT_LE(load_timing_info.send_start, load_timing_info.send_end); 122 EXPECT_LE(load_timing_info.send_end, load_timing_info.receive_headers_end); 123 124 EXPECT_TRUE(load_timing_info.proxy_resolve_start.is_null()); 125 EXPECT_TRUE(load_timing_info.proxy_resolve_end.is_null()); 126} 127 128// Same as above, but with proxy times. 129void TestLoadTimingNotReusedWithProxy( 130 const net::LoadTimingInfo& load_timing_info, 131 int connect_timing_flags) { 132 EXPECT_FALSE(load_timing_info.socket_reused); 133 EXPECT_NE(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id); 134 135 EXPECT_FALSE(load_timing_info.request_start_time.is_null()); 136 EXPECT_FALSE(load_timing_info.request_start.is_null()); 137 138 EXPECT_LE(load_timing_info.request_start, 139 load_timing_info.proxy_resolve_start); 140 EXPECT_LE(load_timing_info.proxy_resolve_start, 141 load_timing_info.proxy_resolve_end); 142 EXPECT_LE(load_timing_info.proxy_resolve_end, 143 load_timing_info.connect_timing.connect_start); 144 ExpectConnectTimingHasTimes(load_timing_info.connect_timing, 145 connect_timing_flags); 146 EXPECT_LE(load_timing_info.connect_timing.connect_end, 147 load_timing_info.send_start); 148 EXPECT_LE(load_timing_info.send_start, load_timing_info.send_end); 149 EXPECT_LE(load_timing_info.send_end, load_timing_info.receive_headers_end); 150} 151 152// Same as above, but with a reused socket and proxy times. 153void TestLoadTimingReusedWithProxy( 154 const net::LoadTimingInfo& load_timing_info) { 155 EXPECT_TRUE(load_timing_info.socket_reused); 156 EXPECT_NE(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id); 157 158 EXPECT_FALSE(load_timing_info.request_start_time.is_null()); 159 EXPECT_FALSE(load_timing_info.request_start.is_null()); 160 161 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing); 162 163 EXPECT_LE(load_timing_info.request_start, 164 load_timing_info.proxy_resolve_start); 165 EXPECT_LE(load_timing_info.proxy_resolve_start, 166 load_timing_info.proxy_resolve_end); 167 EXPECT_LE(load_timing_info.proxy_resolve_end, 168 load_timing_info.send_start); 169 EXPECT_LE(load_timing_info.send_start, load_timing_info.send_end); 170 EXPECT_LE(load_timing_info.send_end, load_timing_info.receive_headers_end); 171} 172 173// Tests load timing information in the case of a cache hit, when no cache 174// validation request was sent over the wire. 175base::StringPiece TestNetResourceProvider(int key) { 176 return "header"; 177} 178 179void FillBuffer(char* buffer, size_t len) { 180 static bool called = false; 181 if (!called) { 182 called = true; 183 int seed = static_cast<int>(Time::Now().ToInternalValue()); 184 srand(seed); 185 } 186 187 for (size_t i = 0; i < len; i++) { 188 buffer[i] = static_cast<char>(rand()); 189 if (!buffer[i]) 190 buffer[i] = 'g'; 191 } 192} 193 194#if !defined(OS_IOS) 195void TestLoadTimingCacheHitNoNetwork( 196 const net::LoadTimingInfo& load_timing_info) { 197 EXPECT_FALSE(load_timing_info.socket_reused); 198 EXPECT_EQ(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id); 199 200 EXPECT_FALSE(load_timing_info.request_start_time.is_null()); 201 EXPECT_FALSE(load_timing_info.request_start.is_null()); 202 203 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing); 204 EXPECT_LE(load_timing_info.request_start, load_timing_info.send_start); 205 EXPECT_LE(load_timing_info.send_start, load_timing_info.send_end); 206 EXPECT_LE(load_timing_info.send_end, load_timing_info.receive_headers_end); 207 208 EXPECT_TRUE(load_timing_info.proxy_resolve_start.is_null()); 209 EXPECT_TRUE(load_timing_info.proxy_resolve_end.is_null()); 210} 211 212// Tests load timing in the case that there is no HTTP response. This can be 213// used to test in the case of errors or non-HTTP requests. 214void TestLoadTimingNoHttpResponse( 215 const net::LoadTimingInfo& load_timing_info) { 216 EXPECT_FALSE(load_timing_info.socket_reused); 217 EXPECT_EQ(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id); 218 219 // Only the request times should be non-null. 220 EXPECT_FALSE(load_timing_info.request_start_time.is_null()); 221 EXPECT_FALSE(load_timing_info.request_start.is_null()); 222 223 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing); 224 225 EXPECT_TRUE(load_timing_info.proxy_resolve_start.is_null()); 226 EXPECT_TRUE(load_timing_info.proxy_resolve_end.is_null()); 227 EXPECT_TRUE(load_timing_info.send_start.is_null()); 228 EXPECT_TRUE(load_timing_info.send_end.is_null()); 229 EXPECT_TRUE(load_timing_info.receive_headers_end.is_null()); 230} 231 232// Do a case-insensitive search through |haystack| for |needle|. 233bool ContainsString(const std::string& haystack, const char* needle) { 234 std::string::const_iterator it = 235 std::search(haystack.begin(), 236 haystack.end(), 237 needle, 238 needle + strlen(needle), 239 base::CaseInsensitiveCompare<char>()); 240 return it != haystack.end(); 241} 242 243UploadDataStream* CreateSimpleUploadData(const char* data) { 244 scoped_ptr<UploadElementReader> reader( 245 new UploadBytesElementReader(data, strlen(data))); 246 return UploadDataStream::CreateWithReader(reader.Pass(), 0); 247} 248 249// Verify that the SSLInfo of a successful SSL connection has valid values. 250void CheckSSLInfo(const SSLInfo& ssl_info) { 251 // -1 means unknown. 0 means no encryption. 252 EXPECT_GT(ssl_info.security_bits, 0); 253 254 // The cipher suite TLS_NULL_WITH_NULL_NULL (0) must not be negotiated. 255 int cipher_suite = SSLConnectionStatusToCipherSuite( 256 ssl_info.connection_status); 257 EXPECT_NE(0, cipher_suite); 258} 259 260void CheckFullRequestHeaders(const HttpRequestHeaders& headers, 261 const GURL& host_url) { 262 std::string sent_value; 263 264 EXPECT_TRUE(headers.GetHeader("Host", &sent_value)); 265 EXPECT_EQ(GetHostAndOptionalPort(host_url), sent_value); 266 267 EXPECT_TRUE(headers.GetHeader("Connection", &sent_value)); 268 EXPECT_EQ("keep-alive", sent_value); 269} 270 271bool FingerprintsEqual(const HashValueVector& a, const HashValueVector& b) { 272 size_t size = a.size(); 273 274 if (size != b.size()) 275 return false; 276 277 for (size_t i = 0; i < size; ++i) { 278 if (!a[i].Equals(b[i])) 279 return false; 280 } 281 282 return true; 283} 284#endif // !defined(OS_IOS) 285 286// A network delegate that allows the user to choose a subset of request stages 287// to block in. When blocking, the delegate can do one of the following: 288// * synchronously return a pre-specified error code, or 289// * asynchronously return that value via an automatically called callback, 290// or 291// * block and wait for the user to do a callback. 292// Additionally, the user may also specify a redirect URL -- then each request 293// with the current URL different from the redirect target will be redirected 294// to that target, in the on-before-URL-request stage, independent of whether 295// the delegate blocks in ON_BEFORE_URL_REQUEST or not. 296class BlockingNetworkDelegate : public TestNetworkDelegate { 297 public: 298 // Stages in which the delegate can block. 299 enum Stage { 300 NOT_BLOCKED = 0, 301 ON_BEFORE_URL_REQUEST = 1 << 0, 302 ON_BEFORE_SEND_HEADERS = 1 << 1, 303 ON_HEADERS_RECEIVED = 1 << 2, 304 ON_AUTH_REQUIRED = 1 << 3 305 }; 306 307 // Behavior during blocked stages. During other stages, just 308 // returns net::OK or NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION. 309 enum BlockMode { 310 SYNCHRONOUS, // No callback, returns specified return values. 311 AUTO_CALLBACK, // |this| posts a task to run the callback using the 312 // specified return codes. 313 USER_CALLBACK, // User takes care of doing a callback. |retval_| and 314 // |auth_retval_| are ignored. In every blocking stage the 315 // message loop is quit. 316 }; 317 318 // Creates a delegate which does not block at all. 319 explicit BlockingNetworkDelegate(BlockMode block_mode); 320 321 // For users to trigger a callback returning |response|. 322 // Side-effects: resets |stage_blocked_for_callback_| and stored callbacks. 323 // Only call if |block_mode_| == USER_CALLBACK. 324 void DoCallback(int response); 325 void DoAuthCallback(NetworkDelegate::AuthRequiredResponse response); 326 327 // Setters. 328 void set_retval(int retval) { 329 ASSERT_NE(USER_CALLBACK, block_mode_); 330 ASSERT_NE(ERR_IO_PENDING, retval); 331 ASSERT_NE(OK, retval); 332 retval_ = retval; 333 } 334 335 // If |auth_retval| == AUTH_REQUIRED_RESPONSE_SET_AUTH, then 336 // |auth_credentials_| will be passed with the response. 337 void set_auth_retval(AuthRequiredResponse auth_retval) { 338 ASSERT_NE(USER_CALLBACK, block_mode_); 339 ASSERT_NE(AUTH_REQUIRED_RESPONSE_IO_PENDING, auth_retval); 340 auth_retval_ = auth_retval; 341 } 342 void set_auth_credentials(const AuthCredentials& auth_credentials) { 343 auth_credentials_ = auth_credentials; 344 } 345 346 void set_redirect_url(const GURL& url) { 347 redirect_url_ = url; 348 } 349 350 void set_block_on(int block_on) { 351 block_on_ = block_on; 352 } 353 354 // Allows the user to check in which state did we block. 355 Stage stage_blocked_for_callback() const { 356 EXPECT_EQ(USER_CALLBACK, block_mode_); 357 return stage_blocked_for_callback_; 358 } 359 360 private: 361 void RunCallback(int response, const CompletionCallback& callback); 362 void RunAuthCallback(AuthRequiredResponse response, 363 const AuthCallback& callback); 364 365 // TestNetworkDelegate implementation. 366 virtual int OnBeforeURLRequest(URLRequest* request, 367 const CompletionCallback& callback, 368 GURL* new_url) OVERRIDE; 369 370 virtual int OnBeforeSendHeaders(URLRequest* request, 371 const CompletionCallback& callback, 372 HttpRequestHeaders* headers) OVERRIDE; 373 374 virtual int OnHeadersReceived( 375 URLRequest* request, 376 const CompletionCallback& callback, 377 const HttpResponseHeaders* original_response_headers, 378 scoped_refptr<HttpResponseHeaders>* override_response_headers, 379 GURL* allowed_unsafe_redirect_url) OVERRIDE; 380 381 virtual NetworkDelegate::AuthRequiredResponse OnAuthRequired( 382 URLRequest* request, 383 const AuthChallengeInfo& auth_info, 384 const AuthCallback& callback, 385 AuthCredentials* credentials) OVERRIDE; 386 387 // Resets the callbacks and |stage_blocked_for_callback_|. 388 void Reset(); 389 390 // Checks whether we should block in |stage|. If yes, returns an error code 391 // and optionally sets up callback based on |block_mode_|. If no, returns OK. 392 int MaybeBlockStage(Stage stage, const CompletionCallback& callback); 393 394 // Configuration parameters, can be adjusted by public methods: 395 const BlockMode block_mode_; 396 397 // Values returned on blocking stages when mode is SYNCHRONOUS or 398 // AUTO_CALLBACK. For USER_CALLBACK these are set automatically to IO_PENDING. 399 int retval_; // To be returned in non-auth stages. 400 AuthRequiredResponse auth_retval_; 401 402 GURL redirect_url_; // Used if non-empty during OnBeforeURLRequest. 403 int block_on_; // Bit mask: in which stages to block. 404 405 // |auth_credentials_| will be copied to |*target_auth_credential_| on 406 // callback. 407 AuthCredentials auth_credentials_; 408 AuthCredentials* target_auth_credentials_; 409 410 // Internal variables, not set by not the user: 411 // Last blocked stage waiting for user callback (unused if |block_mode_| != 412 // USER_CALLBACK). 413 Stage stage_blocked_for_callback_; 414 415 // Callback objects stored during blocking stages. 416 CompletionCallback callback_; 417 AuthCallback auth_callback_; 418 419 base::WeakPtrFactory<BlockingNetworkDelegate> weak_factory_; 420 421 DISALLOW_COPY_AND_ASSIGN(BlockingNetworkDelegate); 422}; 423 424BlockingNetworkDelegate::BlockingNetworkDelegate(BlockMode block_mode) 425 : block_mode_(block_mode), 426 retval_(OK), 427 auth_retval_(AUTH_REQUIRED_RESPONSE_NO_ACTION), 428 block_on_(0), 429 target_auth_credentials_(NULL), 430 stage_blocked_for_callback_(NOT_BLOCKED), 431 weak_factory_(this) { 432} 433 434void BlockingNetworkDelegate::DoCallback(int response) { 435 ASSERT_EQ(USER_CALLBACK, block_mode_); 436 ASSERT_NE(NOT_BLOCKED, stage_blocked_for_callback_); 437 ASSERT_NE(ON_AUTH_REQUIRED, stage_blocked_for_callback_); 438 CompletionCallback callback = callback_; 439 Reset(); 440 RunCallback(response, callback); 441} 442 443void BlockingNetworkDelegate::DoAuthCallback( 444 NetworkDelegate::AuthRequiredResponse response) { 445 ASSERT_EQ(USER_CALLBACK, block_mode_); 446 ASSERT_EQ(ON_AUTH_REQUIRED, stage_blocked_for_callback_); 447 AuthCallback auth_callback = auth_callback_; 448 Reset(); 449 RunAuthCallback(response, auth_callback); 450} 451 452void BlockingNetworkDelegate::RunCallback(int response, 453 const CompletionCallback& callback) { 454 callback.Run(response); 455} 456 457void BlockingNetworkDelegate::RunAuthCallback(AuthRequiredResponse response, 458 const AuthCallback& callback) { 459 if (auth_retval_ == AUTH_REQUIRED_RESPONSE_SET_AUTH) { 460 ASSERT_TRUE(target_auth_credentials_ != NULL); 461 *target_auth_credentials_ = auth_credentials_; 462 } 463 callback.Run(response); 464} 465 466int BlockingNetworkDelegate::OnBeforeURLRequest( 467 URLRequest* request, 468 const CompletionCallback& callback, 469 GURL* new_url) { 470 if (redirect_url_ == request->url()) 471 return OK; // We've already seen this request and redirected elsewhere. 472 473 TestNetworkDelegate::OnBeforeURLRequest(request, callback, new_url); 474 475 if (!redirect_url_.is_empty()) 476 *new_url = redirect_url_; 477 478 return MaybeBlockStage(ON_BEFORE_URL_REQUEST, callback); 479} 480 481int BlockingNetworkDelegate::OnBeforeSendHeaders( 482 URLRequest* request, 483 const CompletionCallback& callback, 484 HttpRequestHeaders* headers) { 485 TestNetworkDelegate::OnBeforeSendHeaders(request, callback, headers); 486 487 return MaybeBlockStage(ON_BEFORE_SEND_HEADERS, callback); 488} 489 490int BlockingNetworkDelegate::OnHeadersReceived( 491 URLRequest* request, 492 const CompletionCallback& callback, 493 const HttpResponseHeaders* original_response_headers, 494 scoped_refptr<HttpResponseHeaders>* override_response_headers, 495 GURL* allowed_unsafe_redirect_url) { 496 TestNetworkDelegate::OnHeadersReceived(request, 497 callback, 498 original_response_headers, 499 override_response_headers, 500 allowed_unsafe_redirect_url); 501 502 return MaybeBlockStage(ON_HEADERS_RECEIVED, callback); 503} 504 505NetworkDelegate::AuthRequiredResponse BlockingNetworkDelegate::OnAuthRequired( 506 URLRequest* request, 507 const AuthChallengeInfo& auth_info, 508 const AuthCallback& callback, 509 AuthCredentials* credentials) { 510 TestNetworkDelegate::OnAuthRequired(request, auth_info, callback, 511 credentials); 512 // Check that the user has provided callback for the previous blocked stage. 513 EXPECT_EQ(NOT_BLOCKED, stage_blocked_for_callback_); 514 515 if ((block_on_ & ON_AUTH_REQUIRED) == 0) { 516 return AUTH_REQUIRED_RESPONSE_NO_ACTION; 517 } 518 519 target_auth_credentials_ = credentials; 520 521 switch (block_mode_) { 522 case SYNCHRONOUS: 523 if (auth_retval_ == AUTH_REQUIRED_RESPONSE_SET_AUTH) 524 *target_auth_credentials_ = auth_credentials_; 525 return auth_retval_; 526 527 case AUTO_CALLBACK: 528 base::MessageLoop::current()->PostTask( 529 FROM_HERE, 530 base::Bind(&BlockingNetworkDelegate::RunAuthCallback, 531 weak_factory_.GetWeakPtr(), auth_retval_, callback)); 532 return AUTH_REQUIRED_RESPONSE_IO_PENDING; 533 534 case USER_CALLBACK: 535 auth_callback_ = callback; 536 stage_blocked_for_callback_ = ON_AUTH_REQUIRED; 537 base::MessageLoop::current()->PostTask(FROM_HERE, 538 base::MessageLoop::QuitClosure()); 539 return AUTH_REQUIRED_RESPONSE_IO_PENDING; 540 } 541 NOTREACHED(); 542 return AUTH_REQUIRED_RESPONSE_NO_ACTION; // Dummy value. 543} 544 545void BlockingNetworkDelegate::Reset() { 546 EXPECT_NE(NOT_BLOCKED, stage_blocked_for_callback_); 547 stage_blocked_for_callback_ = NOT_BLOCKED; 548 callback_.Reset(); 549 auth_callback_.Reset(); 550} 551 552int BlockingNetworkDelegate::MaybeBlockStage( 553 BlockingNetworkDelegate::Stage stage, 554 const CompletionCallback& callback) { 555 // Check that the user has provided callback for the previous blocked stage. 556 EXPECT_EQ(NOT_BLOCKED, stage_blocked_for_callback_); 557 558 if ((block_on_ & stage) == 0) { 559 return OK; 560 } 561 562 switch (block_mode_) { 563 case SYNCHRONOUS: 564 EXPECT_NE(OK, retval_); 565 return retval_; 566 567 case AUTO_CALLBACK: 568 base::MessageLoop::current()->PostTask( 569 FROM_HERE, 570 base::Bind(&BlockingNetworkDelegate::RunCallback, 571 weak_factory_.GetWeakPtr(), retval_, callback)); 572 return ERR_IO_PENDING; 573 574 case USER_CALLBACK: 575 callback_ = callback; 576 stage_blocked_for_callback_ = stage; 577 base::MessageLoop::current()->PostTask(FROM_HERE, 578 base::MessageLoop::QuitClosure()); 579 return ERR_IO_PENDING; 580 } 581 NOTREACHED(); 582 return 0; 583} 584 585class TestURLRequestContextWithProxy : public TestURLRequestContext { 586 public: 587 // Does not own |delegate|. 588 TestURLRequestContextWithProxy(const std::string& proxy, 589 NetworkDelegate* delegate) 590 : TestURLRequestContext(true) { 591 context_storage_.set_proxy_service(ProxyService::CreateFixed(proxy)); 592 set_network_delegate(delegate); 593 Init(); 594 } 595 virtual ~TestURLRequestContextWithProxy() {} 596}; 597 598} // namespace 599 600// Inherit PlatformTest since we require the autorelease pool on Mac OS X. 601class URLRequestTest : public PlatformTest { 602 public: 603 URLRequestTest() : default_context_(true) { 604 default_context_.set_network_delegate(&default_network_delegate_); 605 default_context_.set_net_log(&net_log_); 606 job_factory_.SetProtocolHandler("data", new DataProtocolHandler); 607#if !defined(DISABLE_FILE_SUPPORT) 608 job_factory_.SetProtocolHandler( 609 "file", new FileProtocolHandler(base::MessageLoopProxy::current())); 610#endif 611 default_context_.set_job_factory(&job_factory_); 612 default_context_.Init(); 613 } 614 virtual ~URLRequestTest() { 615 // URLRequestJobs may post clean-up tasks on destruction. 616 base::RunLoop().RunUntilIdle(); 617 } 618 619 // Adds the TestJobInterceptor to the default context. 620 TestJobInterceptor* AddTestInterceptor() { 621 TestJobInterceptor* protocol_handler_ = new TestJobInterceptor(); 622 job_factory_.SetProtocolHandler("http", NULL); 623 job_factory_.SetProtocolHandler("http", protocol_handler_); 624 return protocol_handler_; 625 } 626 627 protected: 628 CapturingNetLog net_log_; 629 TestNetworkDelegate default_network_delegate_; // Must outlive URLRequest. 630 URLRequestJobFactoryImpl job_factory_; 631 TestURLRequestContext default_context_; 632}; 633 634TEST_F(URLRequestTest, AboutBlankTest) { 635 TestDelegate d; 636 { 637 URLRequest r(GURL("about:blank"), DEFAULT_PRIORITY, &d, &default_context_); 638 639 r.Start(); 640 EXPECT_TRUE(r.is_pending()); 641 642 base::RunLoop().Run(); 643 644 EXPECT_TRUE(!r.is_pending()); 645 EXPECT_FALSE(d.received_data_before_response()); 646 EXPECT_EQ(d.bytes_received(), 0); 647 EXPECT_EQ("", r.GetSocketAddress().host()); 648 EXPECT_EQ(0, r.GetSocketAddress().port()); 649 650 HttpRequestHeaders headers; 651 EXPECT_FALSE(r.GetFullRequestHeaders(&headers)); 652 } 653} 654 655TEST_F(URLRequestTest, DataURLImageTest) { 656 TestDelegate d; 657 { 658 // Use our nice little Chrome logo. 659 URLRequest r( 660 GURL( 661 "data:image/png;base64," 662 "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADVklEQVQ4jX2TfUwUBBjG3" 663 "w1y+HGcd9dxhXR8T4awOccJGgOSWclHImznLkTlSw0DDQXkrmgYgbUYnlQTqQxIEVxitD" 664 "5UMCATRA1CEEg+Qjw3bWDxIauJv/5oumqs39/P827vnucRmYN0gyF01GI5MpCVdW0gO7t" 665 "vNC+vqSEtbZefk5NuLv1jdJ46p/zw0HeH4+PHr3h7c1mjoV2t5rKzMx1+fg9bAgK6zHq9" 666 "cU5z+LpA3xOtx34+vTeT21onRuzssC3zxbbSwC13d/pFuC7CkIMDxQpF7r/MWq12UctI1" 667 "dWWm99ypqSYmRUBdKem8MkrO/kgaTt1O7YzlpzE5GIVd0WYUqt57yWf2McHTObYPbVD+Z" 668 "wbtlLTVMZ3BW+TnLyXLaWtmEq6WJVbT3HBh3Svj2HQQcm43XwmtoYM6vVKleh0uoWvnzW" 669 "3v3MpidruPTQPf0bia7sJOtBM0ufTWNvus/nkDFHF9ZS+uYVjRUasMeHUmyLYtcklTvzW" 670 "GFZnNOXczThvpKIzjcahSqIzkvDLayDq6D3eOjtBbNUEIZYyqsvj4V4wY92eNJ4IoyhTb" 671 "xXX1T5xsV9tm9r4TQwHLiZw/pdDZJea8TKmsmR/K0uLh/GwnCHghTja6lPhphezPfO5/5" 672 "MrVvMzNaI3+ERHfrFzPKQukrQGI4d/3EFD/3E2mVNYvi4at7CXWREaxZGD+3hg28zD3gV" 673 "Md6q5c8GdosynKmSeRuGzpjyl1/9UDGtPR5HeaKT8Wjo17WXk579BXVUhN64ehF9fhRtq" 674 "/uxxZKzNiZFGD0wRC3NFROZ5mwIPL/96K/rKMMLrIzF9uhHr+/sYH7DAbwlgC4J+R2Z7F" 675 "Ux1qLnV7MGF40smVSoJ/jvHRfYhQeUJd/SnYtGWhPHR0Sz+GE2F2yth0B36Vcz2KpnufB" 676 "JbsysjjW4kblBUiIjiURUWqJY65zxbnTy57GQyH58zgy0QBtTQv5gH15XMdKkYu+TGaJM" 677 "nlm2O34uI4b9tflqp1+QEFGzoW/ulmcofcpkZCYJhDfSpme7QcrHa+Xfji8paEQkTkSfm" 678 "moRWRNZr/F1KfVMjW+IKEnv2FwZfKdzt0BQR6lClcZR0EfEXEfv/G6W9iLiIyCoReV5En" 679 "hORIBHx+ufPj/gLB/zGI/G4Bk0AAAAASUVORK5CYII="), 680 DEFAULT_PRIORITY, 681 &d, 682 &default_context_); 683 684 r.Start(); 685 EXPECT_TRUE(r.is_pending()); 686 687 base::RunLoop().Run(); 688 689 EXPECT_TRUE(!r.is_pending()); 690 EXPECT_FALSE(d.received_data_before_response()); 691 EXPECT_EQ(d.bytes_received(), 911); 692 EXPECT_EQ("", r.GetSocketAddress().host()); 693 EXPECT_EQ(0, r.GetSocketAddress().port()); 694 695 HttpRequestHeaders headers; 696 EXPECT_FALSE(r.GetFullRequestHeaders(&headers)); 697 } 698} 699 700TEST_F(URLRequestTest, FileTest) { 701 base::FilePath app_path; 702 PathService::Get(base::FILE_EXE, &app_path); 703 GURL app_url = FilePathToFileURL(app_path); 704 705 TestDelegate d; 706 { 707 URLRequest r(app_url, DEFAULT_PRIORITY, &d, &default_context_); 708 709 r.Start(); 710 EXPECT_TRUE(r.is_pending()); 711 712 base::RunLoop().Run(); 713 714 int64 file_size = -1; 715 EXPECT_TRUE(base::GetFileSize(app_path, &file_size)); 716 717 EXPECT_TRUE(!r.is_pending()); 718 EXPECT_EQ(1, d.response_started_count()); 719 EXPECT_FALSE(d.received_data_before_response()); 720 EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size)); 721 EXPECT_EQ("", r.GetSocketAddress().host()); 722 EXPECT_EQ(0, r.GetSocketAddress().port()); 723 724 HttpRequestHeaders headers; 725 EXPECT_FALSE(r.GetFullRequestHeaders(&headers)); 726 } 727} 728 729TEST_F(URLRequestTest, FileTestCancel) { 730 base::FilePath app_path; 731 PathService::Get(base::FILE_EXE, &app_path); 732 GURL app_url = FilePathToFileURL(app_path); 733 734 TestDelegate d; 735 { 736 URLRequest r(app_url, DEFAULT_PRIORITY, &d, &default_context_); 737 738 r.Start(); 739 EXPECT_TRUE(r.is_pending()); 740 r.Cancel(); 741 } 742 // Async cancellation should be safe even when URLRequest has been already 743 // destroyed. 744 base::RunLoop().RunUntilIdle(); 745} 746 747TEST_F(URLRequestTest, FileTestFullSpecifiedRange) { 748 const size_t buffer_size = 4000; 749 scoped_ptr<char[]> buffer(new char[buffer_size]); 750 FillBuffer(buffer.get(), buffer_size); 751 752 base::FilePath temp_path; 753 EXPECT_TRUE(base::CreateTemporaryFile(&temp_path)); 754 GURL temp_url = FilePathToFileURL(temp_path); 755 EXPECT_TRUE(base::WriteFile(temp_path, buffer.get(), buffer_size)); 756 757 int64 file_size; 758 EXPECT_TRUE(base::GetFileSize(temp_path, &file_size)); 759 760 const size_t first_byte_position = 500; 761 const size_t last_byte_position = buffer_size - first_byte_position; 762 const size_t content_length = last_byte_position - first_byte_position + 1; 763 std::string partial_buffer_string(buffer.get() + first_byte_position, 764 buffer.get() + last_byte_position + 1); 765 766 TestDelegate d; 767 { 768 URLRequest r(temp_url, DEFAULT_PRIORITY, &d, &default_context_); 769 770 HttpRequestHeaders headers; 771 headers.SetHeader( 772 HttpRequestHeaders::kRange, 773 net::HttpByteRange::Bounded( 774 first_byte_position, last_byte_position).GetHeaderValue()); 775 r.SetExtraRequestHeaders(headers); 776 r.Start(); 777 EXPECT_TRUE(r.is_pending()); 778 779 base::RunLoop().Run(); 780 EXPECT_TRUE(!r.is_pending()); 781 EXPECT_EQ(1, d.response_started_count()); 782 EXPECT_FALSE(d.received_data_before_response()); 783 EXPECT_EQ(static_cast<int>(content_length), d.bytes_received()); 784 // Don't use EXPECT_EQ, it will print out a lot of garbage if check failed. 785 EXPECT_TRUE(partial_buffer_string == d.data_received()); 786 } 787 788 EXPECT_TRUE(base::DeleteFile(temp_path, false)); 789} 790 791TEST_F(URLRequestTest, FileTestHalfSpecifiedRange) { 792 const size_t buffer_size = 4000; 793 scoped_ptr<char[]> buffer(new char[buffer_size]); 794 FillBuffer(buffer.get(), buffer_size); 795 796 base::FilePath temp_path; 797 EXPECT_TRUE(base::CreateTemporaryFile(&temp_path)); 798 GURL temp_url = FilePathToFileURL(temp_path); 799 EXPECT_TRUE(base::WriteFile(temp_path, buffer.get(), buffer_size)); 800 801 int64 file_size; 802 EXPECT_TRUE(base::GetFileSize(temp_path, &file_size)); 803 804 const size_t first_byte_position = 500; 805 const size_t last_byte_position = buffer_size - 1; 806 const size_t content_length = last_byte_position - first_byte_position + 1; 807 std::string partial_buffer_string(buffer.get() + first_byte_position, 808 buffer.get() + last_byte_position + 1); 809 810 TestDelegate d; 811 { 812 URLRequest r(temp_url, DEFAULT_PRIORITY, &d, &default_context_); 813 814 HttpRequestHeaders headers; 815 headers.SetHeader(HttpRequestHeaders::kRange, 816 net::HttpByteRange::RightUnbounded( 817 first_byte_position).GetHeaderValue()); 818 r.SetExtraRequestHeaders(headers); 819 r.Start(); 820 EXPECT_TRUE(r.is_pending()); 821 822 base::RunLoop().Run(); 823 EXPECT_TRUE(!r.is_pending()); 824 EXPECT_EQ(1, d.response_started_count()); 825 EXPECT_FALSE(d.received_data_before_response()); 826 EXPECT_EQ(static_cast<int>(content_length), d.bytes_received()); 827 // Don't use EXPECT_EQ, it will print out a lot of garbage if check failed. 828 EXPECT_TRUE(partial_buffer_string == d.data_received()); 829 } 830 831 EXPECT_TRUE(base::DeleteFile(temp_path, false)); 832} 833 834TEST_F(URLRequestTest, FileTestMultipleRanges) { 835 const size_t buffer_size = 400000; 836 scoped_ptr<char[]> buffer(new char[buffer_size]); 837 FillBuffer(buffer.get(), buffer_size); 838 839 base::FilePath temp_path; 840 EXPECT_TRUE(base::CreateTemporaryFile(&temp_path)); 841 GURL temp_url = FilePathToFileURL(temp_path); 842 EXPECT_TRUE(base::WriteFile(temp_path, buffer.get(), buffer_size)); 843 844 int64 file_size; 845 EXPECT_TRUE(base::GetFileSize(temp_path, &file_size)); 846 847 TestDelegate d; 848 { 849 URLRequest r(temp_url, DEFAULT_PRIORITY, &d, &default_context_); 850 851 HttpRequestHeaders headers; 852 headers.SetHeader(HttpRequestHeaders::kRange, "bytes=0-0,10-200,200-300"); 853 r.SetExtraRequestHeaders(headers); 854 r.Start(); 855 EXPECT_TRUE(r.is_pending()); 856 857 base::RunLoop().Run(); 858 EXPECT_TRUE(d.request_failed()); 859 } 860 861 EXPECT_TRUE(base::DeleteFile(temp_path, false)); 862} 863 864TEST_F(URLRequestTest, AllowFileURLs) { 865 base::ScopedTempDir temp_dir; 866 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 867 base::FilePath test_file; 868 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir.path(), &test_file)); 869 std::string test_data("monkey"); 870 base::WriteFile(test_file, test_data.data(), test_data.size()); 871 GURL test_file_url = net::FilePathToFileURL(test_file); 872 873 { 874 TestDelegate d; 875 TestNetworkDelegate network_delegate; 876 network_delegate.set_can_access_files(true); 877 default_context_.set_network_delegate(&network_delegate); 878 URLRequest r(test_file_url, DEFAULT_PRIORITY, &d, &default_context_); 879 r.Start(); 880 base::RunLoop().Run(); 881 EXPECT_FALSE(d.request_failed()); 882 EXPECT_EQ(test_data, d.data_received()); 883 } 884 885 { 886 TestDelegate d; 887 TestNetworkDelegate network_delegate; 888 network_delegate.set_can_access_files(false); 889 default_context_.set_network_delegate(&network_delegate); 890 URLRequest r(test_file_url, DEFAULT_PRIORITY, &d, &default_context_); 891 r.Start(); 892 base::RunLoop().Run(); 893 EXPECT_TRUE(d.request_failed()); 894 EXPECT_EQ("", d.data_received()); 895 } 896} 897 898TEST_F(URLRequestTest, InvalidUrlTest) { 899 TestDelegate d; 900 { 901 URLRequest r(GURL("invalid url"), DEFAULT_PRIORITY, &d, &default_context_); 902 903 r.Start(); 904 EXPECT_TRUE(r.is_pending()); 905 906 base::RunLoop().Run(); 907 EXPECT_TRUE(d.request_failed()); 908 } 909} 910 911#if defined(OS_WIN) 912TEST_F(URLRequestTest, ResolveShortcutTest) { 913 base::FilePath app_path; 914 PathService::Get(base::DIR_SOURCE_ROOT, &app_path); 915 app_path = app_path.AppendASCII("net"); 916 app_path = app_path.AppendASCII("data"); 917 app_path = app_path.AppendASCII("url_request_unittest"); 918 app_path = app_path.AppendASCII("with-headers.html"); 919 920 std::wstring lnk_path = app_path.value() + L".lnk"; 921 922 base::win::ScopedCOMInitializer com_initializer; 923 924 // Temporarily create a shortcut for test 925 { 926 base::win::ScopedComPtr<IShellLink> shell; 927 ASSERT_TRUE(SUCCEEDED(shell.CreateInstance(CLSID_ShellLink, NULL, 928 CLSCTX_INPROC_SERVER))); 929 base::win::ScopedComPtr<IPersistFile> persist; 930 ASSERT_TRUE(SUCCEEDED(shell.QueryInterface(persist.Receive()))); 931 EXPECT_TRUE(SUCCEEDED(shell->SetPath(app_path.value().c_str()))); 932 EXPECT_TRUE(SUCCEEDED(shell->SetDescription(L"ResolveShortcutTest"))); 933 EXPECT_TRUE(SUCCEEDED(persist->Save(lnk_path.c_str(), TRUE))); 934 } 935 936 TestDelegate d; 937 { 938 URLRequest r(FilePathToFileURL(base::FilePath(lnk_path)), 939 DEFAULT_PRIORITY, 940 &d, 941 &default_context_); 942 943 r.Start(); 944 EXPECT_TRUE(r.is_pending()); 945 946 base::RunLoop().Run(); 947 948 WIN32_FILE_ATTRIBUTE_DATA data; 949 GetFileAttributesEx(app_path.value().c_str(), 950 GetFileExInfoStandard, &data); 951 HANDLE file = CreateFile(app_path.value().c_str(), GENERIC_READ, 952 FILE_SHARE_READ, NULL, OPEN_EXISTING, 953 FILE_ATTRIBUTE_NORMAL, NULL); 954 EXPECT_NE(INVALID_HANDLE_VALUE, file); 955 scoped_ptr<char[]> buffer(new char[data.nFileSizeLow]); 956 DWORD read_size; 957 BOOL result; 958 result = ReadFile(file, buffer.get(), data.nFileSizeLow, 959 &read_size, NULL); 960 std::string content(buffer.get(), read_size); 961 CloseHandle(file); 962 963 EXPECT_TRUE(!r.is_pending()); 964 EXPECT_EQ(1, d.received_redirect_count()); 965 EXPECT_EQ(content, d.data_received()); 966 } 967 968 // Clean the shortcut 969 DeleteFile(lnk_path.c_str()); 970} 971#endif // defined(OS_WIN) 972 973TEST_F(URLRequestTest, FileDirCancelTest) { 974 // Put in mock resource provider. 975 NetModule::SetResourceProvider(TestNetResourceProvider); 976 977 TestDelegate d; 978 { 979 base::FilePath file_path; 980 PathService::Get(base::DIR_SOURCE_ROOT, &file_path); 981 file_path = file_path.Append(FILE_PATH_LITERAL("net")); 982 file_path = file_path.Append(FILE_PATH_LITERAL("data")); 983 984 URLRequest req( 985 FilePathToFileURL(file_path), DEFAULT_PRIORITY, &d, &default_context_); 986 req.Start(); 987 EXPECT_TRUE(req.is_pending()); 988 989 d.set_cancel_in_received_data_pending(true); 990 991 base::RunLoop().Run(); 992 } 993 994 // Take out mock resource provider. 995 NetModule::SetResourceProvider(NULL); 996} 997 998TEST_F(URLRequestTest, FileDirOutputSanity) { 999 // Verify the general sanity of the the output of the file: 1000 // directory lister by checking for the output of a known existing 1001 // file. 1002 const char sentinel_name[] = "filedir-sentinel"; 1003 1004 base::FilePath path; 1005 PathService::Get(base::DIR_SOURCE_ROOT, &path); 1006 path = path.Append(FILE_PATH_LITERAL("net")); 1007 path = path.Append(FILE_PATH_LITERAL("data")); 1008 path = path.Append(FILE_PATH_LITERAL("url_request_unittest")); 1009 1010 TestDelegate d; 1011 URLRequest req( 1012 FilePathToFileURL(path), DEFAULT_PRIORITY, &d, &default_context_); 1013 req.Start(); 1014 base::RunLoop().Run(); 1015 1016 // Generate entry for the sentinel file. 1017 base::FilePath sentinel_path = path.AppendASCII(sentinel_name); 1018 base::File::Info info; 1019 EXPECT_TRUE(base::GetFileInfo(sentinel_path, &info)); 1020 EXPECT_GT(info.size, 0); 1021 std::string sentinel_output = GetDirectoryListingEntry( 1022 base::string16(sentinel_name, sentinel_name + strlen(sentinel_name)), 1023 std::string(sentinel_name), 1024 false /* is_dir */, 1025 info.size, 1026 info.last_modified); 1027 1028 ASSERT_LT(0, d.bytes_received()); 1029 ASSERT_FALSE(d.request_failed()); 1030 ASSERT_TRUE(req.status().is_success()); 1031 // Check for the entry generated for the "sentinel" file. 1032 const std::string& data = d.data_received(); 1033 ASSERT_NE(data.find(sentinel_output), std::string::npos); 1034} 1035 1036TEST_F(URLRequestTest, FileDirRedirectNoCrash) { 1037 // There is an implicit redirect when loading a file path that matches a 1038 // directory and does not end with a slash. Ensure that following such 1039 // redirects does not crash. See http://crbug.com/18686. 1040 1041 base::FilePath path; 1042 PathService::Get(base::DIR_SOURCE_ROOT, &path); 1043 path = path.Append(FILE_PATH_LITERAL("net")); 1044 path = path.Append(FILE_PATH_LITERAL("data")); 1045 path = path.Append(FILE_PATH_LITERAL("url_request_unittest")); 1046 1047 TestDelegate d; 1048 URLRequest req( 1049 FilePathToFileURL(path), DEFAULT_PRIORITY, &d, &default_context_); 1050 req.Start(); 1051 base::RunLoop().Run(); 1052 1053 ASSERT_EQ(1, d.received_redirect_count()); 1054 ASSERT_LT(0, d.bytes_received()); 1055 ASSERT_FALSE(d.request_failed()); 1056 ASSERT_TRUE(req.status().is_success()); 1057} 1058 1059#if defined(OS_WIN) 1060// Don't accept the url "file:///" on windows. See http://crbug.com/1474. 1061TEST_F(URLRequestTest, FileDirRedirectSingleSlash) { 1062 TestDelegate d; 1063 URLRequest req(GURL("file:///"), DEFAULT_PRIORITY, &d, &default_context_); 1064 req.Start(); 1065 base::RunLoop().Run(); 1066 1067 ASSERT_EQ(1, d.received_redirect_count()); 1068 ASSERT_FALSE(req.status().is_success()); 1069} 1070#endif 1071 1072// Custom URLRequestJobs for use with interceptor tests 1073class RestartTestJob : public URLRequestTestJob { 1074 public: 1075 RestartTestJob(URLRequest* request, NetworkDelegate* network_delegate) 1076 : URLRequestTestJob(request, network_delegate, true) {} 1077 protected: 1078 virtual void StartAsync() OVERRIDE { 1079 this->NotifyRestartRequired(); 1080 } 1081 private: 1082 virtual ~RestartTestJob() {} 1083}; 1084 1085class CancelTestJob : public URLRequestTestJob { 1086 public: 1087 explicit CancelTestJob(URLRequest* request, NetworkDelegate* network_delegate) 1088 : URLRequestTestJob(request, network_delegate, true) {} 1089 protected: 1090 virtual void StartAsync() OVERRIDE { 1091 request_->Cancel(); 1092 } 1093 private: 1094 virtual ~CancelTestJob() {} 1095}; 1096 1097class CancelThenRestartTestJob : public URLRequestTestJob { 1098 public: 1099 explicit CancelThenRestartTestJob(URLRequest* request, 1100 NetworkDelegate* network_delegate) 1101 : URLRequestTestJob(request, network_delegate, true) { 1102 } 1103 protected: 1104 virtual void StartAsync() OVERRIDE { 1105 request_->Cancel(); 1106 this->NotifyRestartRequired(); 1107 } 1108 private: 1109 virtual ~CancelThenRestartTestJob() {} 1110}; 1111 1112// An Interceptor for use with interceptor tests 1113class TestInterceptor : URLRequest::Interceptor { 1114 public: 1115 TestInterceptor() 1116 : intercept_main_request_(false), restart_main_request_(false), 1117 cancel_main_request_(false), cancel_then_restart_main_request_(false), 1118 simulate_main_network_error_(false), 1119 intercept_redirect_(false), cancel_redirect_request_(false), 1120 intercept_final_response_(false), cancel_final_request_(false), 1121 did_intercept_main_(false), did_restart_main_(false), 1122 did_cancel_main_(false), did_cancel_then_restart_main_(false), 1123 did_simulate_error_main_(false), 1124 did_intercept_redirect_(false), did_cancel_redirect_(false), 1125 did_intercept_final_(false), did_cancel_final_(false) { 1126 URLRequest::Deprecated::RegisterRequestInterceptor(this); 1127 } 1128 1129 virtual ~TestInterceptor() { 1130 URLRequest::Deprecated::UnregisterRequestInterceptor(this); 1131 } 1132 1133 virtual URLRequestJob* MaybeIntercept( 1134 URLRequest* request, 1135 NetworkDelegate* network_delegate) OVERRIDE { 1136 if (restart_main_request_) { 1137 restart_main_request_ = false; 1138 did_restart_main_ = true; 1139 return new RestartTestJob(request, network_delegate); 1140 } 1141 if (cancel_main_request_) { 1142 cancel_main_request_ = false; 1143 did_cancel_main_ = true; 1144 return new CancelTestJob(request, network_delegate); 1145 } 1146 if (cancel_then_restart_main_request_) { 1147 cancel_then_restart_main_request_ = false; 1148 did_cancel_then_restart_main_ = true; 1149 return new CancelThenRestartTestJob(request, network_delegate); 1150 } 1151 if (simulate_main_network_error_) { 1152 simulate_main_network_error_ = false; 1153 did_simulate_error_main_ = true; 1154 // will error since the requeted url is not one of its canned urls 1155 return new URLRequestTestJob(request, network_delegate, true); 1156 } 1157 if (!intercept_main_request_) 1158 return NULL; 1159 intercept_main_request_ = false; 1160 did_intercept_main_ = true; 1161 URLRequestTestJob* job = new URLRequestTestJob(request, 1162 network_delegate, 1163 main_headers_, 1164 main_data_, 1165 true); 1166 job->set_load_timing_info(main_request_load_timing_info_); 1167 return job; 1168 } 1169 1170 virtual URLRequestJob* MaybeInterceptRedirect( 1171 URLRequest* request, 1172 NetworkDelegate* network_delegate, 1173 const GURL& location) OVERRIDE { 1174 if (cancel_redirect_request_) { 1175 cancel_redirect_request_ = false; 1176 did_cancel_redirect_ = true; 1177 return new CancelTestJob(request, network_delegate); 1178 } 1179 if (!intercept_redirect_) 1180 return NULL; 1181 intercept_redirect_ = false; 1182 did_intercept_redirect_ = true; 1183 return new URLRequestTestJob(request, 1184 network_delegate, 1185 redirect_headers_, 1186 redirect_data_, 1187 true); 1188 } 1189 1190 virtual URLRequestJob* MaybeInterceptResponse( 1191 URLRequest* request, NetworkDelegate* network_delegate) OVERRIDE { 1192 if (cancel_final_request_) { 1193 cancel_final_request_ = false; 1194 did_cancel_final_ = true; 1195 return new CancelTestJob(request, network_delegate); 1196 } 1197 if (!intercept_final_response_) 1198 return NULL; 1199 intercept_final_response_ = false; 1200 did_intercept_final_ = true; 1201 return new URLRequestTestJob(request, 1202 network_delegate, 1203 final_headers_, 1204 final_data_, 1205 true); 1206 } 1207 1208 // Whether to intercept the main request, and if so the response to return and 1209 // the LoadTimingInfo to use. 1210 bool intercept_main_request_; 1211 std::string main_headers_; 1212 std::string main_data_; 1213 LoadTimingInfo main_request_load_timing_info_; 1214 1215 // Other actions we take at MaybeIntercept time 1216 bool restart_main_request_; 1217 bool cancel_main_request_; 1218 bool cancel_then_restart_main_request_; 1219 bool simulate_main_network_error_; 1220 1221 // Whether to intercept redirects, and if so the response to return. 1222 bool intercept_redirect_; 1223 std::string redirect_headers_; 1224 std::string redirect_data_; 1225 1226 // Other actions we can take at MaybeInterceptRedirect time 1227 bool cancel_redirect_request_; 1228 1229 // Whether to intercept final response, and if so the response to return. 1230 bool intercept_final_response_; 1231 std::string final_headers_; 1232 std::string final_data_; 1233 1234 // Other actions we can take at MaybeInterceptResponse time 1235 bool cancel_final_request_; 1236 1237 // If we did something or not 1238 bool did_intercept_main_; 1239 bool did_restart_main_; 1240 bool did_cancel_main_; 1241 bool did_cancel_then_restart_main_; 1242 bool did_simulate_error_main_; 1243 bool did_intercept_redirect_; 1244 bool did_cancel_redirect_; 1245 bool did_intercept_final_; 1246 bool did_cancel_final_; 1247 1248 // Static getters for canned response header and data strings 1249 1250 static std::string ok_data() { 1251 return URLRequestTestJob::test_data_1(); 1252 } 1253 1254 static std::string ok_headers() { 1255 return URLRequestTestJob::test_headers(); 1256 } 1257 1258 static std::string redirect_data() { 1259 return std::string(); 1260 } 1261 1262 static std::string redirect_headers() { 1263 return URLRequestTestJob::test_redirect_headers(); 1264 } 1265 1266 static std::string error_data() { 1267 return std::string("ohhh nooooo mr. bill!"); 1268 } 1269 1270 static std::string error_headers() { 1271 return URLRequestTestJob::test_error_headers(); 1272 } 1273}; 1274 1275TEST_F(URLRequestTest, Intercept) { 1276 TestInterceptor interceptor; 1277 1278 // intercept the main request and respond with a simple response 1279 interceptor.intercept_main_request_ = true; 1280 interceptor.main_headers_ = TestInterceptor::ok_headers(); 1281 interceptor.main_data_ = TestInterceptor::ok_data(); 1282 1283 TestDelegate d; 1284 URLRequest req(GURL("http://test_intercept/foo"), 1285 DEFAULT_PRIORITY, 1286 &d, 1287 &default_context_); 1288 base::SupportsUserData::Data* user_data0 = new base::SupportsUserData::Data(); 1289 base::SupportsUserData::Data* user_data1 = new base::SupportsUserData::Data(); 1290 base::SupportsUserData::Data* user_data2 = new base::SupportsUserData::Data(); 1291 req.SetUserData(NULL, user_data0); 1292 req.SetUserData(&user_data1, user_data1); 1293 req.SetUserData(&user_data2, user_data2); 1294 req.set_method("GET"); 1295 req.Start(); 1296 base::RunLoop().Run(); 1297 1298 // Make sure we can retrieve our specific user data 1299 EXPECT_EQ(user_data0, req.GetUserData(NULL)); 1300 EXPECT_EQ(user_data1, req.GetUserData(&user_data1)); 1301 EXPECT_EQ(user_data2, req.GetUserData(&user_data2)); 1302 1303 // Check the interceptor got called as expected 1304 EXPECT_TRUE(interceptor.did_intercept_main_); 1305 1306 // Check we got one good response 1307 EXPECT_TRUE(req.status().is_success()); 1308 EXPECT_EQ(200, req.response_headers()->response_code()); 1309 EXPECT_EQ(TestInterceptor::ok_data(), d.data_received()); 1310 EXPECT_EQ(1, d.response_started_count()); 1311 EXPECT_EQ(0, d.received_redirect_count()); 1312} 1313 1314TEST_F(URLRequestTest, InterceptRedirect) { 1315 TestInterceptor interceptor; 1316 1317 // intercept the main request and respond with a redirect 1318 interceptor.intercept_main_request_ = true; 1319 interceptor.main_headers_ = TestInterceptor::redirect_headers(); 1320 interceptor.main_data_ = TestInterceptor::redirect_data(); 1321 1322 // intercept that redirect and respond a final OK response 1323 interceptor.intercept_redirect_ = true; 1324 interceptor.redirect_headers_ = TestInterceptor::ok_headers(); 1325 interceptor.redirect_data_ = TestInterceptor::ok_data(); 1326 1327 TestDelegate d; 1328 URLRequest req(GURL("http://test_intercept/foo"), 1329 DEFAULT_PRIORITY, 1330 &d, 1331 &default_context_); 1332 req.set_method("GET"); 1333 req.Start(); 1334 base::RunLoop().Run(); 1335 1336 // Check the interceptor got called as expected 1337 EXPECT_TRUE(interceptor.did_intercept_main_); 1338 EXPECT_TRUE(interceptor.did_intercept_redirect_); 1339 1340 // Check we got one good response 1341 EXPECT_TRUE(req.status().is_success()); 1342 if (req.status().is_success()) { 1343 EXPECT_EQ(200, req.response_headers()->response_code()); 1344 } 1345 EXPECT_EQ(TestInterceptor::ok_data(), d.data_received()); 1346 EXPECT_EQ(1, d.response_started_count()); 1347 EXPECT_EQ(0, d.received_redirect_count()); 1348} 1349 1350TEST_F(URLRequestTest, InterceptServerError) { 1351 TestInterceptor interceptor; 1352 1353 // intercept the main request to generate a server error response 1354 interceptor.intercept_main_request_ = true; 1355 interceptor.main_headers_ = TestInterceptor::error_headers(); 1356 interceptor.main_data_ = TestInterceptor::error_data(); 1357 1358 // intercept that error and respond with an OK response 1359 interceptor.intercept_final_response_ = true; 1360 interceptor.final_headers_ = TestInterceptor::ok_headers(); 1361 interceptor.final_data_ = TestInterceptor::ok_data(); 1362 1363 TestDelegate d; 1364 URLRequest req(GURL("http://test_intercept/foo"), 1365 DEFAULT_PRIORITY, 1366 &d, 1367 &default_context_); 1368 req.set_method("GET"); 1369 req.Start(); 1370 base::RunLoop().Run(); 1371 1372 // Check the interceptor got called as expected 1373 EXPECT_TRUE(interceptor.did_intercept_main_); 1374 EXPECT_TRUE(interceptor.did_intercept_final_); 1375 1376 // Check we got one good response 1377 EXPECT_TRUE(req.status().is_success()); 1378 EXPECT_EQ(200, req.response_headers()->response_code()); 1379 EXPECT_EQ(TestInterceptor::ok_data(), d.data_received()); 1380 EXPECT_EQ(1, d.response_started_count()); 1381 EXPECT_EQ(0, d.received_redirect_count()); 1382} 1383 1384TEST_F(URLRequestTest, InterceptNetworkError) { 1385 TestInterceptor interceptor; 1386 1387 // intercept the main request to simulate a network error 1388 interceptor.simulate_main_network_error_ = true; 1389 1390 // intercept that error and respond with an OK response 1391 interceptor.intercept_final_response_ = true; 1392 interceptor.final_headers_ = TestInterceptor::ok_headers(); 1393 interceptor.final_data_ = TestInterceptor::ok_data(); 1394 1395 TestDelegate d; 1396 URLRequest req(GURL("http://test_intercept/foo"), 1397 DEFAULT_PRIORITY, 1398 &d, 1399 &default_context_); 1400 req.set_method("GET"); 1401 req.Start(); 1402 base::RunLoop().Run(); 1403 1404 // Check the interceptor got called as expected 1405 EXPECT_TRUE(interceptor.did_simulate_error_main_); 1406 EXPECT_TRUE(interceptor.did_intercept_final_); 1407 1408 // Check we received one good response 1409 EXPECT_TRUE(req.status().is_success()); 1410 EXPECT_EQ(200, req.response_headers()->response_code()); 1411 EXPECT_EQ(TestInterceptor::ok_data(), d.data_received()); 1412 EXPECT_EQ(1, d.response_started_count()); 1413 EXPECT_EQ(0, d.received_redirect_count()); 1414} 1415 1416TEST_F(URLRequestTest, InterceptRestartRequired) { 1417 TestInterceptor interceptor; 1418 1419 // restart the main request 1420 interceptor.restart_main_request_ = true; 1421 1422 // then intercept the new main request and respond with an OK response 1423 interceptor.intercept_main_request_ = true; 1424 interceptor.main_headers_ = TestInterceptor::ok_headers(); 1425 interceptor.main_data_ = TestInterceptor::ok_data(); 1426 1427 TestDelegate d; 1428 URLRequest req(GURL("http://test_intercept/foo"), 1429 DEFAULT_PRIORITY, 1430 &d, 1431 &default_context_); 1432 req.set_method("GET"); 1433 req.Start(); 1434 base::RunLoop().Run(); 1435 1436 // Check the interceptor got called as expected 1437 EXPECT_TRUE(interceptor.did_restart_main_); 1438 EXPECT_TRUE(interceptor.did_intercept_main_); 1439 1440 // Check we received one good response 1441 EXPECT_TRUE(req.status().is_success()); 1442 if (req.status().is_success()) { 1443 EXPECT_EQ(200, req.response_headers()->response_code()); 1444 } 1445 EXPECT_EQ(TestInterceptor::ok_data(), d.data_received()); 1446 EXPECT_EQ(1, d.response_started_count()); 1447 EXPECT_EQ(0, d.received_redirect_count()); 1448} 1449 1450TEST_F(URLRequestTest, InterceptRespectsCancelMain) { 1451 TestInterceptor interceptor; 1452 1453 // intercept the main request and cancel from within the restarted job 1454 interceptor.cancel_main_request_ = true; 1455 1456 // setup to intercept final response and override it with an OK response 1457 interceptor.intercept_final_response_ = true; 1458 interceptor.final_headers_ = TestInterceptor::ok_headers(); 1459 interceptor.final_data_ = TestInterceptor::ok_data(); 1460 1461 TestDelegate d; 1462 URLRequest req(GURL("http://test_intercept/foo"), 1463 DEFAULT_PRIORITY, 1464 &d, 1465 &default_context_); 1466 req.set_method("GET"); 1467 req.Start(); 1468 base::RunLoop().Run(); 1469 1470 // Check the interceptor got called as expected 1471 EXPECT_TRUE(interceptor.did_cancel_main_); 1472 EXPECT_FALSE(interceptor.did_intercept_final_); 1473 1474 // Check we see a canceled request 1475 EXPECT_FALSE(req.status().is_success()); 1476 EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status()); 1477} 1478 1479TEST_F(URLRequestTest, InterceptRespectsCancelRedirect) { 1480 TestInterceptor interceptor; 1481 1482 // intercept the main request and respond with a redirect 1483 interceptor.intercept_main_request_ = true; 1484 interceptor.main_headers_ = TestInterceptor::redirect_headers(); 1485 interceptor.main_data_ = TestInterceptor::redirect_data(); 1486 1487 // intercept the redirect and cancel from within that job 1488 interceptor.cancel_redirect_request_ = true; 1489 1490 // setup to intercept final response and override it with an OK response 1491 interceptor.intercept_final_response_ = true; 1492 interceptor.final_headers_ = TestInterceptor::ok_headers(); 1493 interceptor.final_data_ = TestInterceptor::ok_data(); 1494 1495 TestDelegate d; 1496 URLRequest req(GURL("http://test_intercept/foo"), 1497 DEFAULT_PRIORITY, 1498 &d, 1499 &default_context_); 1500 req.set_method("GET"); 1501 req.Start(); 1502 base::RunLoop().Run(); 1503 1504 // Check the interceptor got called as expected 1505 EXPECT_TRUE(interceptor.did_intercept_main_); 1506 EXPECT_TRUE(interceptor.did_cancel_redirect_); 1507 EXPECT_FALSE(interceptor.did_intercept_final_); 1508 1509 // Check we see a canceled request 1510 EXPECT_FALSE(req.status().is_success()); 1511 EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status()); 1512} 1513 1514TEST_F(URLRequestTest, InterceptRespectsCancelFinal) { 1515 TestInterceptor interceptor; 1516 1517 // intercept the main request to simulate a network error 1518 interceptor.simulate_main_network_error_ = true; 1519 1520 // setup to intercept final response and cancel from within that job 1521 interceptor.cancel_final_request_ = true; 1522 1523 TestDelegate d; 1524 URLRequest req(GURL("http://test_intercept/foo"), 1525 DEFAULT_PRIORITY, 1526 &d, 1527 &default_context_); 1528 req.set_method("GET"); 1529 req.Start(); 1530 base::RunLoop().Run(); 1531 1532 // Check the interceptor got called as expected 1533 EXPECT_TRUE(interceptor.did_simulate_error_main_); 1534 EXPECT_TRUE(interceptor.did_cancel_final_); 1535 1536 // Check we see a canceled request 1537 EXPECT_FALSE(req.status().is_success()); 1538 EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status()); 1539} 1540 1541TEST_F(URLRequestTest, InterceptRespectsCancelInRestart) { 1542 TestInterceptor interceptor; 1543 1544 // intercept the main request and cancel then restart from within that job 1545 interceptor.cancel_then_restart_main_request_ = true; 1546 1547 // setup to intercept final response and override it with an OK response 1548 interceptor.intercept_final_response_ = true; 1549 interceptor.final_headers_ = TestInterceptor::ok_headers(); 1550 interceptor.final_data_ = TestInterceptor::ok_data(); 1551 1552 TestDelegate d; 1553 URLRequest req(GURL("http://test_intercept/foo"), 1554 DEFAULT_PRIORITY, 1555 &d, 1556 &default_context_); 1557 req.set_method("GET"); 1558 req.Start(); 1559 base::RunLoop().Run(); 1560 1561 // Check the interceptor got called as expected 1562 EXPECT_TRUE(interceptor.did_cancel_then_restart_main_); 1563 EXPECT_FALSE(interceptor.did_intercept_final_); 1564 1565 // Check we see a canceled request 1566 EXPECT_FALSE(req.status().is_success()); 1567 EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status()); 1568} 1569 1570LoadTimingInfo RunLoadTimingTest(const LoadTimingInfo& job_load_timing, 1571 URLRequestContext* context) { 1572 TestInterceptor interceptor; 1573 interceptor.intercept_main_request_ = true; 1574 interceptor.main_request_load_timing_info_ = job_load_timing; 1575 TestDelegate d; 1576 URLRequest req( 1577 GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d, context); 1578 req.Start(); 1579 base::RunLoop().Run(); 1580 1581 LoadTimingInfo resulting_load_timing; 1582 req.GetLoadTimingInfo(&resulting_load_timing); 1583 1584 // None of these should be modified by the URLRequest. 1585 EXPECT_EQ(job_load_timing.socket_reused, resulting_load_timing.socket_reused); 1586 EXPECT_EQ(job_load_timing.socket_log_id, resulting_load_timing.socket_log_id); 1587 EXPECT_EQ(job_load_timing.send_start, resulting_load_timing.send_start); 1588 EXPECT_EQ(job_load_timing.send_end, resulting_load_timing.send_end); 1589 EXPECT_EQ(job_load_timing.receive_headers_end, 1590 resulting_load_timing.receive_headers_end); 1591 1592 return resulting_load_timing; 1593} 1594 1595// "Normal" LoadTimingInfo as returned by a job. Everything is in order, not 1596// reused. |connect_time_flags| is used to indicate if there should be dns 1597// or SSL times, and |used_proxy| is used for proxy times. 1598LoadTimingInfo NormalLoadTimingInfo(base::TimeTicks now, 1599 int connect_time_flags, 1600 bool used_proxy) { 1601 LoadTimingInfo load_timing; 1602 load_timing.socket_log_id = 1; 1603 1604 if (used_proxy) { 1605 load_timing.proxy_resolve_start = now + base::TimeDelta::FromDays(1); 1606 load_timing.proxy_resolve_end = now + base::TimeDelta::FromDays(2); 1607 } 1608 1609 LoadTimingInfo::ConnectTiming& connect_timing = load_timing.connect_timing; 1610 if (connect_time_flags & CONNECT_TIMING_HAS_DNS_TIMES) { 1611 connect_timing.dns_start = now + base::TimeDelta::FromDays(3); 1612 connect_timing.dns_end = now + base::TimeDelta::FromDays(4); 1613 } 1614 connect_timing.connect_start = now + base::TimeDelta::FromDays(5); 1615 if (connect_time_flags & CONNECT_TIMING_HAS_SSL_TIMES) { 1616 connect_timing.ssl_start = now + base::TimeDelta::FromDays(6); 1617 connect_timing.ssl_end = now + base::TimeDelta::FromDays(7); 1618 } 1619 connect_timing.connect_end = now + base::TimeDelta::FromDays(8); 1620 1621 load_timing.send_start = now + base::TimeDelta::FromDays(9); 1622 load_timing.send_end = now + base::TimeDelta::FromDays(10); 1623 load_timing.receive_headers_end = now + base::TimeDelta::FromDays(11); 1624 return load_timing; 1625} 1626 1627// Same as above, but in the case of a reused socket. 1628LoadTimingInfo NormalLoadTimingInfoReused(base::TimeTicks now, 1629 bool used_proxy) { 1630 LoadTimingInfo load_timing; 1631 load_timing.socket_log_id = 1; 1632 load_timing.socket_reused = true; 1633 1634 if (used_proxy) { 1635 load_timing.proxy_resolve_start = now + base::TimeDelta::FromDays(1); 1636 load_timing.proxy_resolve_end = now + base::TimeDelta::FromDays(2); 1637 } 1638 1639 load_timing.send_start = now + base::TimeDelta::FromDays(9); 1640 load_timing.send_end = now + base::TimeDelta::FromDays(10); 1641 load_timing.receive_headers_end = now + base::TimeDelta::FromDays(11); 1642 return load_timing; 1643} 1644 1645// Basic test that the intercept + load timing tests work. 1646TEST_F(URLRequestTest, InterceptLoadTiming) { 1647 base::TimeTicks now = base::TimeTicks::Now(); 1648 LoadTimingInfo job_load_timing = 1649 NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_DNS_TIMES, false); 1650 1651 LoadTimingInfo load_timing_result = 1652 RunLoadTimingTest(job_load_timing, &default_context_); 1653 1654 // Nothing should have been changed by the URLRequest. 1655 EXPECT_EQ(job_load_timing.proxy_resolve_start, 1656 load_timing_result.proxy_resolve_start); 1657 EXPECT_EQ(job_load_timing.proxy_resolve_end, 1658 load_timing_result.proxy_resolve_end); 1659 EXPECT_EQ(job_load_timing.connect_timing.dns_start, 1660 load_timing_result.connect_timing.dns_start); 1661 EXPECT_EQ(job_load_timing.connect_timing.dns_end, 1662 load_timing_result.connect_timing.dns_end); 1663 EXPECT_EQ(job_load_timing.connect_timing.connect_start, 1664 load_timing_result.connect_timing.connect_start); 1665 EXPECT_EQ(job_load_timing.connect_timing.connect_end, 1666 load_timing_result.connect_timing.connect_end); 1667 EXPECT_EQ(job_load_timing.connect_timing.ssl_start, 1668 load_timing_result.connect_timing.ssl_start); 1669 EXPECT_EQ(job_load_timing.connect_timing.ssl_end, 1670 load_timing_result.connect_timing.ssl_end); 1671 1672 // Redundant sanity check. 1673 TestLoadTimingNotReused(load_timing_result, CONNECT_TIMING_HAS_DNS_TIMES); 1674} 1675 1676// Another basic test, with proxy and SSL times, but no DNS times. 1677TEST_F(URLRequestTest, InterceptLoadTimingProxy) { 1678 base::TimeTicks now = base::TimeTicks::Now(); 1679 LoadTimingInfo job_load_timing = 1680 NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_SSL_TIMES, true); 1681 1682 LoadTimingInfo load_timing_result = 1683 RunLoadTimingTest(job_load_timing, &default_context_); 1684 1685 // Nothing should have been changed by the URLRequest. 1686 EXPECT_EQ(job_load_timing.proxy_resolve_start, 1687 load_timing_result.proxy_resolve_start); 1688 EXPECT_EQ(job_load_timing.proxy_resolve_end, 1689 load_timing_result.proxy_resolve_end); 1690 EXPECT_EQ(job_load_timing.connect_timing.dns_start, 1691 load_timing_result.connect_timing.dns_start); 1692 EXPECT_EQ(job_load_timing.connect_timing.dns_end, 1693 load_timing_result.connect_timing.dns_end); 1694 EXPECT_EQ(job_load_timing.connect_timing.connect_start, 1695 load_timing_result.connect_timing.connect_start); 1696 EXPECT_EQ(job_load_timing.connect_timing.connect_end, 1697 load_timing_result.connect_timing.connect_end); 1698 EXPECT_EQ(job_load_timing.connect_timing.ssl_start, 1699 load_timing_result.connect_timing.ssl_start); 1700 EXPECT_EQ(job_load_timing.connect_timing.ssl_end, 1701 load_timing_result.connect_timing.ssl_end); 1702 1703 // Redundant sanity check. 1704 TestLoadTimingNotReusedWithProxy(load_timing_result, 1705 CONNECT_TIMING_HAS_SSL_TIMES); 1706} 1707 1708// Make sure that URLRequest correctly adjusts proxy times when they're before 1709// |request_start|, due to already having a connected socket. This happens in 1710// the case of reusing a SPDY session or HTTP pipeline. The connected socket is 1711// not considered reused in this test (May be a preconnect). 1712// 1713// To mix things up from the test above, assumes DNS times but no SSL times. 1714TEST_F(URLRequestTest, InterceptLoadTimingEarlyProxyResolution) { 1715 base::TimeTicks now = base::TimeTicks::Now(); 1716 LoadTimingInfo job_load_timing = 1717 NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_DNS_TIMES, true); 1718 job_load_timing.proxy_resolve_start = now - base::TimeDelta::FromDays(6); 1719 job_load_timing.proxy_resolve_end = now - base::TimeDelta::FromDays(5); 1720 job_load_timing.connect_timing.dns_start = now - base::TimeDelta::FromDays(4); 1721 job_load_timing.connect_timing.dns_end = now - base::TimeDelta::FromDays(3); 1722 job_load_timing.connect_timing.connect_start = 1723 now - base::TimeDelta::FromDays(2); 1724 job_load_timing.connect_timing.connect_end = 1725 now - base::TimeDelta::FromDays(1); 1726 1727 LoadTimingInfo load_timing_result = 1728 RunLoadTimingTest(job_load_timing, &default_context_); 1729 1730 // Proxy times, connect times, and DNS times should all be replaced with 1731 // request_start. 1732 EXPECT_EQ(load_timing_result.request_start, 1733 load_timing_result.proxy_resolve_start); 1734 EXPECT_EQ(load_timing_result.request_start, 1735 load_timing_result.proxy_resolve_end); 1736 EXPECT_EQ(load_timing_result.request_start, 1737 load_timing_result.connect_timing.dns_start); 1738 EXPECT_EQ(load_timing_result.request_start, 1739 load_timing_result.connect_timing.dns_end); 1740 EXPECT_EQ(load_timing_result.request_start, 1741 load_timing_result.connect_timing.connect_start); 1742 EXPECT_EQ(load_timing_result.request_start, 1743 load_timing_result.connect_timing.connect_end); 1744 1745 // Other times should have been left null. 1746 TestLoadTimingNotReusedWithProxy(load_timing_result, 1747 CONNECT_TIMING_HAS_DNS_TIMES); 1748} 1749 1750// Same as above, but in the reused case. 1751TEST_F(URLRequestTest, InterceptLoadTimingEarlyProxyResolutionReused) { 1752 base::TimeTicks now = base::TimeTicks::Now(); 1753 LoadTimingInfo job_load_timing = NormalLoadTimingInfoReused(now, true); 1754 job_load_timing.proxy_resolve_start = now - base::TimeDelta::FromDays(4); 1755 job_load_timing.proxy_resolve_end = now - base::TimeDelta::FromDays(3); 1756 1757 LoadTimingInfo load_timing_result = 1758 RunLoadTimingTest(job_load_timing, &default_context_); 1759 1760 // Proxy times and connect times should all be replaced with request_start. 1761 EXPECT_EQ(load_timing_result.request_start, 1762 load_timing_result.proxy_resolve_start); 1763 EXPECT_EQ(load_timing_result.request_start, 1764 load_timing_result.proxy_resolve_end); 1765 1766 // Other times should have been left null. 1767 TestLoadTimingReusedWithProxy(load_timing_result); 1768} 1769 1770// Make sure that URLRequest correctly adjusts connect times when they're before 1771// |request_start|, due to reusing a connected socket. The connected socket is 1772// not considered reused in this test (May be a preconnect). 1773// 1774// To mix things up, the request has SSL times, but no DNS times. 1775TEST_F(URLRequestTest, InterceptLoadTimingEarlyConnect) { 1776 base::TimeTicks now = base::TimeTicks::Now(); 1777 LoadTimingInfo job_load_timing = 1778 NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_SSL_TIMES, false); 1779 job_load_timing.connect_timing.connect_start = 1780 now - base::TimeDelta::FromDays(1); 1781 job_load_timing.connect_timing.ssl_start = now - base::TimeDelta::FromDays(2); 1782 job_load_timing.connect_timing.ssl_end = now - base::TimeDelta::FromDays(3); 1783 job_load_timing.connect_timing.connect_end = 1784 now - base::TimeDelta::FromDays(4); 1785 1786 LoadTimingInfo load_timing_result = 1787 RunLoadTimingTest(job_load_timing, &default_context_); 1788 1789 // Connect times, and SSL times should be replaced with request_start. 1790 EXPECT_EQ(load_timing_result.request_start, 1791 load_timing_result.connect_timing.connect_start); 1792 EXPECT_EQ(load_timing_result.request_start, 1793 load_timing_result.connect_timing.ssl_start); 1794 EXPECT_EQ(load_timing_result.request_start, 1795 load_timing_result.connect_timing.ssl_end); 1796 EXPECT_EQ(load_timing_result.request_start, 1797 load_timing_result.connect_timing.connect_end); 1798 1799 // Other times should have been left null. 1800 TestLoadTimingNotReused(load_timing_result, CONNECT_TIMING_HAS_SSL_TIMES); 1801} 1802 1803// Make sure that URLRequest correctly adjusts connect times when they're before 1804// |request_start|, due to reusing a connected socket in the case that there 1805// are also proxy times. The connected socket is not considered reused in this 1806// test (May be a preconnect). 1807// 1808// In this test, there are no SSL or DNS times. 1809TEST_F(URLRequestTest, InterceptLoadTimingEarlyConnectWithProxy) { 1810 base::TimeTicks now = base::TimeTicks::Now(); 1811 LoadTimingInfo job_load_timing = 1812 NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY, true); 1813 job_load_timing.connect_timing.connect_start = 1814 now - base::TimeDelta::FromDays(1); 1815 job_load_timing.connect_timing.connect_end = 1816 now - base::TimeDelta::FromDays(2); 1817 1818 LoadTimingInfo load_timing_result = 1819 RunLoadTimingTest(job_load_timing, &default_context_); 1820 1821 // Connect times should be replaced with proxy_resolve_end. 1822 EXPECT_EQ(load_timing_result.proxy_resolve_end, 1823 load_timing_result.connect_timing.connect_start); 1824 EXPECT_EQ(load_timing_result.proxy_resolve_end, 1825 load_timing_result.connect_timing.connect_end); 1826 1827 // Other times should have been left null. 1828 TestLoadTimingNotReusedWithProxy(load_timing_result, 1829 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY); 1830} 1831 1832// Check that two different URL requests have different identifiers. 1833TEST_F(URLRequestTest, Identifiers) { 1834 TestDelegate d; 1835 TestURLRequestContext context; 1836 TestURLRequest req( 1837 GURL("http://example.com"), DEFAULT_PRIORITY, &d, &context); 1838 TestURLRequest other_req( 1839 GURL("http://example.com"), DEFAULT_PRIORITY, &d, &context); 1840 1841 ASSERT_NE(req.identifier(), other_req.identifier()); 1842} 1843 1844// Check that a failure to connect to the proxy is reported to the network 1845// delegate. 1846TEST_F(URLRequestTest, NetworkDelegateProxyError) { 1847 MockHostResolver host_resolver; 1848 host_resolver.rules()->AddSimulatedFailure("*"); 1849 1850 TestNetworkDelegate network_delegate; // Must outlive URLRequests. 1851 TestURLRequestContextWithProxy context("myproxy:70", &network_delegate); 1852 1853 TestDelegate d; 1854 URLRequest req(GURL("http://example.com"), DEFAULT_PRIORITY, &d, &context); 1855 req.set_method("GET"); 1856 1857 req.Start(); 1858 base::RunLoop().Run(); 1859 1860 // Check we see a failed request. 1861 EXPECT_FALSE(req.status().is_success()); 1862 EXPECT_EQ(URLRequestStatus::FAILED, req.status().status()); 1863 EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, req.status().error()); 1864 1865 EXPECT_EQ(1, network_delegate.error_count()); 1866 EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, network_delegate.last_error()); 1867 EXPECT_EQ(1, network_delegate.completed_requests()); 1868} 1869 1870// Make sure that net::NetworkDelegate::NotifyCompleted is called if 1871// content is empty. 1872TEST_F(URLRequestTest, RequestCompletionForEmptyResponse) { 1873 TestDelegate d; 1874 URLRequest req(GURL("data:,"), DEFAULT_PRIORITY, &d, &default_context_); 1875 req.Start(); 1876 base::RunLoop().Run(); 1877 EXPECT_EQ("", d.data_received()); 1878 EXPECT_EQ(1, default_network_delegate_.completed_requests()); 1879} 1880 1881// Make sure that SetPriority actually sets the URLRequest's priority 1882// correctly, both before and after start. 1883TEST_F(URLRequestTest, SetPriorityBasic) { 1884 TestDelegate d; 1885 URLRequest req(GURL("http://test_intercept/foo"), 1886 DEFAULT_PRIORITY, 1887 &d, 1888 &default_context_); 1889 EXPECT_EQ(DEFAULT_PRIORITY, req.priority()); 1890 1891 req.SetPriority(LOW); 1892 EXPECT_EQ(LOW, req.priority()); 1893 1894 req.Start(); 1895 EXPECT_EQ(LOW, req.priority()); 1896 1897 req.SetPriority(MEDIUM); 1898 EXPECT_EQ(MEDIUM, req.priority()); 1899} 1900 1901// Make sure that URLRequest calls SetPriority on a job before calling 1902// Start on it. 1903TEST_F(URLRequestTest, SetJobPriorityBeforeJobStart) { 1904 TestDelegate d; 1905 URLRequest req(GURL("http://test_intercept/foo"), 1906 DEFAULT_PRIORITY, 1907 &d, 1908 &default_context_); 1909 EXPECT_EQ(DEFAULT_PRIORITY, req.priority()); 1910 1911 scoped_refptr<URLRequestTestJob> job = 1912 new URLRequestTestJob(&req, &default_network_delegate_); 1913 AddTestInterceptor()->set_main_intercept_job(job.get()); 1914 EXPECT_EQ(DEFAULT_PRIORITY, job->priority()); 1915 1916 req.SetPriority(LOW); 1917 1918 req.Start(); 1919 EXPECT_EQ(LOW, job->priority()); 1920} 1921 1922// Make sure that URLRequest passes on its priority updates to its 1923// job. 1924TEST_F(URLRequestTest, SetJobPriority) { 1925 TestDelegate d; 1926 URLRequest req(GURL("http://test_intercept/foo"), 1927 DEFAULT_PRIORITY, 1928 &d, 1929 &default_context_); 1930 1931 scoped_refptr<URLRequestTestJob> job = 1932 new URLRequestTestJob(&req, &default_network_delegate_); 1933 AddTestInterceptor()->set_main_intercept_job(job.get()); 1934 1935 req.SetPriority(LOW); 1936 req.Start(); 1937 EXPECT_EQ(LOW, job->priority()); 1938 1939 req.SetPriority(MEDIUM); 1940 EXPECT_EQ(MEDIUM, req.priority()); 1941 EXPECT_EQ(MEDIUM, job->priority()); 1942} 1943 1944// Setting the IGNORE_LIMITS load flag should be okay if the priority 1945// is MAXIMUM_PRIORITY. 1946TEST_F(URLRequestTest, PriorityIgnoreLimits) { 1947 TestDelegate d; 1948 URLRequest req(GURL("http://test_intercept/foo"), 1949 MAXIMUM_PRIORITY, 1950 &d, 1951 &default_context_); 1952 EXPECT_EQ(MAXIMUM_PRIORITY, req.priority()); 1953 1954 scoped_refptr<URLRequestTestJob> job = 1955 new URLRequestTestJob(&req, &default_network_delegate_); 1956 AddTestInterceptor()->set_main_intercept_job(job.get()); 1957 1958 req.SetLoadFlags(LOAD_IGNORE_LIMITS); 1959 EXPECT_EQ(MAXIMUM_PRIORITY, req.priority()); 1960 1961 req.SetPriority(MAXIMUM_PRIORITY); 1962 EXPECT_EQ(MAXIMUM_PRIORITY, req.priority()); 1963 1964 req.Start(); 1965 EXPECT_EQ(MAXIMUM_PRIORITY, req.priority()); 1966 EXPECT_EQ(MAXIMUM_PRIORITY, job->priority()); 1967} 1968 1969// TODO(droger): Support SpawnedTestServer on iOS (see http://crbug.com/148666). 1970#if !defined(OS_IOS) 1971// A subclass of SpawnedTestServer that uses a statically-configured hostname. 1972// This is to work around mysterious failures in chrome_frame_net_tests. See: 1973// http://crbug.com/114369 1974// TODO(erikwright): remove or update as needed; see http://crbug.com/334634. 1975class LocalHttpTestServer : public SpawnedTestServer { 1976 public: 1977 explicit LocalHttpTestServer(const base::FilePath& document_root) 1978 : SpawnedTestServer(SpawnedTestServer::TYPE_HTTP, 1979 ScopedCustomUrlRequestTestHttpHost::value(), 1980 document_root) {} 1981 LocalHttpTestServer() 1982 : SpawnedTestServer(SpawnedTestServer::TYPE_HTTP, 1983 ScopedCustomUrlRequestTestHttpHost::value(), 1984 base::FilePath()) {} 1985}; 1986 1987TEST_F(URLRequestTest, DelayedCookieCallback) { 1988 LocalHttpTestServer test_server; 1989 ASSERT_TRUE(test_server.Start()); 1990 1991 TestURLRequestContext context; 1992 scoped_refptr<DelayedCookieMonster> delayed_cm = 1993 new DelayedCookieMonster(); 1994 scoped_refptr<CookieStore> cookie_store = delayed_cm; 1995 context.set_cookie_store(delayed_cm.get()); 1996 1997 // Set up a cookie. 1998 { 1999 TestNetworkDelegate network_delegate; 2000 context.set_network_delegate(&network_delegate); 2001 TestDelegate d; 2002 URLRequest req(test_server.GetURL("set-cookie?CookieToNotSend=1"), 2003 DEFAULT_PRIORITY, 2004 &d, 2005 &context); 2006 req.Start(); 2007 base::RunLoop().Run(); 2008 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 2009 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 2010 EXPECT_EQ(1, network_delegate.set_cookie_count()); 2011 } 2012 2013 // Verify that the cookie is set. 2014 { 2015 TestNetworkDelegate network_delegate; 2016 context.set_network_delegate(&network_delegate); 2017 TestDelegate d; 2018 URLRequest req(test_server.GetURL("echoheader?Cookie"), 2019 DEFAULT_PRIORITY, 2020 &d, 2021 &context); 2022 req.Start(); 2023 base::RunLoop().Run(); 2024 2025 EXPECT_TRUE(d.data_received().find("CookieToNotSend=1") 2026 != std::string::npos); 2027 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 2028 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 2029 } 2030} 2031 2032TEST_F(URLRequestTest, DoNotSendCookies) { 2033 LocalHttpTestServer test_server; 2034 ASSERT_TRUE(test_server.Start()); 2035 2036 // Set up a cookie. 2037 { 2038 TestNetworkDelegate network_delegate; 2039 default_context_.set_network_delegate(&network_delegate); 2040 TestDelegate d; 2041 URLRequest req(test_server.GetURL("set-cookie?CookieToNotSend=1"), 2042 DEFAULT_PRIORITY, 2043 &d, 2044 &default_context_); 2045 req.Start(); 2046 base::RunLoop().Run(); 2047 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 2048 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 2049 } 2050 2051 // Verify that the cookie is set. 2052 { 2053 TestNetworkDelegate network_delegate; 2054 default_context_.set_network_delegate(&network_delegate); 2055 TestDelegate d; 2056 URLRequest req(test_server.GetURL("echoheader?Cookie"), 2057 DEFAULT_PRIORITY, 2058 &d, 2059 &default_context_); 2060 req.Start(); 2061 base::RunLoop().Run(); 2062 2063 EXPECT_TRUE(d.data_received().find("CookieToNotSend=1") 2064 != std::string::npos); 2065 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 2066 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 2067 } 2068 2069 // Verify that the cookie isn't sent when LOAD_DO_NOT_SEND_COOKIES is set. 2070 { 2071 TestNetworkDelegate network_delegate; 2072 default_context_.set_network_delegate(&network_delegate); 2073 TestDelegate d; 2074 URLRequest req(test_server.GetURL("echoheader?Cookie"), 2075 DEFAULT_PRIORITY, 2076 &d, 2077 &default_context_); 2078 req.SetLoadFlags(LOAD_DO_NOT_SEND_COOKIES); 2079 req.Start(); 2080 base::RunLoop().Run(); 2081 2082 EXPECT_TRUE(d.data_received().find("Cookie: CookieToNotSend=1") 2083 == std::string::npos); 2084 2085 // LOAD_DO_NOT_SEND_COOKIES does not trigger OnGetCookies. 2086 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 2087 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 2088 } 2089} 2090 2091TEST_F(URLRequestTest, DoNotSaveCookies) { 2092 LocalHttpTestServer test_server; 2093 ASSERT_TRUE(test_server.Start()); 2094 2095 // Set up a cookie. 2096 { 2097 TestNetworkDelegate network_delegate; 2098 default_context_.set_network_delegate(&network_delegate); 2099 TestDelegate d; 2100 URLRequest req(test_server.GetURL("set-cookie?CookieToNotUpdate=2"), 2101 DEFAULT_PRIORITY, 2102 &d, 2103 &default_context_); 2104 req.Start(); 2105 base::RunLoop().Run(); 2106 2107 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 2108 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 2109 EXPECT_EQ(1, network_delegate.set_cookie_count()); 2110 } 2111 2112 // Try to set-up another cookie and update the previous cookie. 2113 { 2114 TestNetworkDelegate network_delegate; 2115 default_context_.set_network_delegate(&network_delegate); 2116 TestDelegate d; 2117 URLRequest req( 2118 test_server.GetURL("set-cookie?CookieToNotSave=1&CookieToNotUpdate=1"), 2119 DEFAULT_PRIORITY, 2120 &d, 2121 &default_context_); 2122 req.SetLoadFlags(LOAD_DO_NOT_SAVE_COOKIES); 2123 req.Start(); 2124 2125 base::RunLoop().Run(); 2126 2127 // LOAD_DO_NOT_SAVE_COOKIES does not trigger OnSetCookie. 2128 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 2129 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 2130 EXPECT_EQ(0, network_delegate.set_cookie_count()); 2131 } 2132 2133 // Verify the cookies weren't saved or updated. 2134 { 2135 TestNetworkDelegate network_delegate; 2136 default_context_.set_network_delegate(&network_delegate); 2137 TestDelegate d; 2138 URLRequest req(test_server.GetURL("echoheader?Cookie"), 2139 DEFAULT_PRIORITY, 2140 &d, 2141 &default_context_); 2142 req.Start(); 2143 base::RunLoop().Run(); 2144 2145 EXPECT_TRUE(d.data_received().find("CookieToNotSave=1") 2146 == std::string::npos); 2147 EXPECT_TRUE(d.data_received().find("CookieToNotUpdate=2") 2148 != std::string::npos); 2149 2150 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 2151 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 2152 EXPECT_EQ(0, network_delegate.set_cookie_count()); 2153 } 2154} 2155 2156TEST_F(URLRequestTest, DoNotSendCookies_ViaPolicy) { 2157 LocalHttpTestServer test_server; 2158 ASSERT_TRUE(test_server.Start()); 2159 2160 // Set up a cookie. 2161 { 2162 TestNetworkDelegate network_delegate; 2163 default_context_.set_network_delegate(&network_delegate); 2164 TestDelegate d; 2165 URLRequest req(test_server.GetURL("set-cookie?CookieToNotSend=1"), 2166 DEFAULT_PRIORITY, 2167 &d, 2168 &default_context_); 2169 req.Start(); 2170 base::RunLoop().Run(); 2171 2172 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 2173 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 2174 } 2175 2176 // Verify that the cookie is set. 2177 { 2178 TestNetworkDelegate network_delegate; 2179 default_context_.set_network_delegate(&network_delegate); 2180 TestDelegate d; 2181 URLRequest req(test_server.GetURL("echoheader?Cookie"), 2182 DEFAULT_PRIORITY, 2183 &d, 2184 &default_context_); 2185 req.Start(); 2186 base::RunLoop().Run(); 2187 2188 EXPECT_TRUE(d.data_received().find("CookieToNotSend=1") 2189 != std::string::npos); 2190 2191 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 2192 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 2193 } 2194 2195 // Verify that the cookie isn't sent. 2196 { 2197 TestNetworkDelegate network_delegate; 2198 default_context_.set_network_delegate(&network_delegate); 2199 TestDelegate d; 2200 network_delegate.set_cookie_options(TestNetworkDelegate::NO_GET_COOKIES); 2201 URLRequest req(test_server.GetURL("echoheader?Cookie"), 2202 DEFAULT_PRIORITY, 2203 &d, 2204 &default_context_); 2205 req.Start(); 2206 base::RunLoop().Run(); 2207 2208 EXPECT_TRUE(d.data_received().find("Cookie: CookieToNotSend=1") 2209 == std::string::npos); 2210 2211 EXPECT_EQ(1, network_delegate.blocked_get_cookies_count()); 2212 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 2213 } 2214} 2215 2216TEST_F(URLRequestTest, DoNotSaveCookies_ViaPolicy) { 2217 LocalHttpTestServer test_server; 2218 ASSERT_TRUE(test_server.Start()); 2219 2220 // Set up a cookie. 2221 { 2222 TestNetworkDelegate network_delegate; 2223 default_context_.set_network_delegate(&network_delegate); 2224 TestDelegate d; 2225 URLRequest req(test_server.GetURL("set-cookie?CookieToNotUpdate=2"), 2226 DEFAULT_PRIORITY, 2227 &d, 2228 &default_context_); 2229 req.Start(); 2230 base::RunLoop().Run(); 2231 2232 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 2233 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 2234 } 2235 2236 // Try to set-up another cookie and update the previous cookie. 2237 { 2238 TestNetworkDelegate network_delegate; 2239 default_context_.set_network_delegate(&network_delegate); 2240 TestDelegate d; 2241 network_delegate.set_cookie_options(TestNetworkDelegate::NO_SET_COOKIE); 2242 URLRequest req( 2243 test_server.GetURL("set-cookie?CookieToNotSave=1&CookieToNotUpdate=1"), 2244 DEFAULT_PRIORITY, 2245 &d, 2246 &default_context_); 2247 req.Start(); 2248 2249 base::RunLoop().Run(); 2250 2251 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 2252 EXPECT_EQ(2, network_delegate.blocked_set_cookie_count()); 2253 } 2254 2255 // Verify the cookies weren't saved or updated. 2256 { 2257 TestNetworkDelegate network_delegate; 2258 default_context_.set_network_delegate(&network_delegate); 2259 TestDelegate d; 2260 URLRequest req(test_server.GetURL("echoheader?Cookie"), 2261 DEFAULT_PRIORITY, 2262 &d, 2263 &default_context_); 2264 req.Start(); 2265 base::RunLoop().Run(); 2266 2267 EXPECT_TRUE(d.data_received().find("CookieToNotSave=1") 2268 == std::string::npos); 2269 EXPECT_TRUE(d.data_received().find("CookieToNotUpdate=2") 2270 != std::string::npos); 2271 2272 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 2273 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 2274 } 2275} 2276 2277TEST_F(URLRequestTest, DoNotSaveEmptyCookies) { 2278 LocalHttpTestServer test_server; 2279 ASSERT_TRUE(test_server.Start()); 2280 2281 // Set up an empty cookie. 2282 { 2283 TestNetworkDelegate network_delegate; 2284 default_context_.set_network_delegate(&network_delegate); 2285 TestDelegate d; 2286 URLRequest req(test_server.GetURL("set-cookie"), 2287 DEFAULT_PRIORITY, 2288 &d, 2289 &default_context_); 2290 req.Start(); 2291 base::RunLoop().Run(); 2292 2293 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 2294 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 2295 EXPECT_EQ(0, network_delegate.set_cookie_count()); 2296 } 2297} 2298 2299TEST_F(URLRequestTest, DoNotSendCookies_ViaPolicy_Async) { 2300 LocalHttpTestServer test_server; 2301 ASSERT_TRUE(test_server.Start()); 2302 2303 // Set up a cookie. 2304 { 2305 TestNetworkDelegate network_delegate; 2306 default_context_.set_network_delegate(&network_delegate); 2307 TestDelegate d; 2308 URLRequest req(test_server.GetURL("set-cookie?CookieToNotSend=1"), 2309 DEFAULT_PRIORITY, 2310 &d, 2311 &default_context_); 2312 req.Start(); 2313 base::RunLoop().Run(); 2314 2315 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 2316 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 2317 } 2318 2319 // Verify that the cookie is set. 2320 { 2321 TestNetworkDelegate network_delegate; 2322 default_context_.set_network_delegate(&network_delegate); 2323 TestDelegate d; 2324 URLRequest req(test_server.GetURL("echoheader?Cookie"), 2325 DEFAULT_PRIORITY, 2326 &d, 2327 &default_context_); 2328 req.Start(); 2329 base::RunLoop().Run(); 2330 2331 EXPECT_TRUE(d.data_received().find("CookieToNotSend=1") 2332 != std::string::npos); 2333 2334 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 2335 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 2336 } 2337 2338 // Verify that the cookie isn't sent. 2339 { 2340 TestNetworkDelegate network_delegate; 2341 default_context_.set_network_delegate(&network_delegate); 2342 TestDelegate d; 2343 network_delegate.set_cookie_options(TestNetworkDelegate::NO_GET_COOKIES); 2344 URLRequest req(test_server.GetURL("echoheader?Cookie"), 2345 DEFAULT_PRIORITY, 2346 &d, 2347 &default_context_); 2348 req.Start(); 2349 base::RunLoop().Run(); 2350 2351 EXPECT_TRUE(d.data_received().find("Cookie: CookieToNotSend=1") 2352 == std::string::npos); 2353 2354 EXPECT_EQ(1, network_delegate.blocked_get_cookies_count()); 2355 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 2356 } 2357} 2358 2359TEST_F(URLRequestTest, DoNotSaveCookies_ViaPolicy_Async) { 2360 LocalHttpTestServer test_server; 2361 ASSERT_TRUE(test_server.Start()); 2362 2363 // Set up a cookie. 2364 { 2365 TestNetworkDelegate network_delegate; 2366 default_context_.set_network_delegate(&network_delegate); 2367 TestDelegate d; 2368 URLRequest req(test_server.GetURL("set-cookie?CookieToNotUpdate=2"), 2369 DEFAULT_PRIORITY, 2370 &d, 2371 &default_context_); 2372 req.Start(); 2373 base::RunLoop().Run(); 2374 2375 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 2376 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 2377 } 2378 2379 // Try to set-up another cookie and update the previous cookie. 2380 { 2381 TestNetworkDelegate network_delegate; 2382 default_context_.set_network_delegate(&network_delegate); 2383 TestDelegate d; 2384 network_delegate.set_cookie_options(TestNetworkDelegate::NO_SET_COOKIE); 2385 URLRequest req( 2386 test_server.GetURL("set-cookie?CookieToNotSave=1&CookieToNotUpdate=1"), 2387 DEFAULT_PRIORITY, 2388 &d, 2389 &default_context_); 2390 req.Start(); 2391 2392 base::RunLoop().Run(); 2393 2394 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 2395 EXPECT_EQ(2, network_delegate.blocked_set_cookie_count()); 2396 } 2397 2398 // Verify the cookies weren't saved or updated. 2399 { 2400 TestNetworkDelegate network_delegate; 2401 default_context_.set_network_delegate(&network_delegate); 2402 TestDelegate d; 2403 URLRequest req(test_server.GetURL("echoheader?Cookie"), 2404 DEFAULT_PRIORITY, 2405 &d, 2406 &default_context_); 2407 req.Start(); 2408 base::RunLoop().Run(); 2409 2410 EXPECT_TRUE(d.data_received().find("CookieToNotSave=1") 2411 == std::string::npos); 2412 EXPECT_TRUE(d.data_received().find("CookieToNotUpdate=2") 2413 != std::string::npos); 2414 2415 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 2416 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 2417 } 2418} 2419 2420// FixedDateNetworkDelegate swaps out the server's HTTP Date response header 2421// value for the |fixed_date| argument given to the constructor. 2422class FixedDateNetworkDelegate : public TestNetworkDelegate { 2423 public: 2424 explicit FixedDateNetworkDelegate(const std::string& fixed_date) 2425 : fixed_date_(fixed_date) {} 2426 virtual ~FixedDateNetworkDelegate() {} 2427 2428 // net::NetworkDelegate implementation 2429 virtual int OnHeadersReceived( 2430 net::URLRequest* request, 2431 const net::CompletionCallback& callback, 2432 const net::HttpResponseHeaders* original_response_headers, 2433 scoped_refptr<net::HttpResponseHeaders>* override_response_headers, 2434 GURL* allowed_unsafe_redirect_url) OVERRIDE; 2435 2436 private: 2437 std::string fixed_date_; 2438 2439 DISALLOW_COPY_AND_ASSIGN(FixedDateNetworkDelegate); 2440}; 2441 2442int FixedDateNetworkDelegate::OnHeadersReceived( 2443 net::URLRequest* request, 2444 const net::CompletionCallback& callback, 2445 const net::HttpResponseHeaders* original_response_headers, 2446 scoped_refptr<net::HttpResponseHeaders>* override_response_headers, 2447 GURL* allowed_unsafe_redirect_url) { 2448 net::HttpResponseHeaders* new_response_headers = 2449 new net::HttpResponseHeaders(original_response_headers->raw_headers()); 2450 2451 new_response_headers->RemoveHeader("Date"); 2452 new_response_headers->AddHeader("Date: " + fixed_date_); 2453 2454 *override_response_headers = new_response_headers; 2455 return TestNetworkDelegate::OnHeadersReceived(request, 2456 callback, 2457 original_response_headers, 2458 override_response_headers, 2459 allowed_unsafe_redirect_url); 2460} 2461 2462// Test that cookie expiration times are adjusted for server/client clock 2463// skew and that we handle incorrect timezone specifier "UTC" in HTTP Date 2464// headers by defaulting to GMT. (crbug.com/135131) 2465TEST_F(URLRequestTest, AcceptClockSkewCookieWithWrongDateTimezone) { 2466 LocalHttpTestServer test_server; 2467 ASSERT_TRUE(test_server.Start()); 2468 2469 // Set up an expired cookie. 2470 { 2471 TestNetworkDelegate network_delegate; 2472 default_context_.set_network_delegate(&network_delegate); 2473 TestDelegate d; 2474 URLRequest req( 2475 test_server.GetURL( 2476 "set-cookie?StillGood=1;expires=Mon,18-Apr-1977,22:50:13,GMT"), 2477 DEFAULT_PRIORITY, 2478 &d, 2479 &default_context_); 2480 req.Start(); 2481 base::RunLoop().Run(); 2482 } 2483 // Verify that the cookie is not set. 2484 { 2485 TestNetworkDelegate network_delegate; 2486 default_context_.set_network_delegate(&network_delegate); 2487 TestDelegate d; 2488 URLRequest req(test_server.GetURL("echoheader?Cookie"), 2489 DEFAULT_PRIORITY, 2490 &d, 2491 &default_context_); 2492 req.Start(); 2493 base::RunLoop().Run(); 2494 2495 EXPECT_TRUE(d.data_received().find("StillGood=1") == std::string::npos); 2496 } 2497 // Set up a cookie with clock skew and "UTC" HTTP Date timezone specifier. 2498 { 2499 FixedDateNetworkDelegate network_delegate("18-Apr-1977 22:49:13 UTC"); 2500 default_context_.set_network_delegate(&network_delegate); 2501 TestDelegate d; 2502 URLRequest req( 2503 test_server.GetURL( 2504 "set-cookie?StillGood=1;expires=Mon,18-Apr-1977,22:50:13,GMT"), 2505 DEFAULT_PRIORITY, 2506 &d, 2507 &default_context_); 2508 req.Start(); 2509 base::RunLoop().Run(); 2510 } 2511 // Verify that the cookie is set. 2512 { 2513 TestNetworkDelegate network_delegate; 2514 default_context_.set_network_delegate(&network_delegate); 2515 TestDelegate d; 2516 URLRequest req(test_server.GetURL("echoheader?Cookie"), 2517 DEFAULT_PRIORITY, 2518 &d, 2519 &default_context_); 2520 req.Start(); 2521 base::RunLoop().Run(); 2522 2523 EXPECT_TRUE(d.data_received().find("StillGood=1") != std::string::npos); 2524 } 2525} 2526 2527 2528// Check that it is impossible to change the referrer in the extra headers of 2529// an URLRequest. 2530TEST_F(URLRequestTest, DoNotOverrideReferrer) { 2531 LocalHttpTestServer test_server; 2532 ASSERT_TRUE(test_server.Start()); 2533 2534 // If extra headers contain referer and the request contains a referer, 2535 // only the latter shall be respected. 2536 { 2537 TestDelegate d; 2538 URLRequest req(test_server.GetURL("echoheader?Referer"), 2539 DEFAULT_PRIORITY, 2540 &d, 2541 &default_context_); 2542 req.SetReferrer("http://foo.com/"); 2543 2544 HttpRequestHeaders headers; 2545 headers.SetHeader(HttpRequestHeaders::kReferer, "http://bar.com/"); 2546 req.SetExtraRequestHeaders(headers); 2547 2548 req.Start(); 2549 base::RunLoop().Run(); 2550 2551 EXPECT_EQ("http://foo.com/", d.data_received()); 2552 } 2553 2554 // If extra headers contain a referer but the request does not, no referer 2555 // shall be sent in the header. 2556 { 2557 TestDelegate d; 2558 URLRequest req(test_server.GetURL("echoheader?Referer"), 2559 DEFAULT_PRIORITY, 2560 &d, 2561 &default_context_); 2562 2563 HttpRequestHeaders headers; 2564 headers.SetHeader(HttpRequestHeaders::kReferer, "http://bar.com/"); 2565 req.SetExtraRequestHeaders(headers); 2566 req.SetLoadFlags(LOAD_VALIDATE_CACHE); 2567 2568 req.Start(); 2569 base::RunLoop().Run(); 2570 2571 EXPECT_EQ("None", d.data_received()); 2572 } 2573} 2574 2575class URLRequestTestHTTP : public URLRequestTest { 2576 public: 2577 URLRequestTestHTTP() 2578 : test_server_(base::FilePath(FILE_PATH_LITERAL( 2579 "net/data/url_request_unittest"))) { 2580 } 2581 2582 protected: 2583 // Requests |redirect_url|, which must return a HTTP 3xx redirect. 2584 // |request_method| is the method to use for the initial request. 2585 // |redirect_method| is the method that is expected to be used for the second 2586 // request, after redirection. 2587 // If |include_data| is true, data is uploaded with the request. The 2588 // response body is expected to match it exactly, if and only if 2589 // |request_method| == |redirect_method|. 2590 void HTTPRedirectMethodTest(const GURL& redirect_url, 2591 const std::string& request_method, 2592 const std::string& redirect_method, 2593 bool include_data) { 2594 static const char kData[] = "hello world"; 2595 TestDelegate d; 2596 URLRequest req(redirect_url, DEFAULT_PRIORITY, &d, &default_context_); 2597 req.set_method(request_method); 2598 if (include_data) { 2599 req.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData))); 2600 HttpRequestHeaders headers; 2601 headers.SetHeader(HttpRequestHeaders::kContentLength, 2602 base::UintToString(arraysize(kData) - 1)); 2603 req.SetExtraRequestHeaders(headers); 2604 } 2605 req.Start(); 2606 base::RunLoop().Run(); 2607 EXPECT_EQ(redirect_method, req.method()); 2608 EXPECT_EQ(URLRequestStatus::SUCCESS, req.status().status()); 2609 EXPECT_EQ(OK, req.status().error()); 2610 if (include_data) { 2611 if (request_method == redirect_method) { 2612 EXPECT_EQ(kData, d.data_received()); 2613 } else { 2614 EXPECT_NE(kData, d.data_received()); 2615 } 2616 } 2617 if (HasFailure()) 2618 LOG(WARNING) << "Request method was: " << request_method; 2619 } 2620 2621 void HTTPUploadDataOperationTest(const std::string& method) { 2622 const int kMsgSize = 20000; // multiple of 10 2623 const int kIterations = 50; 2624 char* uploadBytes = new char[kMsgSize+1]; 2625 char* ptr = uploadBytes; 2626 char marker = 'a'; 2627 for (int idx = 0; idx < kMsgSize/10; idx++) { 2628 memcpy(ptr, "----------", 10); 2629 ptr += 10; 2630 if (idx % 100 == 0) { 2631 ptr--; 2632 *ptr++ = marker; 2633 if (++marker > 'z') 2634 marker = 'a'; 2635 } 2636 } 2637 uploadBytes[kMsgSize] = '\0'; 2638 2639 for (int i = 0; i < kIterations; ++i) { 2640 TestDelegate d; 2641 URLRequest r( 2642 test_server_.GetURL("echo"), DEFAULT_PRIORITY, &d, &default_context_); 2643 r.set_method(method.c_str()); 2644 2645 r.set_upload(make_scoped_ptr(CreateSimpleUploadData(uploadBytes))); 2646 2647 r.Start(); 2648 EXPECT_TRUE(r.is_pending()); 2649 2650 base::RunLoop().Run(); 2651 2652 ASSERT_EQ(1, d.response_started_count()) 2653 << "request failed: " << r.status().status() 2654 << ", os error: " << r.status().error(); 2655 2656 EXPECT_FALSE(d.received_data_before_response()); 2657 EXPECT_EQ(uploadBytes, d.data_received()); 2658 } 2659 delete[] uploadBytes; 2660 } 2661 2662 void AddChunksToUpload(URLRequest* r) { 2663 r->AppendChunkToUpload("a", 1, false); 2664 r->AppendChunkToUpload("bcd", 3, false); 2665 r->AppendChunkToUpload("this is a longer chunk than before.", 35, false); 2666 r->AppendChunkToUpload("\r\n\r\n", 4, false); 2667 r->AppendChunkToUpload("0", 1, false); 2668 r->AppendChunkToUpload("2323", 4, true); 2669 } 2670 2671 void VerifyReceivedDataMatchesChunks(URLRequest* r, TestDelegate* d) { 2672 // This should match the chunks sent by AddChunksToUpload(). 2673 const std::string expected_data = 2674 "abcdthis is a longer chunk than before.\r\n\r\n02323"; 2675 2676 ASSERT_EQ(1, d->response_started_count()) 2677 << "request failed: " << r->status().status() 2678 << ", os error: " << r->status().error(); 2679 2680 EXPECT_FALSE(d->received_data_before_response()); 2681 2682 EXPECT_EQ(expected_data.size(), static_cast<size_t>(d->bytes_received())); 2683 EXPECT_EQ(expected_data, d->data_received()); 2684 } 2685 2686 bool DoManyCookiesRequest(int num_cookies) { 2687 TestDelegate d; 2688 URLRequest r(test_server_.GetURL("set-many-cookies?" + 2689 base::IntToString(num_cookies)), 2690 DEFAULT_PRIORITY, 2691 &d, 2692 &default_context_); 2693 2694 r.Start(); 2695 EXPECT_TRUE(r.is_pending()); 2696 2697 base::RunLoop().Run(); 2698 2699 bool is_success = r.status().is_success(); 2700 2701 if (!is_success) { 2702 EXPECT_TRUE(r.status().error() == ERR_RESPONSE_HEADERS_TOO_BIG); 2703 // The test server appears to be unable to handle subsequent requests 2704 // after this error is triggered. Force it to restart. 2705 EXPECT_TRUE(test_server_.Stop()); 2706 EXPECT_TRUE(test_server_.Start()); 2707 } 2708 2709 return is_success; 2710 } 2711 2712 LocalHttpTestServer test_server_; 2713}; 2714 2715// In this unit test, we're using the HTTPTestServer as a proxy server and 2716// issuing a CONNECT request with the magic host name "www.redirect.com". 2717// The HTTPTestServer will return a 302 response, which we should not 2718// follow. 2719TEST_F(URLRequestTestHTTP, ProxyTunnelRedirectTest) { 2720 ASSERT_TRUE(test_server_.Start()); 2721 2722 TestNetworkDelegate network_delegate; // Must outlive URLRequest. 2723 TestURLRequestContextWithProxy context( 2724 test_server_.host_port_pair().ToString(), &network_delegate); 2725 2726 TestDelegate d; 2727 { 2728 URLRequest r( 2729 GURL("https://www.redirect.com/"), DEFAULT_PRIORITY, &d, &context); 2730 r.Start(); 2731 EXPECT_TRUE(r.is_pending()); 2732 2733 base::RunLoop().Run(); 2734 2735 EXPECT_EQ(URLRequestStatus::FAILED, r.status().status()); 2736 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, r.status().error()); 2737 EXPECT_EQ(1, d.response_started_count()); 2738 // We should not have followed the redirect. 2739 EXPECT_EQ(0, d.received_redirect_count()); 2740 } 2741} 2742 2743// This is the same as the previous test, but checks that the network delegate 2744// registers the error. 2745TEST_F(URLRequestTestHTTP, NetworkDelegateTunnelConnectionFailed) { 2746 ASSERT_TRUE(test_server_.Start()); 2747 2748 TestNetworkDelegate network_delegate; // Must outlive URLRequest. 2749 TestURLRequestContextWithProxy context( 2750 test_server_.host_port_pair().ToString(), &network_delegate); 2751 2752 TestDelegate d; 2753 { 2754 URLRequest r( 2755 GURL("https://www.redirect.com/"), DEFAULT_PRIORITY, &d, &context); 2756 r.Start(); 2757 EXPECT_TRUE(r.is_pending()); 2758 2759 base::RunLoop().Run(); 2760 2761 EXPECT_EQ(URLRequestStatus::FAILED, r.status().status()); 2762 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, r.status().error()); 2763 EXPECT_EQ(1, d.response_started_count()); 2764 // We should not have followed the redirect. 2765 EXPECT_EQ(0, d.received_redirect_count()); 2766 2767 EXPECT_EQ(1, network_delegate.error_count()); 2768 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, network_delegate.last_error()); 2769 } 2770} 2771 2772// Tests that we can block and asynchronously return OK in various stages. 2773TEST_F(URLRequestTestHTTP, NetworkDelegateBlockAsynchronously) { 2774 static const BlockingNetworkDelegate::Stage blocking_stages[] = { 2775 BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST, 2776 BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS, 2777 BlockingNetworkDelegate::ON_HEADERS_RECEIVED 2778 }; 2779 static const size_t blocking_stages_length = arraysize(blocking_stages); 2780 2781 ASSERT_TRUE(test_server_.Start()); 2782 2783 TestDelegate d; 2784 BlockingNetworkDelegate network_delegate( 2785 BlockingNetworkDelegate::USER_CALLBACK); 2786 network_delegate.set_block_on( 2787 BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST | 2788 BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS | 2789 BlockingNetworkDelegate::ON_HEADERS_RECEIVED); 2790 2791 TestURLRequestContext context(true); 2792 context.set_network_delegate(&network_delegate); 2793 context.Init(); 2794 2795 { 2796 URLRequest r( 2797 test_server_.GetURL("empty.html"), DEFAULT_PRIORITY, &d, &context); 2798 2799 r.Start(); 2800 for (size_t i = 0; i < blocking_stages_length; ++i) { 2801 base::RunLoop().Run(); 2802 EXPECT_EQ(blocking_stages[i], 2803 network_delegate.stage_blocked_for_callback()); 2804 network_delegate.DoCallback(OK); 2805 } 2806 base::RunLoop().Run(); 2807 EXPECT_EQ(200, r.GetResponseCode()); 2808 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 2809 EXPECT_EQ(1, network_delegate.created_requests()); 2810 EXPECT_EQ(0, network_delegate.destroyed_requests()); 2811 } 2812 EXPECT_EQ(1, network_delegate.destroyed_requests()); 2813} 2814 2815// Tests that the network delegate can block and cancel a request. 2816TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequest) { 2817 ASSERT_TRUE(test_server_.Start()); 2818 2819 TestDelegate d; 2820 BlockingNetworkDelegate network_delegate( 2821 BlockingNetworkDelegate::AUTO_CALLBACK); 2822 network_delegate.set_block_on(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST); 2823 network_delegate.set_retval(ERR_EMPTY_RESPONSE); 2824 2825 TestURLRequestContextWithProxy context( 2826 test_server_.host_port_pair().ToString(), &network_delegate); 2827 2828 { 2829 URLRequest r( 2830 test_server_.GetURL(std::string()), DEFAULT_PRIORITY, &d, &context); 2831 2832 r.Start(); 2833 base::RunLoop().Run(); 2834 2835 EXPECT_EQ(URLRequestStatus::FAILED, r.status().status()); 2836 EXPECT_EQ(ERR_EMPTY_RESPONSE, r.status().error()); 2837 EXPECT_EQ(1, network_delegate.created_requests()); 2838 EXPECT_EQ(0, network_delegate.destroyed_requests()); 2839 } 2840 EXPECT_EQ(1, network_delegate.destroyed_requests()); 2841} 2842 2843// Helper function for NetworkDelegateCancelRequestAsynchronously and 2844// NetworkDelegateCancelRequestSynchronously. Sets up a blocking network 2845// delegate operating in |block_mode| and a request for |url|. It blocks the 2846// request in |stage| and cancels it with ERR_BLOCKED_BY_CLIENT. 2847void NetworkDelegateCancelRequest(BlockingNetworkDelegate::BlockMode block_mode, 2848 BlockingNetworkDelegate::Stage stage, 2849 const GURL& url) { 2850 TestDelegate d; 2851 BlockingNetworkDelegate network_delegate(block_mode); 2852 network_delegate.set_retval(ERR_BLOCKED_BY_CLIENT); 2853 network_delegate.set_block_on(stage); 2854 2855 TestURLRequestContext context(true); 2856 context.set_network_delegate(&network_delegate); 2857 context.Init(); 2858 2859 { 2860 URLRequest r(url, DEFAULT_PRIORITY, &d, &context); 2861 2862 r.Start(); 2863 base::RunLoop().Run(); 2864 2865 EXPECT_EQ(URLRequestStatus::FAILED, r.status().status()); 2866 EXPECT_EQ(ERR_BLOCKED_BY_CLIENT, r.status().error()); 2867 EXPECT_EQ(1, network_delegate.created_requests()); 2868 EXPECT_EQ(0, network_delegate.destroyed_requests()); 2869 } 2870 EXPECT_EQ(1, network_delegate.destroyed_requests()); 2871} 2872 2873// The following 3 tests check that the network delegate can cancel a request 2874// synchronously in various stages of the request. 2875TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestSynchronously1) { 2876 ASSERT_TRUE(test_server_.Start()); 2877 NetworkDelegateCancelRequest(BlockingNetworkDelegate::SYNCHRONOUS, 2878 BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST, 2879 test_server_.GetURL(std::string())); 2880} 2881 2882TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestSynchronously2) { 2883 ASSERT_TRUE(test_server_.Start()); 2884 NetworkDelegateCancelRequest(BlockingNetworkDelegate::SYNCHRONOUS, 2885 BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS, 2886 test_server_.GetURL(std::string())); 2887} 2888 2889TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestSynchronously3) { 2890 ASSERT_TRUE(test_server_.Start()); 2891 NetworkDelegateCancelRequest(BlockingNetworkDelegate::SYNCHRONOUS, 2892 BlockingNetworkDelegate::ON_HEADERS_RECEIVED, 2893 test_server_.GetURL(std::string())); 2894} 2895 2896// The following 3 tests check that the network delegate can cancel a request 2897// asynchronously in various stages of the request. 2898TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestAsynchronously1) { 2899 ASSERT_TRUE(test_server_.Start()); 2900 NetworkDelegateCancelRequest(BlockingNetworkDelegate::AUTO_CALLBACK, 2901 BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST, 2902 test_server_.GetURL(std::string())); 2903} 2904 2905TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestAsynchronously2) { 2906 ASSERT_TRUE(test_server_.Start()); 2907 NetworkDelegateCancelRequest(BlockingNetworkDelegate::AUTO_CALLBACK, 2908 BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS, 2909 test_server_.GetURL(std::string())); 2910} 2911 2912TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestAsynchronously3) { 2913 ASSERT_TRUE(test_server_.Start()); 2914 NetworkDelegateCancelRequest(BlockingNetworkDelegate::AUTO_CALLBACK, 2915 BlockingNetworkDelegate::ON_HEADERS_RECEIVED, 2916 test_server_.GetURL(std::string())); 2917} 2918 2919// Tests that the network delegate can block and redirect a request to a new 2920// URL. 2921TEST_F(URLRequestTestHTTP, NetworkDelegateRedirectRequest) { 2922 ASSERT_TRUE(test_server_.Start()); 2923 2924 TestDelegate d; 2925 BlockingNetworkDelegate network_delegate( 2926 BlockingNetworkDelegate::AUTO_CALLBACK); 2927 network_delegate.set_block_on(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST); 2928 GURL redirect_url(test_server_.GetURL("simple.html")); 2929 network_delegate.set_redirect_url(redirect_url); 2930 2931 TestURLRequestContextWithProxy context( 2932 test_server_.host_port_pair().ToString(), &network_delegate); 2933 2934 { 2935 GURL original_url(test_server_.GetURL("empty.html")); 2936 URLRequest r(original_url, DEFAULT_PRIORITY, &d, &context); 2937 2938 r.Start(); 2939 base::RunLoop().Run(); 2940 2941 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 2942 EXPECT_EQ(0, r.status().error()); 2943 EXPECT_EQ(redirect_url, r.url()); 2944 EXPECT_EQ(original_url, r.original_url()); 2945 EXPECT_EQ(2U, r.url_chain().size()); 2946 EXPECT_EQ(1, network_delegate.created_requests()); 2947 EXPECT_EQ(0, network_delegate.destroyed_requests()); 2948 } 2949 EXPECT_EQ(1, network_delegate.destroyed_requests()); 2950} 2951 2952// Tests that the network delegate can block and redirect a request to a new 2953// URL by setting a redirect_url and returning in OnBeforeURLRequest directly. 2954TEST_F(URLRequestTestHTTP, NetworkDelegateRedirectRequestSynchronously) { 2955 ASSERT_TRUE(test_server_.Start()); 2956 2957 TestDelegate d; 2958 BlockingNetworkDelegate network_delegate( 2959 BlockingNetworkDelegate::SYNCHRONOUS); 2960 GURL redirect_url(test_server_.GetURL("simple.html")); 2961 network_delegate.set_redirect_url(redirect_url); 2962 2963 TestURLRequestContextWithProxy context( 2964 test_server_.host_port_pair().ToString(), &network_delegate); 2965 2966 { 2967 GURL original_url(test_server_.GetURL("empty.html")); 2968 URLRequest r(original_url, DEFAULT_PRIORITY, &d, &context); 2969 2970 r.Start(); 2971 base::RunLoop().Run(); 2972 2973 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 2974 EXPECT_EQ(0, r.status().error()); 2975 EXPECT_EQ(redirect_url, r.url()); 2976 EXPECT_EQ(original_url, r.original_url()); 2977 EXPECT_EQ(2U, r.url_chain().size()); 2978 EXPECT_EQ(1, network_delegate.created_requests()); 2979 EXPECT_EQ(0, network_delegate.destroyed_requests()); 2980 } 2981 EXPECT_EQ(1, network_delegate.destroyed_requests()); 2982} 2983 2984// Tests that redirects caused by the network delegate preserve POST data. 2985TEST_F(URLRequestTestHTTP, NetworkDelegateRedirectRequestPost) { 2986 ASSERT_TRUE(test_server_.Start()); 2987 2988 const char kData[] = "hello world"; 2989 2990 TestDelegate d; 2991 BlockingNetworkDelegate network_delegate( 2992 BlockingNetworkDelegate::AUTO_CALLBACK); 2993 network_delegate.set_block_on(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST); 2994 GURL redirect_url(test_server_.GetURL("echo")); 2995 network_delegate.set_redirect_url(redirect_url); 2996 2997 TestURLRequestContext context(true); 2998 context.set_network_delegate(&network_delegate); 2999 context.Init(); 3000 3001 { 3002 GURL original_url(test_server_.GetURL("empty.html")); 3003 URLRequest r(original_url, DEFAULT_PRIORITY, &d, &context); 3004 r.set_method("POST"); 3005 r.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData))); 3006 HttpRequestHeaders headers; 3007 headers.SetHeader(HttpRequestHeaders::kContentLength, 3008 base::UintToString(arraysize(kData) - 1)); 3009 r.SetExtraRequestHeaders(headers); 3010 r.Start(); 3011 base::RunLoop().Run(); 3012 3013 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 3014 EXPECT_EQ(0, r.status().error()); 3015 EXPECT_EQ(redirect_url, r.url()); 3016 EXPECT_EQ(original_url, r.original_url()); 3017 EXPECT_EQ(2U, r.url_chain().size()); 3018 EXPECT_EQ(1, network_delegate.created_requests()); 3019 EXPECT_EQ(0, network_delegate.destroyed_requests()); 3020 EXPECT_EQ("POST", r.method()); 3021 EXPECT_EQ(kData, d.data_received()); 3022 } 3023 EXPECT_EQ(1, network_delegate.destroyed_requests()); 3024} 3025 3026// Tests that the network delegate can block and redirect a request to a new 3027// URL during OnHeadersReceived. 3028TEST_F(URLRequestTestHTTP, NetworkDelegateRedirectRequestOnHeadersReceived) { 3029 ASSERT_TRUE(test_server_.Start()); 3030 3031 TestDelegate d; 3032 BlockingNetworkDelegate network_delegate( 3033 BlockingNetworkDelegate::AUTO_CALLBACK); 3034 network_delegate.set_block_on(BlockingNetworkDelegate::ON_HEADERS_RECEIVED); 3035 GURL redirect_url(test_server_.GetURL("simple.html")); 3036 network_delegate.set_redirect_on_headers_received_url(redirect_url); 3037 3038 TestURLRequestContextWithProxy context( 3039 test_server_.host_port_pair().ToString(), &network_delegate); 3040 3041 { 3042 GURL original_url(test_server_.GetURL("empty.html")); 3043 URLRequest r(original_url, DEFAULT_PRIORITY, &d, &context); 3044 3045 r.Start(); 3046 base::RunLoop().Run(); 3047 3048 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 3049 EXPECT_EQ(net::OK, r.status().error()); 3050 EXPECT_EQ(redirect_url, r.url()); 3051 EXPECT_EQ(original_url, r.original_url()); 3052 EXPECT_EQ(2U, r.url_chain().size()); 3053 EXPECT_EQ(2, network_delegate.created_requests()); 3054 EXPECT_EQ(0, network_delegate.destroyed_requests()); 3055 } 3056 EXPECT_EQ(1, network_delegate.destroyed_requests()); 3057} 3058 3059// Tests that the network delegate can synchronously complete OnAuthRequired 3060// by taking no action. This indicates that the NetworkDelegate does not want to 3061// handle the challenge, and is passing the buck along to the 3062// URLRequest::Delegate. 3063TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredSyncNoAction) { 3064 ASSERT_TRUE(test_server_.Start()); 3065 3066 TestDelegate d; 3067 BlockingNetworkDelegate network_delegate( 3068 BlockingNetworkDelegate::SYNCHRONOUS); 3069 3070 TestURLRequestContext context(true); 3071 context.set_network_delegate(&network_delegate); 3072 context.Init(); 3073 3074 d.set_credentials(AuthCredentials(kUser, kSecret)); 3075 3076 { 3077 GURL url(test_server_.GetURL("auth-basic")); 3078 URLRequest r(url, DEFAULT_PRIORITY, &d, &context); 3079 r.Start(); 3080 3081 base::RunLoop().Run(); 3082 3083 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 3084 EXPECT_EQ(0, r.status().error()); 3085 EXPECT_EQ(200, r.GetResponseCode()); 3086 EXPECT_TRUE(d.auth_required_called()); 3087 EXPECT_EQ(1, network_delegate.created_requests()); 3088 EXPECT_EQ(0, network_delegate.destroyed_requests()); 3089 } 3090 EXPECT_EQ(1, network_delegate.destroyed_requests()); 3091} 3092 3093TEST_F(URLRequestTestHTTP, 3094 NetworkDelegateOnAuthRequiredSyncNoAction_GetFullRequestHeaders) { 3095 ASSERT_TRUE(test_server_.Start()); 3096 3097 TestDelegate d; 3098 BlockingNetworkDelegate network_delegate( 3099 BlockingNetworkDelegate::SYNCHRONOUS); 3100 3101 TestURLRequestContext context(true); 3102 context.set_network_delegate(&network_delegate); 3103 context.Init(); 3104 3105 d.set_credentials(AuthCredentials(kUser, kSecret)); 3106 3107 { 3108 GURL url(test_server_.GetURL("auth-basic")); 3109 URLRequest r(url, DEFAULT_PRIORITY, &d, &context); 3110 r.Start(); 3111 3112 { 3113 HttpRequestHeaders headers; 3114 EXPECT_TRUE(r.GetFullRequestHeaders(&headers)); 3115 EXPECT_FALSE(headers.HasHeader("Authorization")); 3116 } 3117 3118 base::RunLoop().Run(); 3119 3120 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 3121 EXPECT_EQ(0, r.status().error()); 3122 EXPECT_EQ(200, r.GetResponseCode()); 3123 EXPECT_TRUE(d.auth_required_called()); 3124 EXPECT_EQ(1, network_delegate.created_requests()); 3125 EXPECT_EQ(0, network_delegate.destroyed_requests()); 3126 } 3127 EXPECT_EQ(1, network_delegate.destroyed_requests()); 3128} 3129 3130// Tests that the network delegate can synchronously complete OnAuthRequired 3131// by setting credentials. 3132TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredSyncSetAuth) { 3133 ASSERT_TRUE(test_server_.Start()); 3134 3135 TestDelegate d; 3136 BlockingNetworkDelegate network_delegate( 3137 BlockingNetworkDelegate::SYNCHRONOUS); 3138 network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED); 3139 network_delegate.set_auth_retval( 3140 NetworkDelegate::AUTH_REQUIRED_RESPONSE_SET_AUTH); 3141 3142 network_delegate.set_auth_credentials(AuthCredentials(kUser, kSecret)); 3143 3144 TestURLRequestContext context(true); 3145 context.set_network_delegate(&network_delegate); 3146 context.Init(); 3147 3148 { 3149 GURL url(test_server_.GetURL("auth-basic")); 3150 URLRequest r(url, DEFAULT_PRIORITY, &d, &context); 3151 r.Start(); 3152 base::RunLoop().Run(); 3153 3154 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 3155 EXPECT_EQ(0, r.status().error()); 3156 EXPECT_EQ(200, r.GetResponseCode()); 3157 EXPECT_FALSE(d.auth_required_called()); 3158 EXPECT_EQ(1, network_delegate.created_requests()); 3159 EXPECT_EQ(0, network_delegate.destroyed_requests()); 3160 } 3161 EXPECT_EQ(1, network_delegate.destroyed_requests()); 3162} 3163 3164// Same as above, but also tests that GetFullRequestHeaders returns the proper 3165// headers (for the first or second request) when called at the proper times. 3166TEST_F(URLRequestTestHTTP, 3167 NetworkDelegateOnAuthRequiredSyncSetAuth_GetFullRequestHeaders) { 3168 ASSERT_TRUE(test_server_.Start()); 3169 3170 TestDelegate d; 3171 BlockingNetworkDelegate network_delegate( 3172 BlockingNetworkDelegate::SYNCHRONOUS); 3173 network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED); 3174 network_delegate.set_auth_retval( 3175 NetworkDelegate::AUTH_REQUIRED_RESPONSE_SET_AUTH); 3176 3177 network_delegate.set_auth_credentials(AuthCredentials(kUser, kSecret)); 3178 3179 TestURLRequestContext context(true); 3180 context.set_network_delegate(&network_delegate); 3181 context.Init(); 3182 3183 { 3184 GURL url(test_server_.GetURL("auth-basic")); 3185 URLRequest r(url, DEFAULT_PRIORITY, &d, &context); 3186 r.Start(); 3187 base::RunLoop().Run(); 3188 3189 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 3190 EXPECT_EQ(0, r.status().error()); 3191 EXPECT_EQ(200, r.GetResponseCode()); 3192 EXPECT_FALSE(d.auth_required_called()); 3193 EXPECT_EQ(1, network_delegate.created_requests()); 3194 EXPECT_EQ(0, network_delegate.destroyed_requests()); 3195 3196 { 3197 HttpRequestHeaders headers; 3198 EXPECT_TRUE(r.GetFullRequestHeaders(&headers)); 3199 EXPECT_TRUE(headers.HasHeader("Authorization")); 3200 } 3201 } 3202 EXPECT_EQ(1, network_delegate.destroyed_requests()); 3203} 3204 3205// Tests that the network delegate can synchronously complete OnAuthRequired 3206// by cancelling authentication. 3207TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredSyncCancel) { 3208 ASSERT_TRUE(test_server_.Start()); 3209 3210 TestDelegate d; 3211 BlockingNetworkDelegate network_delegate( 3212 BlockingNetworkDelegate::SYNCHRONOUS); 3213 network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED); 3214 network_delegate.set_auth_retval( 3215 NetworkDelegate::AUTH_REQUIRED_RESPONSE_CANCEL_AUTH); 3216 3217 TestURLRequestContext context(true); 3218 context.set_network_delegate(&network_delegate); 3219 context.Init(); 3220 3221 { 3222 GURL url(test_server_.GetURL("auth-basic")); 3223 URLRequest r(url, DEFAULT_PRIORITY, &d, &context); 3224 r.Start(); 3225 base::RunLoop().Run(); 3226 3227 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 3228 EXPECT_EQ(OK, r.status().error()); 3229 EXPECT_EQ(401, r.GetResponseCode()); 3230 EXPECT_FALSE(d.auth_required_called()); 3231 EXPECT_EQ(1, network_delegate.created_requests()); 3232 EXPECT_EQ(0, network_delegate.destroyed_requests()); 3233 } 3234 EXPECT_EQ(1, network_delegate.destroyed_requests()); 3235} 3236 3237// Tests that the network delegate can asynchronously complete OnAuthRequired 3238// by taking no action. This indicates that the NetworkDelegate does not want 3239// to handle the challenge, and is passing the buck along to the 3240// URLRequest::Delegate. 3241TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredAsyncNoAction) { 3242 ASSERT_TRUE(test_server_.Start()); 3243 3244 TestDelegate d; 3245 BlockingNetworkDelegate network_delegate( 3246 BlockingNetworkDelegate::AUTO_CALLBACK); 3247 network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED); 3248 3249 TestURLRequestContext context(true); 3250 context.set_network_delegate(&network_delegate); 3251 context.Init(); 3252 3253 d.set_credentials(AuthCredentials(kUser, kSecret)); 3254 3255 { 3256 GURL url(test_server_.GetURL("auth-basic")); 3257 URLRequest r(url, DEFAULT_PRIORITY, &d, &context); 3258 r.Start(); 3259 base::RunLoop().Run(); 3260 3261 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 3262 EXPECT_EQ(0, r.status().error()); 3263 EXPECT_EQ(200, r.GetResponseCode()); 3264 EXPECT_TRUE(d.auth_required_called()); 3265 EXPECT_EQ(1, network_delegate.created_requests()); 3266 EXPECT_EQ(0, network_delegate.destroyed_requests()); 3267 } 3268 EXPECT_EQ(1, network_delegate.destroyed_requests()); 3269} 3270 3271// Tests that the network delegate can asynchronously complete OnAuthRequired 3272// by setting credentials. 3273TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredAsyncSetAuth) { 3274 ASSERT_TRUE(test_server_.Start()); 3275 3276 TestDelegate d; 3277 BlockingNetworkDelegate network_delegate( 3278 BlockingNetworkDelegate::AUTO_CALLBACK); 3279 network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED); 3280 network_delegate.set_auth_retval( 3281 NetworkDelegate::AUTH_REQUIRED_RESPONSE_SET_AUTH); 3282 3283 AuthCredentials auth_credentials(kUser, kSecret); 3284 network_delegate.set_auth_credentials(auth_credentials); 3285 3286 TestURLRequestContext context(true); 3287 context.set_network_delegate(&network_delegate); 3288 context.Init(); 3289 3290 { 3291 GURL url(test_server_.GetURL("auth-basic")); 3292 URLRequest r(url, DEFAULT_PRIORITY, &d, &context); 3293 r.Start(); 3294 base::RunLoop().Run(); 3295 3296 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 3297 EXPECT_EQ(0, r.status().error()); 3298 3299 EXPECT_EQ(200, r.GetResponseCode()); 3300 EXPECT_FALSE(d.auth_required_called()); 3301 EXPECT_EQ(1, network_delegate.created_requests()); 3302 EXPECT_EQ(0, network_delegate.destroyed_requests()); 3303 } 3304 EXPECT_EQ(1, network_delegate.destroyed_requests()); 3305} 3306 3307// Tests that the network delegate can asynchronously complete OnAuthRequired 3308// by cancelling authentication. 3309TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredAsyncCancel) { 3310 ASSERT_TRUE(test_server_.Start()); 3311 3312 TestDelegate d; 3313 BlockingNetworkDelegate network_delegate( 3314 BlockingNetworkDelegate::AUTO_CALLBACK); 3315 network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED); 3316 network_delegate.set_auth_retval( 3317 NetworkDelegate::AUTH_REQUIRED_RESPONSE_CANCEL_AUTH); 3318 3319 TestURLRequestContext context(true); 3320 context.set_network_delegate(&network_delegate); 3321 context.Init(); 3322 3323 { 3324 GURL url(test_server_.GetURL("auth-basic")); 3325 URLRequest r(url, DEFAULT_PRIORITY, &d, &context); 3326 r.Start(); 3327 base::RunLoop().Run(); 3328 3329 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 3330 EXPECT_EQ(OK, r.status().error()); 3331 EXPECT_EQ(401, r.GetResponseCode()); 3332 EXPECT_FALSE(d.auth_required_called()); 3333 EXPECT_EQ(1, network_delegate.created_requests()); 3334 EXPECT_EQ(0, network_delegate.destroyed_requests()); 3335 } 3336 EXPECT_EQ(1, network_delegate.destroyed_requests()); 3337} 3338 3339// Tests that we can handle when a network request was canceled while we were 3340// waiting for the network delegate. 3341// Part 1: Request is cancelled while waiting for OnBeforeURLRequest callback. 3342TEST_F(URLRequestTestHTTP, NetworkDelegateCancelWhileWaiting1) { 3343 ASSERT_TRUE(test_server_.Start()); 3344 3345 TestDelegate d; 3346 BlockingNetworkDelegate network_delegate( 3347 BlockingNetworkDelegate::USER_CALLBACK); 3348 network_delegate.set_block_on(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST); 3349 3350 TestURLRequestContext context(true); 3351 context.set_network_delegate(&network_delegate); 3352 context.Init(); 3353 3354 { 3355 URLRequest r( 3356 test_server_.GetURL(std::string()), DEFAULT_PRIORITY, &d, &context); 3357 3358 r.Start(); 3359 base::RunLoop().Run(); 3360 EXPECT_EQ(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST, 3361 network_delegate.stage_blocked_for_callback()); 3362 EXPECT_EQ(0, network_delegate.completed_requests()); 3363 // Cancel before callback. 3364 r.Cancel(); 3365 // Ensure that network delegate is notified. 3366 EXPECT_EQ(1, network_delegate.completed_requests()); 3367 EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status()); 3368 EXPECT_EQ(ERR_ABORTED, r.status().error()); 3369 EXPECT_EQ(1, network_delegate.created_requests()); 3370 EXPECT_EQ(0, network_delegate.destroyed_requests()); 3371 } 3372 EXPECT_EQ(1, network_delegate.destroyed_requests()); 3373} 3374 3375// Tests that we can handle when a network request was canceled while we were 3376// waiting for the network delegate. 3377// Part 2: Request is cancelled while waiting for OnBeforeSendHeaders callback. 3378TEST_F(URLRequestTestHTTP, NetworkDelegateCancelWhileWaiting2) { 3379 ASSERT_TRUE(test_server_.Start()); 3380 3381 TestDelegate d; 3382 BlockingNetworkDelegate network_delegate( 3383 BlockingNetworkDelegate::USER_CALLBACK); 3384 network_delegate.set_block_on( 3385 BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS); 3386 3387 TestURLRequestContext context(true); 3388 context.set_network_delegate(&network_delegate); 3389 context.Init(); 3390 3391 { 3392 URLRequest r( 3393 test_server_.GetURL(std::string()), DEFAULT_PRIORITY, &d, &context); 3394 3395 r.Start(); 3396 base::RunLoop().Run(); 3397 EXPECT_EQ(BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS, 3398 network_delegate.stage_blocked_for_callback()); 3399 EXPECT_EQ(0, network_delegate.completed_requests()); 3400 // Cancel before callback. 3401 r.Cancel(); 3402 // Ensure that network delegate is notified. 3403 EXPECT_EQ(1, network_delegate.completed_requests()); 3404 EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status()); 3405 EXPECT_EQ(ERR_ABORTED, r.status().error()); 3406 EXPECT_EQ(1, network_delegate.created_requests()); 3407 EXPECT_EQ(0, network_delegate.destroyed_requests()); 3408 } 3409 EXPECT_EQ(1, network_delegate.destroyed_requests()); 3410} 3411 3412// Tests that we can handle when a network request was canceled while we were 3413// waiting for the network delegate. 3414// Part 3: Request is cancelled while waiting for OnHeadersReceived callback. 3415TEST_F(URLRequestTestHTTP, NetworkDelegateCancelWhileWaiting3) { 3416 ASSERT_TRUE(test_server_.Start()); 3417 3418 TestDelegate d; 3419 BlockingNetworkDelegate network_delegate( 3420 BlockingNetworkDelegate::USER_CALLBACK); 3421 network_delegate.set_block_on(BlockingNetworkDelegate::ON_HEADERS_RECEIVED); 3422 3423 TestURLRequestContext context(true); 3424 context.set_network_delegate(&network_delegate); 3425 context.Init(); 3426 3427 { 3428 URLRequest r( 3429 test_server_.GetURL(std::string()), DEFAULT_PRIORITY, &d, &context); 3430 3431 r.Start(); 3432 base::RunLoop().Run(); 3433 EXPECT_EQ(BlockingNetworkDelegate::ON_HEADERS_RECEIVED, 3434 network_delegate.stage_blocked_for_callback()); 3435 EXPECT_EQ(0, network_delegate.completed_requests()); 3436 // Cancel before callback. 3437 r.Cancel(); 3438 // Ensure that network delegate is notified. 3439 EXPECT_EQ(1, network_delegate.completed_requests()); 3440 EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status()); 3441 EXPECT_EQ(ERR_ABORTED, r.status().error()); 3442 EXPECT_EQ(1, network_delegate.created_requests()); 3443 EXPECT_EQ(0, network_delegate.destroyed_requests()); 3444 } 3445 EXPECT_EQ(1, network_delegate.destroyed_requests()); 3446} 3447 3448// Tests that we can handle when a network request was canceled while we were 3449// waiting for the network delegate. 3450// Part 4: Request is cancelled while waiting for OnAuthRequired callback. 3451TEST_F(URLRequestTestHTTP, NetworkDelegateCancelWhileWaiting4) { 3452 ASSERT_TRUE(test_server_.Start()); 3453 3454 TestDelegate d; 3455 BlockingNetworkDelegate network_delegate( 3456 BlockingNetworkDelegate::USER_CALLBACK); 3457 network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED); 3458 3459 TestURLRequestContext context(true); 3460 context.set_network_delegate(&network_delegate); 3461 context.Init(); 3462 3463 { 3464 URLRequest r( 3465 test_server_.GetURL("auth-basic"), DEFAULT_PRIORITY, &d, &context); 3466 3467 r.Start(); 3468 base::RunLoop().Run(); 3469 EXPECT_EQ(BlockingNetworkDelegate::ON_AUTH_REQUIRED, 3470 network_delegate.stage_blocked_for_callback()); 3471 EXPECT_EQ(0, network_delegate.completed_requests()); 3472 // Cancel before callback. 3473 r.Cancel(); 3474 // Ensure that network delegate is notified. 3475 EXPECT_EQ(1, network_delegate.completed_requests()); 3476 EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status()); 3477 EXPECT_EQ(ERR_ABORTED, r.status().error()); 3478 EXPECT_EQ(1, network_delegate.created_requests()); 3479 EXPECT_EQ(0, network_delegate.destroyed_requests()); 3480 } 3481 EXPECT_EQ(1, network_delegate.destroyed_requests()); 3482} 3483 3484// In this unit test, we're using the HTTPTestServer as a proxy server and 3485// issuing a CONNECT request with the magic host name "www.server-auth.com". 3486// The HTTPTestServer will return a 401 response, which we should balk at. 3487TEST_F(URLRequestTestHTTP, UnexpectedServerAuthTest) { 3488 ASSERT_TRUE(test_server_.Start()); 3489 3490 TestNetworkDelegate network_delegate; // Must outlive URLRequest. 3491 TestURLRequestContextWithProxy context( 3492 test_server_.host_port_pair().ToString(), &network_delegate); 3493 3494 TestDelegate d; 3495 { 3496 URLRequest r( 3497 GURL("https://www.server-auth.com/"), DEFAULT_PRIORITY, &d, &context); 3498 3499 r.Start(); 3500 EXPECT_TRUE(r.is_pending()); 3501 3502 base::RunLoop().Run(); 3503 3504 EXPECT_EQ(URLRequestStatus::FAILED, r.status().status()); 3505 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, r.status().error()); 3506 } 3507} 3508 3509TEST_F(URLRequestTestHTTP, GetTest_NoCache) { 3510 ASSERT_TRUE(test_server_.Start()); 3511 3512 TestDelegate d; 3513 { 3514 URLRequest r(test_server_.GetURL(std::string()), 3515 DEFAULT_PRIORITY, 3516 &d, 3517 &default_context_); 3518 3519 r.Start(); 3520 EXPECT_TRUE(r.is_pending()); 3521 3522 base::RunLoop().Run(); 3523 3524 EXPECT_EQ(1, d.response_started_count()); 3525 EXPECT_FALSE(d.received_data_before_response()); 3526 EXPECT_NE(0, d.bytes_received()); 3527 EXPECT_EQ(test_server_.host_port_pair().host(), 3528 r.GetSocketAddress().host()); 3529 EXPECT_EQ(test_server_.host_port_pair().port(), 3530 r.GetSocketAddress().port()); 3531 3532 // TODO(eroman): Add back the NetLog tests... 3533 } 3534} 3535 3536// This test has the server send a large number of cookies to the client. 3537// To ensure that no number of cookies causes a crash, a galloping binary 3538// search is used to estimate that maximum number of cookies that are accepted 3539// by the browser. Beyond the maximum number, the request will fail with 3540// ERR_RESPONSE_HEADERS_TOO_BIG. 3541#if defined(OS_WIN) 3542// http://crbug.com/177916 3543#define MAYBE_GetTest_ManyCookies DISABLED_GetTest_ManyCookies 3544#else 3545#define MAYBE_GetTest_ManyCookies GetTest_ManyCookies 3546#endif // defined(OS_WIN) 3547TEST_F(URLRequestTestHTTP, MAYBE_GetTest_ManyCookies) { 3548 ASSERT_TRUE(test_server_.Start()); 3549 3550 int lower_bound = 0; 3551 int upper_bound = 1; 3552 3553 // Double the number of cookies until the response header limits are 3554 // exceeded. 3555 while (DoManyCookiesRequest(upper_bound)) { 3556 lower_bound = upper_bound; 3557 upper_bound *= 2; 3558 ASSERT_LT(upper_bound, 1000000); 3559 } 3560 3561 int tolerance = upper_bound * 0.005; 3562 if (tolerance < 2) 3563 tolerance = 2; 3564 3565 // Perform a binary search to find the highest possible number of cookies, 3566 // within the desired tolerance. 3567 while (upper_bound - lower_bound >= tolerance) { 3568 int num_cookies = (lower_bound + upper_bound) / 2; 3569 3570 if (DoManyCookiesRequest(num_cookies)) 3571 lower_bound = num_cookies; 3572 else 3573 upper_bound = num_cookies; 3574 } 3575 // Success: the test did not crash. 3576} 3577 3578TEST_F(URLRequestTestHTTP, GetTest) { 3579 ASSERT_TRUE(test_server_.Start()); 3580 3581 TestDelegate d; 3582 { 3583 URLRequest r(test_server_.GetURL(std::string()), 3584 DEFAULT_PRIORITY, 3585 &d, 3586 &default_context_); 3587 3588 r.Start(); 3589 EXPECT_TRUE(r.is_pending()); 3590 3591 base::RunLoop().Run(); 3592 3593 EXPECT_EQ(1, d.response_started_count()); 3594 EXPECT_FALSE(d.received_data_before_response()); 3595 EXPECT_NE(0, d.bytes_received()); 3596 EXPECT_EQ(test_server_.host_port_pair().host(), 3597 r.GetSocketAddress().host()); 3598 EXPECT_EQ(test_server_.host_port_pair().port(), 3599 r.GetSocketAddress().port()); 3600 } 3601} 3602 3603TEST_F(URLRequestTestHTTP, GetTest_GetFullRequestHeaders) { 3604 ASSERT_TRUE(test_server_.Start()); 3605 3606 TestDelegate d; 3607 { 3608 GURL test_url(test_server_.GetURL(std::string())); 3609 URLRequest r(test_url, DEFAULT_PRIORITY, &d, &default_context_); 3610 3611 HttpRequestHeaders headers; 3612 EXPECT_FALSE(r.GetFullRequestHeaders(&headers)); 3613 3614 r.Start(); 3615 EXPECT_TRUE(r.is_pending()); 3616 3617 base::RunLoop().Run(); 3618 3619 EXPECT_EQ(1, d.response_started_count()); 3620 EXPECT_FALSE(d.received_data_before_response()); 3621 EXPECT_NE(0, d.bytes_received()); 3622 EXPECT_EQ(test_server_.host_port_pair().host(), 3623 r.GetSocketAddress().host()); 3624 EXPECT_EQ(test_server_.host_port_pair().port(), 3625 r.GetSocketAddress().port()); 3626 3627 EXPECT_TRUE(d.have_full_request_headers()); 3628 CheckFullRequestHeaders(d.full_request_headers(), test_url); 3629 } 3630} 3631 3632TEST_F(URLRequestTestHTTP, GetTestLoadTiming) { 3633 ASSERT_TRUE(test_server_.Start()); 3634 3635 TestDelegate d; 3636 { 3637 URLRequest r(test_server_.GetURL(std::string()), 3638 DEFAULT_PRIORITY, 3639 &d, 3640 &default_context_); 3641 3642 r.Start(); 3643 EXPECT_TRUE(r.is_pending()); 3644 3645 base::RunLoop().Run(); 3646 3647 LoadTimingInfo load_timing_info; 3648 r.GetLoadTimingInfo(&load_timing_info); 3649 TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES); 3650 3651 EXPECT_EQ(1, d.response_started_count()); 3652 EXPECT_FALSE(d.received_data_before_response()); 3653 EXPECT_NE(0, d.bytes_received()); 3654 EXPECT_EQ(test_server_.host_port_pair().host(), 3655 r.GetSocketAddress().host()); 3656 EXPECT_EQ(test_server_.host_port_pair().port(), 3657 r.GetSocketAddress().port()); 3658 } 3659} 3660 3661TEST_F(URLRequestTestHTTP, GetZippedTest) { 3662 ASSERT_TRUE(test_server_.Start()); 3663 3664 // Parameter that specifies the Content-Length field in the response: 3665 // C - Compressed length. 3666 // U - Uncompressed length. 3667 // L - Large length (larger than both C & U). 3668 // M - Medium length (between C & U). 3669 // S - Small length (smaller than both C & U). 3670 const char test_parameters[] = "CULMS"; 3671 const int num_tests = arraysize(test_parameters)- 1; // Skip NULL. 3672 // C & U should be OK. 3673 // L & M are larger than the data sent, and show an error. 3674 // S has too little data, but we seem to accept it. 3675 const bool test_expect_success[num_tests] = 3676 { true, true, false, false, true }; 3677 3678 for (int i = 0; i < num_tests ; i++) { 3679 TestDelegate d; 3680 { 3681 std::string test_file = 3682 base::StringPrintf("compressedfiles/BullRunSpeech.txt?%c", 3683 test_parameters[i]); 3684 3685 TestNetworkDelegate network_delegate; // Must outlive URLRequest. 3686 TestURLRequestContext context(true); 3687 context.set_network_delegate(&network_delegate); 3688 context.Init(); 3689 3690 URLRequest r( 3691 test_server_.GetURL(test_file), DEFAULT_PRIORITY, &d, &context); 3692 r.Start(); 3693 EXPECT_TRUE(r.is_pending()); 3694 3695 base::RunLoop().Run(); 3696 3697 EXPECT_EQ(1, d.response_started_count()); 3698 EXPECT_FALSE(d.received_data_before_response()); 3699 VLOG(1) << " Received " << d.bytes_received() << " bytes" 3700 << " status = " << r.status().status() 3701 << " error = " << r.status().error(); 3702 if (test_expect_success[i]) { 3703 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()) 3704 << " Parameter = \"" << test_file << "\""; 3705 } else { 3706 EXPECT_EQ(URLRequestStatus::FAILED, r.status().status()); 3707 EXPECT_EQ(ERR_CONTENT_LENGTH_MISMATCH, r.status().error()) 3708 << " Parameter = \"" << test_file << "\""; 3709 } 3710 } 3711 } 3712} 3713 3714TEST_F(URLRequestTestHTTP, HTTPSToHTTPRedirectNoRefererTest) { 3715 ASSERT_TRUE(test_server_.Start()); 3716 3717 SpawnedTestServer https_test_server( 3718 SpawnedTestServer::TYPE_HTTPS, SpawnedTestServer::kLocalhost, 3719 base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 3720 ASSERT_TRUE(https_test_server.Start()); 3721 3722 // An https server is sent a request with an https referer, 3723 // and responds with a redirect to an http url. The http 3724 // server should not be sent the referer. 3725 GURL http_destination = test_server_.GetURL(std::string()); 3726 TestDelegate d; 3727 URLRequest req( 3728 https_test_server.GetURL("server-redirect?" + http_destination.spec()), 3729 DEFAULT_PRIORITY, 3730 &d, 3731 &default_context_); 3732 req.SetReferrer("https://www.referrer.com/"); 3733 req.Start(); 3734 base::RunLoop().Run(); 3735 3736 EXPECT_EQ(1, d.response_started_count()); 3737 EXPECT_EQ(1, d.received_redirect_count()); 3738 EXPECT_EQ(http_destination, req.url()); 3739 EXPECT_EQ(std::string(), req.referrer()); 3740} 3741 3742TEST_F(URLRequestTestHTTP, RedirectLoadTiming) { 3743 ASSERT_TRUE(test_server_.Start()); 3744 3745 GURL destination_url = test_server_.GetURL(std::string()); 3746 GURL original_url = 3747 test_server_.GetURL("server-redirect?" + destination_url.spec()); 3748 TestDelegate d; 3749 URLRequest req(original_url, DEFAULT_PRIORITY, &d, &default_context_); 3750 req.Start(); 3751 base::RunLoop().Run(); 3752 3753 EXPECT_EQ(1, d.response_started_count()); 3754 EXPECT_EQ(1, d.received_redirect_count()); 3755 EXPECT_EQ(destination_url, req.url()); 3756 EXPECT_EQ(original_url, req.original_url()); 3757 ASSERT_EQ(2U, req.url_chain().size()); 3758 EXPECT_EQ(original_url, req.url_chain()[0]); 3759 EXPECT_EQ(destination_url, req.url_chain()[1]); 3760 3761 LoadTimingInfo load_timing_info_before_redirect; 3762 EXPECT_TRUE(default_network_delegate_.GetLoadTimingInfoBeforeRedirect( 3763 &load_timing_info_before_redirect)); 3764 TestLoadTimingNotReused(load_timing_info_before_redirect, 3765 CONNECT_TIMING_HAS_DNS_TIMES); 3766 3767 LoadTimingInfo load_timing_info; 3768 req.GetLoadTimingInfo(&load_timing_info); 3769 TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES); 3770 3771 // Check that a new socket was used on redirect, since the server does not 3772 // supposed keep-alive sockets, and that the times before the redirect are 3773 // before the ones recorded for the second request. 3774 EXPECT_NE(load_timing_info_before_redirect.socket_log_id, 3775 load_timing_info.socket_log_id); 3776 EXPECT_LE(load_timing_info_before_redirect.receive_headers_end, 3777 load_timing_info.connect_timing.connect_start); 3778} 3779 3780TEST_F(URLRequestTestHTTP, MultipleRedirectTest) { 3781 ASSERT_TRUE(test_server_.Start()); 3782 3783 GURL destination_url = test_server_.GetURL(std::string()); 3784 GURL middle_redirect_url = 3785 test_server_.GetURL("server-redirect?" + destination_url.spec()); 3786 GURL original_url = test_server_.GetURL( 3787 "server-redirect?" + middle_redirect_url.spec()); 3788 TestDelegate d; 3789 URLRequest req(original_url, DEFAULT_PRIORITY, &d, &default_context_); 3790 req.Start(); 3791 base::RunLoop().Run(); 3792 3793 EXPECT_EQ(1, d.response_started_count()); 3794 EXPECT_EQ(2, d.received_redirect_count()); 3795 EXPECT_EQ(destination_url, req.url()); 3796 EXPECT_EQ(original_url, req.original_url()); 3797 ASSERT_EQ(3U, req.url_chain().size()); 3798 EXPECT_EQ(original_url, req.url_chain()[0]); 3799 EXPECT_EQ(middle_redirect_url, req.url_chain()[1]); 3800 EXPECT_EQ(destination_url, req.url_chain()[2]); 3801} 3802 3803// First and second pieces of information logged by delegates to URLRequests. 3804const char kFirstDelegateInfo[] = "Wonderful delegate"; 3805const char kSecondDelegateInfo[] = "Exciting delegate"; 3806 3807// Logs delegate information to a URLRequest. The first string is logged 3808// synchronously on Start(), using DELEGATE_INFO_DEBUG_ONLY. The second is 3809// logged asynchronously, using DELEGATE_INFO_DISPLAY_TO_USER. Then 3810// another asynchronous call is used to clear the delegate information 3811// before calling a callback. The object then deletes itself. 3812class AsyncDelegateLogger : public base::RefCounted<AsyncDelegateLogger> { 3813 public: 3814 typedef base::Callback<void()> Callback; 3815 3816 // Each time delegate information is added to the URLRequest, the resulting 3817 // load state is checked. The expected load state after each request is 3818 // passed in as an argument. 3819 static void Run(URLRequest* url_request, 3820 LoadState expected_first_load_state, 3821 LoadState expected_second_load_state, 3822 LoadState expected_third_load_state, 3823 const Callback& callback) { 3824 AsyncDelegateLogger* logger = new AsyncDelegateLogger( 3825 url_request, 3826 expected_first_load_state, 3827 expected_second_load_state, 3828 expected_third_load_state, 3829 callback); 3830 logger->Start(); 3831 } 3832 3833 // Checks that the log entries, starting with log_position, contain the 3834 // DELEGATE_INFO NetLog events that an AsyncDelegateLogger should have 3835 // recorded. Returns the index of entry after the expected number of 3836 // events this logged, or entries.size() if there aren't enough entries. 3837 static size_t CheckDelegateInfo( 3838 const CapturingNetLog::CapturedEntryList& entries, size_t log_position) { 3839 // There should be 4 DELEGATE_INFO events: Two begins and two ends. 3840 if (log_position + 3 >= entries.size()) { 3841 ADD_FAILURE() << "Not enough log entries"; 3842 return entries.size(); 3843 } 3844 std::string delegate_info; 3845 EXPECT_EQ(NetLog::TYPE_DELEGATE_INFO, entries[log_position].type); 3846 EXPECT_EQ(NetLog::PHASE_BEGIN, entries[log_position].phase); 3847 EXPECT_TRUE(entries[log_position].GetStringValue("delegate_info", 3848 &delegate_info)); 3849 EXPECT_EQ(kFirstDelegateInfo, delegate_info); 3850 3851 ++log_position; 3852 EXPECT_EQ(NetLog::TYPE_DELEGATE_INFO, entries[log_position].type); 3853 EXPECT_EQ(NetLog::PHASE_END, entries[log_position].phase); 3854 3855 ++log_position; 3856 EXPECT_EQ(NetLog::TYPE_DELEGATE_INFO, entries[log_position].type); 3857 EXPECT_EQ(NetLog::PHASE_BEGIN, entries[log_position].phase); 3858 EXPECT_TRUE(entries[log_position].GetStringValue("delegate_info", 3859 &delegate_info)); 3860 EXPECT_EQ(kSecondDelegateInfo, delegate_info); 3861 3862 ++log_position; 3863 EXPECT_EQ(NetLog::TYPE_DELEGATE_INFO, entries[log_position].type); 3864 EXPECT_EQ(NetLog::PHASE_END, entries[log_position].phase); 3865 3866 return log_position + 1; 3867 } 3868 3869 // Find delegate request begin and end messages for OnBeforeNetworkStart. 3870 // Returns the position of the end message. 3871 static size_t ExpectBeforeNetworkEvents( 3872 const CapturingNetLog::CapturedEntryList& entries, 3873 size_t log_position) { 3874 log_position = 3875 ExpectLogContainsSomewhereAfter(entries, 3876 log_position, 3877 NetLog::TYPE_URL_REQUEST_DELEGATE, 3878 NetLog::PHASE_BEGIN); 3879 EXPECT_EQ(NetLog::TYPE_URL_REQUEST_DELEGATE, 3880 entries[log_position + 1].type); 3881 EXPECT_EQ(NetLog::PHASE_END, entries[log_position + 1].phase); 3882 return log_position + 1; 3883 } 3884 3885 private: 3886 friend class base::RefCounted<AsyncDelegateLogger>; 3887 3888 AsyncDelegateLogger(URLRequest* url_request, 3889 LoadState expected_first_load_state, 3890 LoadState expected_second_load_state, 3891 LoadState expected_third_load_state, 3892 const Callback& callback) 3893 : url_request_(url_request), 3894 expected_first_load_state_(expected_first_load_state), 3895 expected_second_load_state_(expected_second_load_state), 3896 expected_third_load_state_(expected_third_load_state), 3897 callback_(callback) { 3898 } 3899 3900 ~AsyncDelegateLogger() {} 3901 3902 void Start() { 3903 url_request_->LogBlockedBy(kFirstDelegateInfo); 3904 LoadStateWithParam load_state = url_request_->GetLoadState(); 3905 EXPECT_EQ(expected_first_load_state_, load_state.state); 3906 EXPECT_NE(ASCIIToUTF16(kFirstDelegateInfo), load_state.param); 3907 base::MessageLoop::current()->PostTask( 3908 FROM_HERE, 3909 base::Bind(&AsyncDelegateLogger::LogSecondDelegate, this)); 3910 } 3911 3912 void LogSecondDelegate() { 3913 url_request_->LogAndReportBlockedBy(kSecondDelegateInfo); 3914 LoadStateWithParam load_state = url_request_->GetLoadState(); 3915 EXPECT_EQ(expected_second_load_state_, load_state.state); 3916 if (expected_second_load_state_ == LOAD_STATE_WAITING_FOR_DELEGATE) { 3917 EXPECT_EQ(ASCIIToUTF16(kSecondDelegateInfo), load_state.param); 3918 } else { 3919 EXPECT_NE(ASCIIToUTF16(kSecondDelegateInfo), load_state.param); 3920 } 3921 base::MessageLoop::current()->PostTask( 3922 FROM_HERE, 3923 base::Bind(&AsyncDelegateLogger::LogComplete, this)); 3924 } 3925 3926 void LogComplete() { 3927 url_request_->LogUnblocked(); 3928 LoadStateWithParam load_state = url_request_->GetLoadState(); 3929 EXPECT_EQ(expected_third_load_state_, load_state.state); 3930 if (expected_second_load_state_ == LOAD_STATE_WAITING_FOR_DELEGATE) 3931 EXPECT_EQ(base::string16(), load_state.param); 3932 callback_.Run(); 3933 } 3934 3935 URLRequest* url_request_; 3936 const int expected_first_load_state_; 3937 const int expected_second_load_state_; 3938 const int expected_third_load_state_; 3939 const Callback callback_; 3940 3941 DISALLOW_COPY_AND_ASSIGN(AsyncDelegateLogger); 3942}; 3943 3944// NetworkDelegate that logs delegate information before a request is started, 3945// before headers are sent, when headers are read, and when auth information 3946// is requested. Uses AsyncDelegateLogger. 3947class AsyncLoggingNetworkDelegate : public TestNetworkDelegate { 3948 public: 3949 AsyncLoggingNetworkDelegate() {} 3950 virtual ~AsyncLoggingNetworkDelegate() {} 3951 3952 // NetworkDelegate implementation. 3953 virtual int OnBeforeURLRequest(URLRequest* request, 3954 const CompletionCallback& callback, 3955 GURL* new_url) OVERRIDE { 3956 TestNetworkDelegate::OnBeforeURLRequest(request, callback, new_url); 3957 return RunCallbackAsynchronously(request, callback); 3958 } 3959 3960 virtual int OnBeforeSendHeaders(URLRequest* request, 3961 const CompletionCallback& callback, 3962 HttpRequestHeaders* headers) OVERRIDE { 3963 TestNetworkDelegate::OnBeforeSendHeaders(request, callback, headers); 3964 return RunCallbackAsynchronously(request, callback); 3965 } 3966 3967 virtual int OnHeadersReceived( 3968 URLRequest* request, 3969 const CompletionCallback& callback, 3970 const HttpResponseHeaders* original_response_headers, 3971 scoped_refptr<HttpResponseHeaders>* override_response_headers, 3972 GURL* allowed_unsafe_redirect_url) OVERRIDE { 3973 TestNetworkDelegate::OnHeadersReceived(request, 3974 callback, 3975 original_response_headers, 3976 override_response_headers, 3977 allowed_unsafe_redirect_url); 3978 return RunCallbackAsynchronously(request, callback); 3979 } 3980 3981 virtual NetworkDelegate::AuthRequiredResponse OnAuthRequired( 3982 URLRequest* request, 3983 const AuthChallengeInfo& auth_info, 3984 const AuthCallback& callback, 3985 AuthCredentials* credentials) OVERRIDE { 3986 AsyncDelegateLogger::Run( 3987 request, 3988 LOAD_STATE_WAITING_FOR_DELEGATE, 3989 LOAD_STATE_WAITING_FOR_DELEGATE, 3990 LOAD_STATE_WAITING_FOR_DELEGATE, 3991 base::Bind(&AsyncLoggingNetworkDelegate::SetAuthAndResume, 3992 callback, credentials)); 3993 return AUTH_REQUIRED_RESPONSE_IO_PENDING; 3994 } 3995 3996 private: 3997 static int RunCallbackAsynchronously( 3998 URLRequest* request, 3999 const CompletionCallback& callback) { 4000 AsyncDelegateLogger::Run( 4001 request, 4002 LOAD_STATE_WAITING_FOR_DELEGATE, 4003 LOAD_STATE_WAITING_FOR_DELEGATE, 4004 LOAD_STATE_WAITING_FOR_DELEGATE, 4005 base::Bind(callback, OK)); 4006 return ERR_IO_PENDING; 4007 } 4008 4009 static void SetAuthAndResume(const AuthCallback& callback, 4010 AuthCredentials* credentials) { 4011 *credentials = AuthCredentials(kUser, kSecret); 4012 callback.Run(NetworkDelegate::AUTH_REQUIRED_RESPONSE_SET_AUTH); 4013 } 4014 4015 DISALLOW_COPY_AND_ASSIGN(AsyncLoggingNetworkDelegate); 4016}; 4017 4018// URLRequest::Delegate that logs delegate information when the headers 4019// are received, when each read completes, and during redirects. Uses 4020// AsyncDelegateLogger. Can optionally cancel a request in any phase. 4021// 4022// Inherits from TestDelegate to reuse the TestDelegate code to handle 4023// advancing to the next step in most cases, as well as cancellation. 4024class AsyncLoggingUrlRequestDelegate : public TestDelegate { 4025 public: 4026 enum CancelStage { 4027 NO_CANCEL = 0, 4028 CANCEL_ON_RECEIVED_REDIRECT, 4029 CANCEL_ON_RESPONSE_STARTED, 4030 CANCEL_ON_READ_COMPLETED 4031 }; 4032 4033 explicit AsyncLoggingUrlRequestDelegate(CancelStage cancel_stage) 4034 : cancel_stage_(cancel_stage) { 4035 if (cancel_stage == CANCEL_ON_RECEIVED_REDIRECT) 4036 set_cancel_in_received_redirect(true); 4037 else if (cancel_stage == CANCEL_ON_RESPONSE_STARTED) 4038 set_cancel_in_response_started(true); 4039 else if (cancel_stage == CANCEL_ON_READ_COMPLETED) 4040 set_cancel_in_received_data(true); 4041 } 4042 virtual ~AsyncLoggingUrlRequestDelegate() {} 4043 4044 // URLRequest::Delegate implementation: 4045 void virtual OnReceivedRedirect(URLRequest* request, 4046 const GURL& new_url, 4047 bool* defer_redirect) OVERRIDE { 4048 *defer_redirect = true; 4049 AsyncDelegateLogger::Run( 4050 request, 4051 LOAD_STATE_WAITING_FOR_DELEGATE, 4052 LOAD_STATE_WAITING_FOR_DELEGATE, 4053 LOAD_STATE_WAITING_FOR_DELEGATE, 4054 base::Bind( 4055 &AsyncLoggingUrlRequestDelegate::OnReceivedRedirectLoggingComplete, 4056 base::Unretained(this), request, new_url)); 4057 } 4058 4059 virtual void OnResponseStarted(URLRequest* request) OVERRIDE { 4060 AsyncDelegateLogger::Run( 4061 request, 4062 LOAD_STATE_WAITING_FOR_DELEGATE, 4063 LOAD_STATE_WAITING_FOR_DELEGATE, 4064 LOAD_STATE_WAITING_FOR_DELEGATE, 4065 base::Bind( 4066 &AsyncLoggingUrlRequestDelegate::OnResponseStartedLoggingComplete, 4067 base::Unretained(this), request)); 4068 } 4069 4070 virtual void OnReadCompleted(URLRequest* request, 4071 int bytes_read) OVERRIDE { 4072 AsyncDelegateLogger::Run( 4073 request, 4074 LOAD_STATE_IDLE, 4075 LOAD_STATE_IDLE, 4076 LOAD_STATE_IDLE, 4077 base::Bind( 4078 &AsyncLoggingUrlRequestDelegate::AfterReadCompletedLoggingComplete, 4079 base::Unretained(this), request, bytes_read)); 4080 } 4081 4082 private: 4083 void OnReceivedRedirectLoggingComplete(URLRequest* request, 4084 const GURL& new_url) { 4085 bool defer_redirect = false; 4086 TestDelegate::OnReceivedRedirect(request, new_url, &defer_redirect); 4087 // FollowDeferredRedirect should not be called after cancellation. 4088 if (cancel_stage_ == CANCEL_ON_RECEIVED_REDIRECT) 4089 return; 4090 if (!defer_redirect) 4091 request->FollowDeferredRedirect(); 4092 } 4093 4094 void OnResponseStartedLoggingComplete(URLRequest* request) { 4095 // The parent class continues the request. 4096 TestDelegate::OnResponseStarted(request); 4097 } 4098 4099 void AfterReadCompletedLoggingComplete(URLRequest* request, int bytes_read) { 4100 // The parent class continues the request. 4101 TestDelegate::OnReadCompleted(request, bytes_read); 4102 } 4103 4104 const CancelStage cancel_stage_; 4105 4106 DISALLOW_COPY_AND_ASSIGN(AsyncLoggingUrlRequestDelegate); 4107}; 4108 4109// Tests handling of delegate info before a request starts. 4110TEST_F(URLRequestTestHTTP, DelegateInfoBeforeStart) { 4111 ASSERT_TRUE(test_server_.Start()); 4112 4113 TestDelegate request_delegate; 4114 TestURLRequestContext context(true); 4115 context.set_network_delegate(NULL); 4116 context.set_net_log(&net_log_); 4117 context.Init(); 4118 4119 { 4120 URLRequest r(test_server_.GetURL("empty.html"), 4121 DEFAULT_PRIORITY, 4122 &request_delegate, 4123 &context); 4124 LoadStateWithParam load_state = r.GetLoadState(); 4125 EXPECT_EQ(LOAD_STATE_IDLE, load_state.state); 4126 EXPECT_EQ(base::string16(), load_state.param); 4127 4128 AsyncDelegateLogger::Run( 4129 &r, 4130 LOAD_STATE_WAITING_FOR_DELEGATE, 4131 LOAD_STATE_WAITING_FOR_DELEGATE, 4132 LOAD_STATE_IDLE, 4133 base::Bind(&URLRequest::Start, base::Unretained(&r))); 4134 4135 base::RunLoop().Run(); 4136 4137 EXPECT_EQ(200, r.GetResponseCode()); 4138 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 4139 } 4140 4141 CapturingNetLog::CapturedEntryList entries; 4142 net_log_.GetEntries(&entries); 4143 size_t log_position = ExpectLogContainsSomewhereAfter( 4144 entries, 4145 0, 4146 NetLog::TYPE_DELEGATE_INFO, 4147 NetLog::PHASE_BEGIN); 4148 4149 log_position = AsyncDelegateLogger::CheckDelegateInfo(entries, log_position); 4150 4151 // Nothing else should add any delegate info to the request. 4152 EXPECT_FALSE(LogContainsEntryWithTypeAfter( 4153 entries, log_position + 1, NetLog::TYPE_DELEGATE_INFO)); 4154} 4155 4156// Tests handling of delegate info from a network delegate. 4157TEST_F(URLRequestTestHTTP, NetworkDelegateInfo) { 4158 ASSERT_TRUE(test_server_.Start()); 4159 4160 TestDelegate request_delegate; 4161 AsyncLoggingNetworkDelegate network_delegate; 4162 TestURLRequestContext context(true); 4163 context.set_network_delegate(&network_delegate); 4164 context.set_net_log(&net_log_); 4165 context.Init(); 4166 4167 { 4168 URLRequest r(test_server_.GetURL("simple.html"), 4169 DEFAULT_PRIORITY, 4170 &request_delegate, 4171 &context); 4172 LoadStateWithParam load_state = r.GetLoadState(); 4173 EXPECT_EQ(LOAD_STATE_IDLE, load_state.state); 4174 EXPECT_EQ(base::string16(), load_state.param); 4175 4176 r.Start(); 4177 base::RunLoop().Run(); 4178 4179 EXPECT_EQ(200, r.GetResponseCode()); 4180 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 4181 EXPECT_EQ(1, network_delegate.created_requests()); 4182 EXPECT_EQ(0, network_delegate.destroyed_requests()); 4183 } 4184 EXPECT_EQ(1, network_delegate.destroyed_requests()); 4185 4186 size_t log_position = 0; 4187 CapturingNetLog::CapturedEntryList entries; 4188 net_log_.GetEntries(&entries); 4189 for (size_t i = 0; i < 3; ++i) { 4190 log_position = ExpectLogContainsSomewhereAfter( 4191 entries, 4192 log_position + 1, 4193 NetLog::TYPE_URL_REQUEST_DELEGATE, 4194 NetLog::PHASE_BEGIN); 4195 4196 log_position = AsyncDelegateLogger::CheckDelegateInfo(entries, 4197 log_position + 1); 4198 4199 ASSERT_LT(log_position, entries.size()); 4200 EXPECT_EQ(NetLog::TYPE_URL_REQUEST_DELEGATE, entries[log_position].type); 4201 EXPECT_EQ(NetLog::PHASE_END, entries[log_position].phase); 4202 4203 if (i == 1) { 4204 log_position = AsyncDelegateLogger::ExpectBeforeNetworkEvents( 4205 entries, log_position + 1); 4206 } 4207 } 4208 4209 EXPECT_FALSE(LogContainsEntryWithTypeAfter( 4210 entries, log_position + 1, NetLog::TYPE_DELEGATE_INFO)); 4211} 4212 4213// Tests handling of delegate info from a network delegate in the case of an 4214// HTTP redirect. 4215TEST_F(URLRequestTestHTTP, NetworkDelegateInfoRedirect) { 4216 ASSERT_TRUE(test_server_.Start()); 4217 4218 TestDelegate request_delegate; 4219 AsyncLoggingNetworkDelegate network_delegate; 4220 TestURLRequestContext context(true); 4221 context.set_network_delegate(&network_delegate); 4222 context.set_net_log(&net_log_); 4223 context.Init(); 4224 4225 { 4226 URLRequest r(test_server_.GetURL("server-redirect?simple.html"), 4227 DEFAULT_PRIORITY, 4228 &request_delegate, 4229 &context); 4230 LoadStateWithParam load_state = r.GetLoadState(); 4231 EXPECT_EQ(LOAD_STATE_IDLE, load_state.state); 4232 EXPECT_EQ(base::string16(), load_state.param); 4233 4234 r.Start(); 4235 base::RunLoop().Run(); 4236 4237 EXPECT_EQ(200, r.GetResponseCode()); 4238 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 4239 EXPECT_EQ(2, network_delegate.created_requests()); 4240 EXPECT_EQ(0, network_delegate.destroyed_requests()); 4241 } 4242 EXPECT_EQ(1, network_delegate.destroyed_requests()); 4243 4244 size_t log_position = 0; 4245 CapturingNetLog::CapturedEntryList entries; 4246 net_log_.GetEntries(&entries); 4247 // The NetworkDelegate logged information in OnBeforeURLRequest, 4248 // OnBeforeSendHeaders, and OnHeadersReceived. 4249 for (size_t i = 0; i < 3; ++i) { 4250 log_position = ExpectLogContainsSomewhereAfter( 4251 entries, 4252 log_position + 1, 4253 NetLog::TYPE_URL_REQUEST_DELEGATE, 4254 NetLog::PHASE_BEGIN); 4255 4256 log_position = AsyncDelegateLogger::CheckDelegateInfo(entries, 4257 log_position + 1); 4258 4259 ASSERT_LT(log_position, entries.size()); 4260 EXPECT_EQ(NetLog::TYPE_URL_REQUEST_DELEGATE, entries[log_position].type); 4261 EXPECT_EQ(NetLog::PHASE_END, entries[log_position].phase); 4262 4263 if (i == 1) { 4264 log_position = AsyncDelegateLogger::ExpectBeforeNetworkEvents( 4265 entries, log_position + 1); 4266 } 4267 } 4268 4269 // The URLRequest::Delegate then gets informed about the redirect. 4270 log_position = ExpectLogContainsSomewhereAfter( 4271 entries, 4272 log_position + 1, 4273 NetLog::TYPE_URL_REQUEST_DELEGATE, 4274 NetLog::PHASE_BEGIN); 4275 4276 // The NetworkDelegate logged information in the same three events as before. 4277 for (size_t i = 0; i < 3; ++i) { 4278 log_position = ExpectLogContainsSomewhereAfter( 4279 entries, 4280 log_position + 1, 4281 NetLog::TYPE_URL_REQUEST_DELEGATE, 4282 NetLog::PHASE_BEGIN); 4283 4284 log_position = AsyncDelegateLogger::CheckDelegateInfo(entries, 4285 log_position + 1); 4286 4287 ASSERT_LT(log_position, entries.size()); 4288 EXPECT_EQ(NetLog::TYPE_URL_REQUEST_DELEGATE, entries[log_position].type); 4289 EXPECT_EQ(NetLog::PHASE_END, entries[log_position].phase); 4290 } 4291 4292 EXPECT_FALSE(LogContainsEntryWithTypeAfter( 4293 entries, log_position + 1, NetLog::TYPE_DELEGATE_INFO)); 4294} 4295 4296// Tests handling of delegate info from a network delegate in the case of HTTP 4297// AUTH. 4298TEST_F(URLRequestTestHTTP, NetworkDelegateInfoAuth) { 4299 ASSERT_TRUE(test_server_.Start()); 4300 4301 TestDelegate request_delegate; 4302 AsyncLoggingNetworkDelegate network_delegate; 4303 TestURLRequestContext context(true); 4304 context.set_network_delegate(&network_delegate); 4305 context.set_net_log(&net_log_); 4306 context.Init(); 4307 4308 { 4309 URLRequest r(test_server_.GetURL("auth-basic"), 4310 DEFAULT_PRIORITY, 4311 &request_delegate, 4312 &context); 4313 LoadStateWithParam load_state = r.GetLoadState(); 4314 EXPECT_EQ(LOAD_STATE_IDLE, load_state.state); 4315 EXPECT_EQ(base::string16(), load_state.param); 4316 4317 r.Start(); 4318 base::RunLoop().Run(); 4319 4320 EXPECT_EQ(200, r.GetResponseCode()); 4321 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 4322 EXPECT_EQ(1, network_delegate.created_requests()); 4323 EXPECT_EQ(0, network_delegate.destroyed_requests()); 4324 } 4325 EXPECT_EQ(1, network_delegate.destroyed_requests()); 4326 4327 size_t log_position = 0; 4328 CapturingNetLog::CapturedEntryList entries; 4329 net_log_.GetEntries(&entries); 4330 // The NetworkDelegate should have logged information in OnBeforeURLRequest, 4331 // OnBeforeSendHeaders, OnHeadersReceived, OnAuthRequired, and then again in 4332 // OnBeforeURLRequest and OnBeforeSendHeaders. 4333 for (size_t i = 0; i < 6; ++i) { 4334 log_position = ExpectLogContainsSomewhereAfter( 4335 entries, 4336 log_position + 1, 4337 NetLog::TYPE_URL_REQUEST_DELEGATE, 4338 NetLog::PHASE_BEGIN); 4339 4340 log_position = AsyncDelegateLogger::CheckDelegateInfo(entries, 4341 log_position + 1); 4342 4343 ASSERT_LT(log_position, entries.size()); 4344 EXPECT_EQ(NetLog::TYPE_URL_REQUEST_DELEGATE, entries[log_position].type); 4345 EXPECT_EQ(NetLog::PHASE_END, entries[log_position].phase); 4346 4347 if (i == 1) { 4348 log_position = AsyncDelegateLogger::ExpectBeforeNetworkEvents( 4349 entries, log_position + 1); 4350 } 4351 } 4352 4353 EXPECT_FALSE(LogContainsEntryWithTypeAfter( 4354 entries, log_position + 1, NetLog::TYPE_DELEGATE_INFO)); 4355} 4356 4357// Tests handling of delegate info from a URLRequest::Delegate. 4358TEST_F(URLRequestTestHTTP, URLRequestDelegateInfo) { 4359 ASSERT_TRUE(test_server_.Start()); 4360 4361 AsyncLoggingUrlRequestDelegate request_delegate( 4362 AsyncLoggingUrlRequestDelegate::NO_CANCEL); 4363 TestURLRequestContext context(true); 4364 context.set_network_delegate(NULL); 4365 context.set_net_log(&net_log_); 4366 context.Init(); 4367 4368 { 4369 // A chunked response with delays between chunks is used to make sure that 4370 // attempts by the URLRequest delegate to log information while reading the 4371 // body are ignored. Since they are ignored, this test is robust against 4372 // the possibility of multiple reads being combined in the unlikely event 4373 // that it occurs. 4374 URLRequest r(test_server_.GetURL("chunked?waitBetweenChunks=20"), 4375 DEFAULT_PRIORITY, 4376 &request_delegate, 4377 &context); 4378 LoadStateWithParam load_state = r.GetLoadState(); 4379 r.Start(); 4380 base::RunLoop().Run(); 4381 4382 EXPECT_EQ(200, r.GetResponseCode()); 4383 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 4384 } 4385 4386 CapturingNetLog::CapturedEntryList entries; 4387 net_log_.GetEntries(&entries); 4388 4389 size_t log_position = 0; 4390 4391 log_position = AsyncDelegateLogger::ExpectBeforeNetworkEvents( 4392 entries, log_position); 4393 4394 // The delegate info should only have been logged on header complete. Other 4395 // times it should silently be ignored. 4396 log_position = 4397 ExpectLogContainsSomewhereAfter(entries, 4398 log_position + 1, 4399 NetLog::TYPE_URL_REQUEST_DELEGATE, 4400 NetLog::PHASE_BEGIN); 4401 4402 log_position = AsyncDelegateLogger::CheckDelegateInfo(entries, 4403 log_position + 1); 4404 4405 ASSERT_LT(log_position, entries.size()); 4406 EXPECT_EQ(NetLog::TYPE_URL_REQUEST_DELEGATE, entries[log_position].type); 4407 EXPECT_EQ(NetLog::PHASE_END, entries[log_position].phase); 4408 4409 EXPECT_FALSE(LogContainsEntryWithTypeAfter( 4410 entries, log_position + 1, NetLog::TYPE_DELEGATE_INFO)); 4411 EXPECT_FALSE(LogContainsEntryWithTypeAfter( 4412 entries, log_position + 1, NetLog::TYPE_URL_REQUEST_DELEGATE)); 4413} 4414 4415// Tests handling of delegate info from a URLRequest::Delegate in the case of 4416// an HTTP redirect. 4417TEST_F(URLRequestTestHTTP, URLRequestDelegateInfoOnRedirect) { 4418 ASSERT_TRUE(test_server_.Start()); 4419 4420 AsyncLoggingUrlRequestDelegate request_delegate( 4421 AsyncLoggingUrlRequestDelegate::NO_CANCEL); 4422 TestURLRequestContext context(true); 4423 context.set_network_delegate(NULL); 4424 context.set_net_log(&net_log_); 4425 context.Init(); 4426 4427 { 4428 URLRequest r(test_server_.GetURL("server-redirect?simple.html"), 4429 DEFAULT_PRIORITY, 4430 &request_delegate, 4431 &context); 4432 LoadStateWithParam load_state = r.GetLoadState(); 4433 r.Start(); 4434 base::RunLoop().Run(); 4435 4436 EXPECT_EQ(200, r.GetResponseCode()); 4437 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 4438 } 4439 4440 CapturingNetLog::CapturedEntryList entries; 4441 net_log_.GetEntries(&entries); 4442 4443 // Delegate info should only have been logged in OnReceivedRedirect and 4444 // OnResponseStarted. 4445 size_t log_position = 0; 4446 for (int i = 0; i < 2; ++i) { 4447 if (i == 0) { 4448 log_position = AsyncDelegateLogger::ExpectBeforeNetworkEvents( 4449 entries, log_position) + 1; 4450 } 4451 4452 log_position = ExpectLogContainsSomewhereAfter( 4453 entries, 4454 log_position, 4455 NetLog::TYPE_URL_REQUEST_DELEGATE, 4456 NetLog::PHASE_BEGIN); 4457 4458 log_position = AsyncDelegateLogger::CheckDelegateInfo(entries, 4459 log_position + 1); 4460 4461 ASSERT_LT(log_position, entries.size()); 4462 EXPECT_EQ(NetLog::TYPE_URL_REQUEST_DELEGATE, entries[log_position].type); 4463 EXPECT_EQ(NetLog::PHASE_END, entries[log_position].phase); 4464 } 4465 4466 EXPECT_FALSE(LogContainsEntryWithTypeAfter( 4467 entries, log_position + 1, NetLog::TYPE_DELEGATE_INFO)); 4468 EXPECT_FALSE(LogContainsEntryWithTypeAfter( 4469 entries, log_position + 1, NetLog::TYPE_URL_REQUEST_DELEGATE)); 4470} 4471 4472// Tests handling of delegate info from a URLRequest::Delegate in the case of 4473// an HTTP redirect, with cancellation at various points. 4474TEST_F(URLRequestTestHTTP, URLRequestDelegateOnRedirectCancelled) { 4475 ASSERT_TRUE(test_server_.Start()); 4476 4477 const AsyncLoggingUrlRequestDelegate::CancelStage kCancelStages[] = { 4478 AsyncLoggingUrlRequestDelegate::CANCEL_ON_RECEIVED_REDIRECT, 4479 AsyncLoggingUrlRequestDelegate::CANCEL_ON_RESPONSE_STARTED, 4480 AsyncLoggingUrlRequestDelegate::CANCEL_ON_READ_COMPLETED, 4481 }; 4482 4483 for (size_t test_case = 0; test_case < arraysize(kCancelStages); 4484 ++test_case) { 4485 AsyncLoggingUrlRequestDelegate request_delegate(kCancelStages[test_case]); 4486 TestURLRequestContext context(true); 4487 CapturingNetLog net_log; 4488 context.set_network_delegate(NULL); 4489 context.set_net_log(&net_log); 4490 context.Init(); 4491 4492 { 4493 URLRequest r(test_server_.GetURL("server-redirect?simple.html"), 4494 DEFAULT_PRIORITY, 4495 &request_delegate, 4496 &context); 4497 LoadStateWithParam load_state = r.GetLoadState(); 4498 r.Start(); 4499 base::RunLoop().Run(); 4500 EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status()); 4501 } 4502 4503 CapturingNetLog::CapturedEntryList entries; 4504 net_log.GetEntries(&entries); 4505 4506 // Delegate info is always logged in both OnReceivedRedirect and 4507 // OnResponseStarted. In the CANCEL_ON_RECEIVED_REDIRECT, the 4508 // OnResponseStarted delegate call is after cancellation, but logging is 4509 // still currently supported in that call. 4510 size_t log_position = 0; 4511 for (int i = 0; i < 2; ++i) { 4512 if (i == 0) { 4513 log_position = AsyncDelegateLogger::ExpectBeforeNetworkEvents( 4514 entries, log_position) + 1; 4515 } 4516 4517 log_position = ExpectLogContainsSomewhereAfter( 4518 entries, 4519 log_position, 4520 NetLog::TYPE_URL_REQUEST_DELEGATE, 4521 NetLog::PHASE_BEGIN); 4522 4523 log_position = AsyncDelegateLogger::CheckDelegateInfo(entries, 4524 log_position + 1); 4525 4526 ASSERT_LT(log_position, entries.size()); 4527 EXPECT_EQ(NetLog::TYPE_URL_REQUEST_DELEGATE, entries[log_position].type); 4528 EXPECT_EQ(NetLog::PHASE_END, entries[log_position].phase); 4529 } 4530 4531 EXPECT_FALSE(LogContainsEntryWithTypeAfter( 4532 entries, log_position + 1, NetLog::TYPE_DELEGATE_INFO)); 4533 EXPECT_FALSE(LogContainsEntryWithTypeAfter( 4534 entries, log_position + 1, NetLog::TYPE_URL_REQUEST_DELEGATE)); 4535 } 4536} 4537 4538namespace { 4539 4540const char kExtraHeader[] = "Allow-Snafu"; 4541const char kExtraValue[] = "fubar"; 4542 4543class RedirectWithAdditionalHeadersDelegate : public TestDelegate { 4544 virtual void OnReceivedRedirect(net::URLRequest* request, 4545 const GURL& new_url, 4546 bool* defer_redirect) OVERRIDE { 4547 TestDelegate::OnReceivedRedirect(request, new_url, defer_redirect); 4548 request->SetExtraRequestHeaderByName(kExtraHeader, kExtraValue, false); 4549 } 4550}; 4551 4552} // namespace 4553 4554TEST_F(URLRequestTestHTTP, RedirectWithAdditionalHeadersTest) { 4555 ASSERT_TRUE(test_server_.Start()); 4556 4557 GURL destination_url = test_server_.GetURL( 4558 "echoheader?" + std::string(kExtraHeader)); 4559 GURL original_url = test_server_.GetURL( 4560 "server-redirect?" + destination_url.spec()); 4561 RedirectWithAdditionalHeadersDelegate d; 4562 URLRequest req(original_url, DEFAULT_PRIORITY, &d, &default_context_); 4563 req.Start(); 4564 base::RunLoop().Run(); 4565 4566 std::string value; 4567 const HttpRequestHeaders& headers = req.extra_request_headers(); 4568 EXPECT_TRUE(headers.GetHeader(kExtraHeader, &value)); 4569 EXPECT_EQ(kExtraValue, value); 4570 EXPECT_FALSE(req.is_pending()); 4571 EXPECT_FALSE(req.is_redirecting()); 4572 EXPECT_EQ(kExtraValue, d.data_received()); 4573} 4574 4575namespace { 4576 4577const char kExtraHeaderToRemove[] = "To-Be-Removed"; 4578 4579class RedirectWithHeaderRemovalDelegate : public TestDelegate { 4580 virtual void OnReceivedRedirect(net::URLRequest* request, 4581 const GURL& new_url, 4582 bool* defer_redirect) OVERRIDE { 4583 TestDelegate::OnReceivedRedirect(request, new_url, defer_redirect); 4584 request->RemoveRequestHeaderByName(kExtraHeaderToRemove); 4585 } 4586}; 4587 4588} // namespace 4589 4590TEST_F(URLRequestTestHTTP, RedirectWithHeaderRemovalTest) { 4591 ASSERT_TRUE(test_server_.Start()); 4592 4593 GURL destination_url = test_server_.GetURL( 4594 "echoheader?" + std::string(kExtraHeaderToRemove)); 4595 GURL original_url = test_server_.GetURL( 4596 "server-redirect?" + destination_url.spec()); 4597 RedirectWithHeaderRemovalDelegate d; 4598 URLRequest req(original_url, DEFAULT_PRIORITY, &d, &default_context_); 4599 req.SetExtraRequestHeaderByName(kExtraHeaderToRemove, "dummy", false); 4600 req.Start(); 4601 base::RunLoop().Run(); 4602 4603 std::string value; 4604 const HttpRequestHeaders& headers = req.extra_request_headers(); 4605 EXPECT_FALSE(headers.GetHeader(kExtraHeaderToRemove, &value)); 4606 EXPECT_FALSE(req.is_pending()); 4607 EXPECT_FALSE(req.is_redirecting()); 4608 EXPECT_EQ("None", d.data_received()); 4609} 4610 4611TEST_F(URLRequestTestHTTP, CancelTest) { 4612 TestDelegate d; 4613 { 4614 URLRequest r(GURL("http://www.google.com/"), 4615 DEFAULT_PRIORITY, 4616 &d, 4617 &default_context_); 4618 4619 r.Start(); 4620 EXPECT_TRUE(r.is_pending()); 4621 4622 r.Cancel(); 4623 4624 base::RunLoop().Run(); 4625 4626 // We expect to receive OnResponseStarted even though the request has been 4627 // cancelled. 4628 EXPECT_EQ(1, d.response_started_count()); 4629 EXPECT_EQ(0, d.bytes_received()); 4630 EXPECT_FALSE(d.received_data_before_response()); 4631 } 4632} 4633 4634TEST_F(URLRequestTestHTTP, CancelTest2) { 4635 ASSERT_TRUE(test_server_.Start()); 4636 4637 TestDelegate d; 4638 { 4639 URLRequest r(test_server_.GetURL(std::string()), 4640 DEFAULT_PRIORITY, 4641 &d, 4642 &default_context_); 4643 4644 d.set_cancel_in_response_started(true); 4645 4646 r.Start(); 4647 EXPECT_TRUE(r.is_pending()); 4648 4649 base::RunLoop().Run(); 4650 4651 EXPECT_EQ(1, d.response_started_count()); 4652 EXPECT_EQ(0, d.bytes_received()); 4653 EXPECT_FALSE(d.received_data_before_response()); 4654 EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status()); 4655 } 4656} 4657 4658TEST_F(URLRequestTestHTTP, CancelTest3) { 4659 ASSERT_TRUE(test_server_.Start()); 4660 4661 TestDelegate d; 4662 { 4663 URLRequest r(test_server_.GetURL(std::string()), 4664 DEFAULT_PRIORITY, 4665 &d, 4666 &default_context_); 4667 4668 d.set_cancel_in_received_data(true); 4669 4670 r.Start(); 4671 EXPECT_TRUE(r.is_pending()); 4672 4673 base::RunLoop().Run(); 4674 4675 EXPECT_EQ(1, d.response_started_count()); 4676 // There is no guarantee about how much data was received 4677 // before the cancel was issued. It could have been 0 bytes, 4678 // or it could have been all the bytes. 4679 // EXPECT_EQ(0, d.bytes_received()); 4680 EXPECT_FALSE(d.received_data_before_response()); 4681 EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status()); 4682 } 4683} 4684 4685TEST_F(URLRequestTestHTTP, CancelTest4) { 4686 ASSERT_TRUE(test_server_.Start()); 4687 4688 TestDelegate d; 4689 { 4690 URLRequest r(test_server_.GetURL(std::string()), 4691 DEFAULT_PRIORITY, 4692 &d, 4693 &default_context_); 4694 4695 r.Start(); 4696 EXPECT_TRUE(r.is_pending()); 4697 4698 // The request will be implicitly canceled when it is destroyed. The 4699 // test delegate must not post a quit message when this happens because 4700 // this test doesn't actually have a message loop. The quit message would 4701 // get put on this thread's message queue and the next test would exit 4702 // early, causing problems. 4703 d.set_quit_on_complete(false); 4704 } 4705 // expect things to just cleanup properly. 4706 4707 // we won't actually get a received reponse here because we've never run the 4708 // message loop 4709 EXPECT_FALSE(d.received_data_before_response()); 4710 EXPECT_EQ(0, d.bytes_received()); 4711} 4712 4713TEST_F(URLRequestTestHTTP, CancelTest5) { 4714 ASSERT_TRUE(test_server_.Start()); 4715 4716 // populate cache 4717 { 4718 TestDelegate d; 4719 URLRequest r(test_server_.GetURL("cachetime"), 4720 DEFAULT_PRIORITY, 4721 &d, 4722 &default_context_); 4723 r.Start(); 4724 base::RunLoop().Run(); 4725 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 4726 } 4727 4728 // cancel read from cache (see bug 990242) 4729 { 4730 TestDelegate d; 4731 URLRequest r(test_server_.GetURL("cachetime"), 4732 DEFAULT_PRIORITY, 4733 &d, 4734 &default_context_); 4735 r.Start(); 4736 r.Cancel(); 4737 base::RunLoop().Run(); 4738 4739 EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status()); 4740 EXPECT_EQ(1, d.response_started_count()); 4741 EXPECT_EQ(0, d.bytes_received()); 4742 EXPECT_FALSE(d.received_data_before_response()); 4743 } 4744} 4745 4746TEST_F(URLRequestTestHTTP, PostTest) { 4747 ASSERT_TRUE(test_server_.Start()); 4748 HTTPUploadDataOperationTest("POST"); 4749} 4750 4751TEST_F(URLRequestTestHTTP, PutTest) { 4752 ASSERT_TRUE(test_server_.Start()); 4753 HTTPUploadDataOperationTest("PUT"); 4754} 4755 4756TEST_F(URLRequestTestHTTP, PostEmptyTest) { 4757 ASSERT_TRUE(test_server_.Start()); 4758 4759 TestDelegate d; 4760 { 4761 URLRequest r( 4762 test_server_.GetURL("echo"), DEFAULT_PRIORITY, &d, &default_context_); 4763 r.set_method("POST"); 4764 4765 r.Start(); 4766 EXPECT_TRUE(r.is_pending()); 4767 4768 base::RunLoop().Run(); 4769 4770 ASSERT_EQ(1, d.response_started_count()) 4771 << "request failed: " << r.status().status() 4772 << ", error: " << r.status().error(); 4773 4774 EXPECT_FALSE(d.received_data_before_response()); 4775 EXPECT_TRUE(d.data_received().empty()); 4776 } 4777} 4778 4779TEST_F(URLRequestTestHTTP, PostFileTest) { 4780 ASSERT_TRUE(test_server_.Start()); 4781 4782 TestDelegate d; 4783 { 4784 URLRequest r( 4785 test_server_.GetURL("echo"), DEFAULT_PRIORITY, &d, &default_context_); 4786 r.set_method("POST"); 4787 4788 base::FilePath dir; 4789 PathService::Get(base::DIR_EXE, &dir); 4790 base::SetCurrentDirectory(dir); 4791 4792 ScopedVector<UploadElementReader> element_readers; 4793 4794 base::FilePath path; 4795 PathService::Get(base::DIR_SOURCE_ROOT, &path); 4796 path = path.Append(FILE_PATH_LITERAL("net")); 4797 path = path.Append(FILE_PATH_LITERAL("data")); 4798 path = path.Append(FILE_PATH_LITERAL("url_request_unittest")); 4799 path = path.Append(FILE_PATH_LITERAL("with-headers.html")); 4800 element_readers.push_back( 4801 new UploadFileElementReader(base::MessageLoopProxy::current().get(), 4802 path, 4803 0, 4804 kuint64max, 4805 base::Time())); 4806 r.set_upload(make_scoped_ptr( 4807 new UploadDataStream(element_readers.Pass(), 0))); 4808 4809 r.Start(); 4810 EXPECT_TRUE(r.is_pending()); 4811 4812 base::RunLoop().Run(); 4813 4814 int64 size = 0; 4815 ASSERT_EQ(true, base::GetFileSize(path, &size)); 4816 scoped_ptr<char[]> buf(new char[size]); 4817 4818 ASSERT_EQ(size, base::ReadFile(path, buf.get(), size)); 4819 4820 ASSERT_EQ(1, d.response_started_count()) 4821 << "request failed: " << r.status().status() 4822 << ", error: " << r.status().error(); 4823 4824 EXPECT_FALSE(d.received_data_before_response()); 4825 4826 EXPECT_EQ(size, d.bytes_received()); 4827 EXPECT_EQ(std::string(&buf[0], size), d.data_received()); 4828 } 4829} 4830 4831TEST_F(URLRequestTestHTTP, PostUnreadableFileTest) { 4832 ASSERT_TRUE(test_server_.Start()); 4833 4834 TestDelegate d; 4835 { 4836 URLRequest r(test_server_.GetURL("echo"), DEFAULT_PRIORITY, 4837 &d, &default_context_); 4838 r.set_method("POST"); 4839 4840 ScopedVector<UploadElementReader> element_readers; 4841 4842 element_readers.push_back(new UploadFileElementReader( 4843 base::MessageLoopProxy::current().get(), 4844 base::FilePath(FILE_PATH_LITERAL( 4845 "c:\\path\\to\\non\\existant\\file.randomness.12345")), 4846 0, 4847 kuint64max, 4848 base::Time())); 4849 r.set_upload(make_scoped_ptr( 4850 new UploadDataStream(element_readers.Pass(), 0))); 4851 4852 r.Start(); 4853 EXPECT_TRUE(r.is_pending()); 4854 4855 base::RunLoop().Run(); 4856 4857 EXPECT_TRUE(d.request_failed()); 4858 EXPECT_FALSE(d.received_data_before_response()); 4859 EXPECT_EQ(0, d.bytes_received()); 4860 EXPECT_EQ(URLRequestStatus::FAILED, r.status().status()); 4861 EXPECT_EQ(ERR_FILE_NOT_FOUND, r.status().error()); 4862 } 4863} 4864 4865TEST_F(URLRequestTestHTTP, TestPostChunkedDataBeforeStart) { 4866 ASSERT_TRUE(test_server_.Start()); 4867 4868 TestDelegate d; 4869 { 4870 URLRequest r( 4871 test_server_.GetURL("echo"), DEFAULT_PRIORITY, &d, &default_context_); 4872 r.EnableChunkedUpload(); 4873 r.set_method("POST"); 4874 AddChunksToUpload(&r); 4875 r.Start(); 4876 EXPECT_TRUE(r.is_pending()); 4877 4878 base::RunLoop().Run(); 4879 4880 VerifyReceivedDataMatchesChunks(&r, &d); 4881 } 4882} 4883 4884TEST_F(URLRequestTestHTTP, TestPostChunkedDataJustAfterStart) { 4885 ASSERT_TRUE(test_server_.Start()); 4886 4887 TestDelegate d; 4888 { 4889 URLRequest r( 4890 test_server_.GetURL("echo"), DEFAULT_PRIORITY, &d, &default_context_); 4891 r.EnableChunkedUpload(); 4892 r.set_method("POST"); 4893 r.Start(); 4894 EXPECT_TRUE(r.is_pending()); 4895 AddChunksToUpload(&r); 4896 base::RunLoop().Run(); 4897 4898 VerifyReceivedDataMatchesChunks(&r, &d); 4899 } 4900} 4901 4902TEST_F(URLRequestTestHTTP, TestPostChunkedDataAfterStart) { 4903 ASSERT_TRUE(test_server_.Start()); 4904 4905 TestDelegate d; 4906 { 4907 URLRequest r( 4908 test_server_.GetURL("echo"), DEFAULT_PRIORITY, &d, &default_context_); 4909 r.EnableChunkedUpload(); 4910 r.set_method("POST"); 4911 r.Start(); 4912 EXPECT_TRUE(r.is_pending()); 4913 4914 base::RunLoop().RunUntilIdle(); 4915 AddChunksToUpload(&r); 4916 base::RunLoop().Run(); 4917 4918 VerifyReceivedDataMatchesChunks(&r, &d); 4919 } 4920} 4921 4922TEST_F(URLRequestTestHTTP, ResponseHeadersTest) { 4923 ASSERT_TRUE(test_server_.Start()); 4924 4925 TestDelegate d; 4926 URLRequest req(test_server_.GetURL("files/with-headers.html"), 4927 DEFAULT_PRIORITY, 4928 &d, 4929 &default_context_); 4930 req.Start(); 4931 base::RunLoop().Run(); 4932 4933 const HttpResponseHeaders* headers = req.response_headers(); 4934 4935 // Simple sanity check that response_info() accesses the same data. 4936 EXPECT_EQ(headers, req.response_info().headers.get()); 4937 4938 std::string header; 4939 EXPECT_TRUE(headers->GetNormalizedHeader("cache-control", &header)); 4940 EXPECT_EQ("private", header); 4941 4942 header.clear(); 4943 EXPECT_TRUE(headers->GetNormalizedHeader("content-type", &header)); 4944 EXPECT_EQ("text/html; charset=ISO-8859-1", header); 4945 4946 // The response has two "X-Multiple-Entries" headers. 4947 // This verfies our output has them concatenated together. 4948 header.clear(); 4949 EXPECT_TRUE(headers->GetNormalizedHeader("x-multiple-entries", &header)); 4950 EXPECT_EQ("a, b", header); 4951} 4952 4953TEST_F(URLRequestTestHTTP, ProcessSTS) { 4954 SpawnedTestServer::SSLOptions ssl_options; 4955 SpawnedTestServer https_test_server( 4956 SpawnedTestServer::TYPE_HTTPS, 4957 ssl_options, 4958 base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest"))); 4959 ASSERT_TRUE(https_test_server.Start()); 4960 4961 TestDelegate d; 4962 URLRequest request(https_test_server.GetURL("files/hsts-headers.html"), 4963 DEFAULT_PRIORITY, 4964 &d, 4965 &default_context_); 4966 request.Start(); 4967 base::RunLoop().Run(); 4968 4969 TransportSecurityState* security_state = 4970 default_context_.transport_security_state(); 4971 TransportSecurityState::DomainState domain_state; 4972 EXPECT_TRUE(security_state->GetDynamicDomainState( 4973 SpawnedTestServer::kLocalhost, &domain_state)); 4974 EXPECT_EQ(TransportSecurityState::DomainState::MODE_FORCE_HTTPS, 4975 domain_state.sts.upgrade_mode); 4976 EXPECT_TRUE(domain_state.sts.include_subdomains); 4977 EXPECT_FALSE(domain_state.pkp.include_subdomains); 4978#if defined(OS_ANDROID) 4979 // Android's CertVerifyProc does not (yet) handle pins. 4980#else 4981 EXPECT_FALSE(domain_state.HasPublicKeyPins()); 4982#endif 4983} 4984 4985// Android's CertVerifyProc does not (yet) handle pins. Therefore, it will 4986// reject HPKP headers, and a test setting only HPKP headers will fail (no 4987// DomainState present because header rejected). 4988#if defined(OS_ANDROID) 4989#define MAYBE_ProcessPKP DISABLED_ProcessPKP 4990#else 4991#define MAYBE_ProcessPKP ProcessPKP 4992#endif 4993 4994// Tests that enabling HPKP on a domain does not affect the HSTS 4995// validity/expiration. 4996TEST_F(URLRequestTestHTTP, MAYBE_ProcessPKP) { 4997 SpawnedTestServer::SSLOptions ssl_options; 4998 SpawnedTestServer https_test_server( 4999 SpawnedTestServer::TYPE_HTTPS, 5000 ssl_options, 5001 base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest"))); 5002 ASSERT_TRUE(https_test_server.Start()); 5003 5004 TestDelegate d; 5005 URLRequest request(https_test_server.GetURL("files/hpkp-headers.html"), 5006 DEFAULT_PRIORITY, 5007 &d, 5008 &default_context_); 5009 request.Start(); 5010 base::RunLoop().Run(); 5011 5012 TransportSecurityState* security_state = 5013 default_context_.transport_security_state(); 5014 TransportSecurityState::DomainState domain_state; 5015 EXPECT_TRUE(security_state->GetDynamicDomainState( 5016 SpawnedTestServer::kLocalhost, &domain_state)); 5017 EXPECT_EQ(TransportSecurityState::DomainState::MODE_DEFAULT, 5018 domain_state.sts.upgrade_mode); 5019 EXPECT_FALSE(domain_state.sts.include_subdomains); 5020 EXPECT_FALSE(domain_state.pkp.include_subdomains); 5021 EXPECT_TRUE(domain_state.HasPublicKeyPins()); 5022 EXPECT_NE(domain_state.sts.expiry, domain_state.pkp.expiry); 5023} 5024 5025TEST_F(URLRequestTestHTTP, ProcessSTSOnce) { 5026 SpawnedTestServer::SSLOptions ssl_options; 5027 SpawnedTestServer https_test_server( 5028 SpawnedTestServer::TYPE_HTTPS, 5029 ssl_options, 5030 base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest"))); 5031 ASSERT_TRUE(https_test_server.Start()); 5032 5033 TestDelegate d; 5034 URLRequest request( 5035 https_test_server.GetURL("files/hsts-multiple-headers.html"), 5036 DEFAULT_PRIORITY, 5037 &d, 5038 &default_context_); 5039 request.Start(); 5040 base::RunLoop().Run(); 5041 5042 // We should have set parameters from the first header, not the second. 5043 TransportSecurityState* security_state = 5044 default_context_.transport_security_state(); 5045 TransportSecurityState::DomainState domain_state; 5046 EXPECT_TRUE(security_state->GetDynamicDomainState( 5047 SpawnedTestServer::kLocalhost, &domain_state)); 5048 EXPECT_EQ(TransportSecurityState::DomainState::MODE_FORCE_HTTPS, 5049 domain_state.sts.upgrade_mode); 5050 EXPECT_FALSE(domain_state.sts.include_subdomains); 5051 EXPECT_FALSE(domain_state.pkp.include_subdomains); 5052} 5053 5054TEST_F(URLRequestTestHTTP, ProcessSTSAndPKP) { 5055 SpawnedTestServer::SSLOptions ssl_options; 5056 SpawnedTestServer https_test_server( 5057 SpawnedTestServer::TYPE_HTTPS, 5058 ssl_options, 5059 base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest"))); 5060 ASSERT_TRUE(https_test_server.Start()); 5061 5062 TestDelegate d; 5063 URLRequest request( 5064 https_test_server.GetURL("files/hsts-and-hpkp-headers.html"), 5065 DEFAULT_PRIORITY, 5066 &d, 5067 &default_context_); 5068 request.Start(); 5069 base::RunLoop().Run(); 5070 5071 // We should have set parameters from the first header, not the second. 5072 TransportSecurityState* security_state = 5073 default_context_.transport_security_state(); 5074 TransportSecurityState::DomainState domain_state; 5075 EXPECT_TRUE(security_state->GetDynamicDomainState( 5076 SpawnedTestServer::kLocalhost, &domain_state)); 5077 EXPECT_EQ(TransportSecurityState::DomainState::MODE_FORCE_HTTPS, 5078 domain_state.sts.upgrade_mode); 5079#if defined(OS_ANDROID) 5080 // Android's CertVerifyProc does not (yet) handle pins. 5081#else 5082 EXPECT_TRUE(domain_state.HasPublicKeyPins()); 5083#endif 5084 EXPECT_NE(domain_state.sts.expiry, domain_state.pkp.expiry); 5085 5086 // Even though there is an HSTS header asserting includeSubdomains, it is 5087 // the *second* such header, and we MUST process only the first. 5088 EXPECT_FALSE(domain_state.sts.include_subdomains); 5089 // includeSubdomains does not occur in the test HPKP header. 5090 EXPECT_FALSE(domain_state.pkp.include_subdomains); 5091} 5092 5093// Tests that when multiple HPKP headers are present, asserting different 5094// policies, that only the first such policy is processed. 5095TEST_F(URLRequestTestHTTP, ProcessSTSAndPKP2) { 5096 SpawnedTestServer::SSLOptions ssl_options; 5097 SpawnedTestServer https_test_server( 5098 SpawnedTestServer::TYPE_HTTPS, 5099 ssl_options, 5100 base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest"))); 5101 ASSERT_TRUE(https_test_server.Start()); 5102 5103 TestDelegate d; 5104 URLRequest request( 5105 https_test_server.GetURL("files/hsts-and-hpkp-headers2.html"), 5106 DEFAULT_PRIORITY, 5107 &d, 5108 &default_context_); 5109 request.Start(); 5110 base::RunLoop().Run(); 5111 5112 TransportSecurityState* security_state = 5113 default_context_.transport_security_state(); 5114 TransportSecurityState::DomainState domain_state; 5115 EXPECT_TRUE(security_state->GetDynamicDomainState( 5116 SpawnedTestServer::kLocalhost, &domain_state)); 5117 EXPECT_EQ(TransportSecurityState::DomainState::MODE_FORCE_HTTPS, 5118 domain_state.sts.upgrade_mode); 5119#if defined(OS_ANDROID) 5120 // Android's CertVerifyProc does not (yet) handle pins. 5121#else 5122 EXPECT_TRUE(domain_state.HasPublicKeyPins()); 5123#endif 5124 EXPECT_NE(domain_state.sts.expiry, domain_state.pkp.expiry); 5125 5126 EXPECT_TRUE(domain_state.sts.include_subdomains); 5127 EXPECT_FALSE(domain_state.pkp.include_subdomains); 5128} 5129 5130TEST_F(URLRequestTestHTTP, ContentTypeNormalizationTest) { 5131 ASSERT_TRUE(test_server_.Start()); 5132 5133 TestDelegate d; 5134 URLRequest req(test_server_.GetURL("files/content-type-normalization.html"), 5135 DEFAULT_PRIORITY, 5136 &d, 5137 &default_context_); 5138 req.Start(); 5139 base::RunLoop().Run(); 5140 5141 std::string mime_type; 5142 req.GetMimeType(&mime_type); 5143 EXPECT_EQ("text/html", mime_type); 5144 5145 std::string charset; 5146 req.GetCharset(&charset); 5147 EXPECT_EQ("utf-8", charset); 5148 req.Cancel(); 5149} 5150 5151TEST_F(URLRequestTestHTTP, ProtocolHandlerAndFactoryRestrictDataRedirects) { 5152 // Test URLRequestJobFactory::ProtocolHandler::IsSafeRedirectTarget(). 5153 GURL data_url("data:,foo"); 5154 DataProtocolHandler data_protocol_handler; 5155 EXPECT_FALSE(data_protocol_handler.IsSafeRedirectTarget(data_url)); 5156 5157 // Test URLRequestJobFactoryImpl::IsSafeRedirectTarget(). 5158 EXPECT_FALSE(job_factory_.IsSafeRedirectTarget(data_url)); 5159} 5160 5161#if !defined(DISABLE_FILE_SUPPORT) 5162TEST_F(URLRequestTestHTTP, ProtocolHandlerAndFactoryRestrictFileRedirects) { 5163 // Test URLRequestJobFactory::ProtocolHandler::IsSafeRedirectTarget(). 5164 GURL file_url("file:///foo.txt"); 5165 FileProtocolHandler file_protocol_handler(base::MessageLoopProxy::current()); 5166 EXPECT_FALSE(file_protocol_handler.IsSafeRedirectTarget(file_url)); 5167 5168 // Test URLRequestJobFactoryImpl::IsSafeRedirectTarget(). 5169 EXPECT_FALSE(job_factory_.IsSafeRedirectTarget(file_url)); 5170} 5171 5172TEST_F(URLRequestTestHTTP, RestrictFileRedirects) { 5173 ASSERT_TRUE(test_server_.Start()); 5174 5175 TestDelegate d; 5176 URLRequest req(test_server_.GetURL("files/redirect-to-file.html"), 5177 DEFAULT_PRIORITY, 5178 &d, 5179 &default_context_); 5180 req.Start(); 5181 base::RunLoop().Run(); 5182 5183 EXPECT_EQ(URLRequestStatus::FAILED, req.status().status()); 5184 EXPECT_EQ(ERR_UNSAFE_REDIRECT, req.status().error()); 5185} 5186#endif // !defined(DISABLE_FILE_SUPPORT) 5187 5188TEST_F(URLRequestTestHTTP, RestrictDataRedirects) { 5189 ASSERT_TRUE(test_server_.Start()); 5190 5191 TestDelegate d; 5192 URLRequest req(test_server_.GetURL("files/redirect-to-data.html"), 5193 DEFAULT_PRIORITY, 5194 &d, 5195 &default_context_); 5196 req.Start(); 5197 base::MessageLoop::current()->Run(); 5198 5199 EXPECT_EQ(URLRequestStatus::FAILED, req.status().status()); 5200 EXPECT_EQ(ERR_UNSAFE_REDIRECT, req.status().error()); 5201} 5202 5203TEST_F(URLRequestTestHTTP, RedirectToInvalidURL) { 5204 ASSERT_TRUE(test_server_.Start()); 5205 5206 TestDelegate d; 5207 URLRequest req(test_server_.GetURL("files/redirect-to-invalid-url.html"), 5208 DEFAULT_PRIORITY, 5209 &d, 5210 &default_context_); 5211 req.Start(); 5212 base::RunLoop().Run(); 5213 5214 EXPECT_EQ(URLRequestStatus::FAILED, req.status().status()); 5215 EXPECT_EQ(ERR_INVALID_URL, req.status().error()); 5216} 5217 5218// Make sure redirects are cached, despite not reading their bodies. 5219TEST_F(URLRequestTestHTTP, CacheRedirect) { 5220 ASSERT_TRUE(test_server_.Start()); 5221 GURL redirect_url = 5222 test_server_.GetURL("files/redirect302-to-echo-cacheable"); 5223 5224 { 5225 TestDelegate d; 5226 URLRequest req(redirect_url, DEFAULT_PRIORITY, &d, &default_context_); 5227 req.Start(); 5228 base::RunLoop().Run(); 5229 EXPECT_EQ(URLRequestStatus::SUCCESS, req.status().status()); 5230 EXPECT_EQ(1, d.received_redirect_count()); 5231 EXPECT_EQ(test_server_.GetURL("echo"), req.url()); 5232 } 5233 5234 { 5235 TestDelegate d; 5236 d.set_quit_on_redirect(true); 5237 URLRequest req(redirect_url, DEFAULT_PRIORITY, &d, &default_context_); 5238 req.Start(); 5239 base::RunLoop().Run(); 5240 5241 EXPECT_EQ(1, d.received_redirect_count()); 5242 EXPECT_EQ(0, d.response_started_count()); 5243 EXPECT_TRUE(req.was_cached()); 5244 5245 req.FollowDeferredRedirect(); 5246 base::RunLoop().Run(); 5247 EXPECT_EQ(1, d.received_redirect_count()); 5248 EXPECT_EQ(1, d.response_started_count()); 5249 EXPECT_EQ(URLRequestStatus::SUCCESS, req.status().status()); 5250 EXPECT_EQ(test_server_.GetURL("echo"), req.url()); 5251 } 5252} 5253 5254// Make sure a request isn't cached when a NetworkDelegate forces a redirect 5255// when the headers are read, since the body won't have been read. 5256TEST_F(URLRequestTestHTTP, NoCacheOnNetworkDelegateRedirect) { 5257 ASSERT_TRUE(test_server_.Start()); 5258 // URL that is normally cached. 5259 GURL initial_url = test_server_.GetURL("cachetime"); 5260 5261 { 5262 // Set up the TestNetworkDelegate tp force a redirect. 5263 GURL redirect_to_url = test_server_.GetURL("echo"); 5264 default_network_delegate_.set_redirect_on_headers_received_url( 5265 redirect_to_url); 5266 5267 TestDelegate d; 5268 URLRequest req(initial_url, DEFAULT_PRIORITY, &d, &default_context_); 5269 req.Start(); 5270 base::RunLoop().Run(); 5271 EXPECT_EQ(URLRequestStatus::SUCCESS, req.status().status()); 5272 EXPECT_EQ(1, d.received_redirect_count()); 5273 EXPECT_EQ(redirect_to_url, req.url()); 5274 } 5275 5276 { 5277 TestDelegate d; 5278 URLRequest req(initial_url, DEFAULT_PRIORITY, &d, &default_context_); 5279 req.Start(); 5280 base::RunLoop().Run(); 5281 5282 EXPECT_EQ(URLRequestStatus::SUCCESS, req.status().status()); 5283 EXPECT_FALSE(req.was_cached()); 5284 EXPECT_EQ(0, d.received_redirect_count()); 5285 EXPECT_EQ(initial_url, req.url()); 5286 } 5287} 5288 5289// Tests that redirection to an unsafe URL is allowed when it has been marked as 5290// safe. 5291TEST_F(URLRequestTestHTTP, UnsafeRedirectToWhitelistedUnsafeURL) { 5292 ASSERT_TRUE(test_server_.Start()); 5293 5294 GURL unsafe_url("data:text/html,this-is-considered-an-unsafe-url"); 5295 default_network_delegate_.set_redirect_on_headers_received_url(unsafe_url); 5296 default_network_delegate_.set_allowed_unsafe_redirect_url(unsafe_url); 5297 5298 TestDelegate d; 5299 { 5300 URLRequest r(test_server_.GetURL("whatever"), 5301 DEFAULT_PRIORITY, 5302 &d, 5303 &default_context_); 5304 5305 r.Start(); 5306 base::RunLoop().Run(); 5307 5308 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 5309 5310 EXPECT_EQ(2U, r.url_chain().size()); 5311 EXPECT_EQ(net::OK, r.status().error()); 5312 EXPECT_EQ(unsafe_url, r.url()); 5313 EXPECT_EQ("this-is-considered-an-unsafe-url", d.data_received()); 5314 } 5315} 5316 5317// Tests that a redirect to a different unsafe URL is blocked, even after adding 5318// some other URL to the whitelist. 5319TEST_F(URLRequestTestHTTP, UnsafeRedirectToDifferentUnsafeURL) { 5320 ASSERT_TRUE(test_server_.Start()); 5321 5322 GURL unsafe_url("data:text/html,something"); 5323 GURL different_unsafe_url("data:text/html,something-else"); 5324 default_network_delegate_.set_redirect_on_headers_received_url(unsafe_url); 5325 default_network_delegate_.set_allowed_unsafe_redirect_url( 5326 different_unsafe_url); 5327 5328 TestDelegate d; 5329 { 5330 URLRequest r(test_server_.GetURL("whatever"), 5331 DEFAULT_PRIORITY, 5332 &d, 5333 &default_context_); 5334 5335 r.Start(); 5336 base::RunLoop().Run(); 5337 5338 EXPECT_EQ(URLRequestStatus::FAILED, r.status().status()); 5339 EXPECT_EQ(ERR_UNSAFE_REDIRECT, r.status().error()); 5340 } 5341} 5342 5343// Redirects from an URL with fragment to an unsafe URL with fragment should 5344// be allowed, and the reference fragment of the target URL should be preserved. 5345TEST_F(URLRequestTestHTTP, UnsafeRedirectWithDifferentReferenceFragment) { 5346 ASSERT_TRUE(test_server_.Start()); 5347 5348 GURL original_url(test_server_.GetURL("original#fragment1")); 5349 GURL unsafe_url("data:,url-marked-safe-and-used-in-redirect#fragment2"); 5350 GURL expected_url("data:,url-marked-safe-and-used-in-redirect#fragment2"); 5351 5352 default_network_delegate_.set_redirect_on_headers_received_url(unsafe_url); 5353 default_network_delegate_.set_allowed_unsafe_redirect_url(unsafe_url); 5354 5355 TestDelegate d; 5356 { 5357 URLRequest r(original_url, DEFAULT_PRIORITY, &d, &default_context_); 5358 5359 r.Start(); 5360 base::RunLoop().Run(); 5361 5362 EXPECT_EQ(2U, r.url_chain().size()); 5363 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 5364 EXPECT_EQ(net::OK, r.status().error()); 5365 EXPECT_EQ(original_url, r.original_url()); 5366 EXPECT_EQ(expected_url, r.url()); 5367 } 5368} 5369 5370// When a delegate has specified a safe redirect URL, but it does not match the 5371// redirect target, then do not prevent the reference fragment from being added. 5372TEST_F(URLRequestTestHTTP, RedirectWithReferenceFragmentAndUnrelatedUnsafeUrl) { 5373 ASSERT_TRUE(test_server_.Start()); 5374 5375 GURL original_url(test_server_.GetURL("original#expected-fragment")); 5376 GURL unsafe_url("data:text/html,this-url-does-not-match-redirect-url"); 5377 GURL redirect_url(test_server_.GetURL("target")); 5378 GURL expected_redirect_url(test_server_.GetURL("target#expected-fragment")); 5379 5380 default_network_delegate_.set_redirect_on_headers_received_url(redirect_url); 5381 default_network_delegate_.set_allowed_unsafe_redirect_url(unsafe_url); 5382 5383 TestDelegate d; 5384 { 5385 URLRequest r(original_url, DEFAULT_PRIORITY, &d, &default_context_); 5386 5387 r.Start(); 5388 base::RunLoop().Run(); 5389 5390 EXPECT_EQ(2U, r.url_chain().size()); 5391 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 5392 EXPECT_EQ(net::OK, r.status().error()); 5393 EXPECT_EQ(original_url, r.original_url()); 5394 EXPECT_EQ(expected_redirect_url, r.url()); 5395 } 5396} 5397 5398// When a delegate has specified a safe redirect URL, assume that the redirect 5399// URL should not be changed. In particular, the reference fragment should not 5400// be modified. 5401TEST_F(URLRequestTestHTTP, RedirectWithReferenceFragment) { 5402 ASSERT_TRUE(test_server_.Start()); 5403 5404 GURL original_url(test_server_.GetURL("original#should-not-be-appended")); 5405 GURL redirect_url("data:text/html,expect-no-reference-fragment"); 5406 5407 default_network_delegate_.set_redirect_on_headers_received_url(redirect_url); 5408 default_network_delegate_.set_allowed_unsafe_redirect_url(redirect_url); 5409 5410 TestDelegate d; 5411 { 5412 URLRequest r(original_url, DEFAULT_PRIORITY, &d, &default_context_); 5413 5414 r.Start(); 5415 base::RunLoop().Run(); 5416 5417 EXPECT_EQ(2U, r.url_chain().size()); 5418 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 5419 EXPECT_EQ(net::OK, r.status().error()); 5420 EXPECT_EQ(original_url, r.original_url()); 5421 EXPECT_EQ(redirect_url, r.url()); 5422 } 5423} 5424 5425// When a URLRequestRedirectJob is created, the redirection must be followed and 5426// the reference fragment of the target URL must not be modified. 5427TEST_F(URLRequestTestHTTP, RedirectJobWithReferenceFragment) { 5428 ASSERT_TRUE(test_server_.Start()); 5429 5430 GURL original_url(test_server_.GetURL("original#should-not-be-appended")); 5431 GURL redirect_url(test_server_.GetURL("echo")); 5432 5433 TestDelegate d; 5434 URLRequest r(original_url, DEFAULT_PRIORITY, &d, &default_context_); 5435 5436 URLRequestRedirectJob* job = new URLRequestRedirectJob( 5437 &r, &default_network_delegate_, redirect_url, 5438 URLRequestRedirectJob::REDIRECT_302_FOUND, "Very Good Reason"); 5439 AddTestInterceptor()->set_main_intercept_job(job); 5440 5441 r.Start(); 5442 base::RunLoop().Run(); 5443 5444 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 5445 EXPECT_EQ(net::OK, r.status().error()); 5446 EXPECT_EQ(original_url, r.original_url()); 5447 EXPECT_EQ(redirect_url, r.url()); 5448} 5449 5450TEST_F(URLRequestTestHTTP, NoUserPassInReferrer) { 5451 ASSERT_TRUE(test_server_.Start()); 5452 5453 TestDelegate d; 5454 URLRequest req(test_server_.GetURL("echoheader?Referer"), 5455 DEFAULT_PRIORITY, 5456 &d, 5457 &default_context_); 5458 req.SetReferrer("http://user:pass@foo.com/"); 5459 req.Start(); 5460 base::RunLoop().Run(); 5461 5462 EXPECT_EQ(std::string("http://foo.com/"), d.data_received()); 5463} 5464 5465TEST_F(URLRequestTestHTTP, NoFragmentInReferrer) { 5466 ASSERT_TRUE(test_server_.Start()); 5467 5468 TestDelegate d; 5469 URLRequest req(test_server_.GetURL("echoheader?Referer"), 5470 DEFAULT_PRIORITY, 5471 &d, 5472 &default_context_); 5473 req.SetReferrer("http://foo.com/test#fragment"); 5474 req.Start(); 5475 base::RunLoop().Run(); 5476 5477 EXPECT_EQ(std::string("http://foo.com/test"), d.data_received()); 5478} 5479 5480TEST_F(URLRequestTestHTTP, EmptyReferrerAfterValidReferrer) { 5481 ASSERT_TRUE(test_server_.Start()); 5482 5483 TestDelegate d; 5484 URLRequest req(test_server_.GetURL("echoheader?Referer"), 5485 DEFAULT_PRIORITY, 5486 &d, 5487 &default_context_); 5488 req.SetReferrer("http://foo.com/test#fragment"); 5489 req.SetReferrer(""); 5490 req.Start(); 5491 base::RunLoop().Run(); 5492 5493 EXPECT_EQ(std::string("None"), d.data_received()); 5494} 5495 5496// Defer network start and then resume, checking that the request was a success 5497// and bytes were received. 5498TEST_F(URLRequestTestHTTP, DeferredBeforeNetworkStart) { 5499 ASSERT_TRUE(test_server_.Start()); 5500 5501 TestDelegate d; 5502 { 5503 d.set_quit_on_network_start(true); 5504 GURL test_url(test_server_.GetURL("echo")); 5505 URLRequest req(test_url, DEFAULT_PRIORITY, &d, &default_context_); 5506 5507 req.Start(); 5508 base::RunLoop().Run(); 5509 5510 EXPECT_EQ(1, d.received_before_network_start_count()); 5511 EXPECT_EQ(0, d.response_started_count()); 5512 5513 req.ResumeNetworkStart(); 5514 base::RunLoop().Run(); 5515 5516 EXPECT_EQ(1, d.response_started_count()); 5517 EXPECT_NE(0, d.bytes_received()); 5518 EXPECT_EQ(URLRequestStatus::SUCCESS, req.status().status()); 5519 } 5520} 5521 5522// Check that OnBeforeNetworkStart is only called once even if there is a 5523// redirect. 5524TEST_F(URLRequestTestHTTP, BeforeNetworkStartCalledOnce) { 5525 ASSERT_TRUE(test_server_.Start()); 5526 5527 TestDelegate d; 5528 { 5529 d.set_quit_on_redirect(true); 5530 d.set_quit_on_network_start(true); 5531 URLRequest req(test_server_.GetURL("server-redirect?echo"), 5532 DEFAULT_PRIORITY, 5533 &d, 5534 &default_context_); 5535 5536 req.Start(); 5537 base::RunLoop().Run(); 5538 5539 EXPECT_EQ(1, d.received_before_network_start_count()); 5540 EXPECT_EQ(0, d.response_started_count()); 5541 EXPECT_EQ(0, d.received_redirect_count()); 5542 5543 req.ResumeNetworkStart(); 5544 base::RunLoop().Run(); 5545 5546 EXPECT_EQ(1, d.received_redirect_count()); 5547 req.FollowDeferredRedirect(); 5548 base::RunLoop().Run(); 5549 5550 // Check that the redirect's new network transaction does not get propagated 5551 // to a second OnBeforeNetworkStart() notification. 5552 EXPECT_EQ(1, d.received_before_network_start_count()); 5553 5554 EXPECT_EQ(1, d.response_started_count()); 5555 EXPECT_NE(0, d.bytes_received()); 5556 EXPECT_EQ(URLRequestStatus::SUCCESS, req.status().status()); 5557 } 5558} 5559 5560// Cancel the request after learning that the request would use the network. 5561TEST_F(URLRequestTestHTTP, CancelOnBeforeNetworkStart) { 5562 ASSERT_TRUE(test_server_.Start()); 5563 5564 TestDelegate d; 5565 { 5566 d.set_quit_on_network_start(true); 5567 GURL test_url(test_server_.GetURL("echo")); 5568 URLRequest req(test_url, DEFAULT_PRIORITY, &d, &default_context_); 5569 5570 req.Start(); 5571 base::RunLoop().Run(); 5572 5573 EXPECT_EQ(1, d.received_before_network_start_count()); 5574 EXPECT_EQ(0, d.response_started_count()); 5575 5576 req.Cancel(); 5577 base::RunLoop().Run(); 5578 5579 EXPECT_EQ(1, d.response_started_count()); 5580 EXPECT_EQ(0, d.bytes_received()); 5581 EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status()); 5582 } 5583} 5584 5585TEST_F(URLRequestTestHTTP, CancelRedirect) { 5586 ASSERT_TRUE(test_server_.Start()); 5587 5588 TestDelegate d; 5589 { 5590 d.set_cancel_in_received_redirect(true); 5591 URLRequest req(test_server_.GetURL("files/redirect-test.html"), 5592 DEFAULT_PRIORITY, 5593 &d, 5594 &default_context_); 5595 req.Start(); 5596 base::RunLoop().Run(); 5597 5598 EXPECT_EQ(1, d.response_started_count()); 5599 EXPECT_EQ(0, d.bytes_received()); 5600 EXPECT_FALSE(d.received_data_before_response()); 5601 EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status()); 5602 } 5603} 5604 5605TEST_F(URLRequestTestHTTP, DeferredRedirect) { 5606 ASSERT_TRUE(test_server_.Start()); 5607 5608 TestDelegate d; 5609 { 5610 d.set_quit_on_redirect(true); 5611 GURL test_url(test_server_.GetURL("files/redirect-test.html")); 5612 URLRequest req(test_url, DEFAULT_PRIORITY, &d, &default_context_); 5613 5614 req.Start(); 5615 base::RunLoop().Run(); 5616 5617 EXPECT_EQ(1, d.received_redirect_count()); 5618 5619 req.FollowDeferredRedirect(); 5620 base::RunLoop().Run(); 5621 5622 EXPECT_EQ(1, d.response_started_count()); 5623 EXPECT_FALSE(d.received_data_before_response()); 5624 EXPECT_EQ(URLRequestStatus::SUCCESS, req.status().status()); 5625 5626 base::FilePath path; 5627 PathService::Get(base::DIR_SOURCE_ROOT, &path); 5628 path = path.Append(FILE_PATH_LITERAL("net")); 5629 path = path.Append(FILE_PATH_LITERAL("data")); 5630 path = path.Append(FILE_PATH_LITERAL("url_request_unittest")); 5631 path = path.Append(FILE_PATH_LITERAL("with-headers.html")); 5632 5633 std::string contents; 5634 EXPECT_TRUE(base::ReadFileToString(path, &contents)); 5635 EXPECT_EQ(contents, d.data_received()); 5636 } 5637} 5638 5639TEST_F(URLRequestTestHTTP, DeferredRedirect_GetFullRequestHeaders) { 5640 ASSERT_TRUE(test_server_.Start()); 5641 5642 TestDelegate d; 5643 { 5644 d.set_quit_on_redirect(true); 5645 GURL test_url(test_server_.GetURL("files/redirect-test.html")); 5646 URLRequest req(test_url, DEFAULT_PRIORITY, &d, &default_context_); 5647 5648 EXPECT_FALSE(d.have_full_request_headers()); 5649 5650 req.Start(); 5651 base::RunLoop().Run(); 5652 5653 EXPECT_EQ(1, d.received_redirect_count()); 5654 EXPECT_TRUE(d.have_full_request_headers()); 5655 CheckFullRequestHeaders(d.full_request_headers(), test_url); 5656 d.ClearFullRequestHeaders(); 5657 5658 req.FollowDeferredRedirect(); 5659 base::RunLoop().Run(); 5660 5661 GURL target_url(test_server_.GetURL("files/with-headers.html")); 5662 EXPECT_EQ(1, d.response_started_count()); 5663 EXPECT_TRUE(d.have_full_request_headers()); 5664 CheckFullRequestHeaders(d.full_request_headers(), target_url); 5665 EXPECT_FALSE(d.received_data_before_response()); 5666 EXPECT_EQ(URLRequestStatus::SUCCESS, req.status().status()); 5667 5668 base::FilePath path; 5669 PathService::Get(base::DIR_SOURCE_ROOT, &path); 5670 path = path.Append(FILE_PATH_LITERAL("net")); 5671 path = path.Append(FILE_PATH_LITERAL("data")); 5672 path = path.Append(FILE_PATH_LITERAL("url_request_unittest")); 5673 path = path.Append(FILE_PATH_LITERAL("with-headers.html")); 5674 5675 std::string contents; 5676 EXPECT_TRUE(base::ReadFileToString(path, &contents)); 5677 EXPECT_EQ(contents, d.data_received()); 5678 } 5679} 5680 5681TEST_F(URLRequestTestHTTP, CancelDeferredRedirect) { 5682 ASSERT_TRUE(test_server_.Start()); 5683 5684 TestDelegate d; 5685 { 5686 d.set_quit_on_redirect(true); 5687 URLRequest req(test_server_.GetURL("files/redirect-test.html"), 5688 DEFAULT_PRIORITY, 5689 &d, 5690 &default_context_); 5691 req.Start(); 5692 base::RunLoop().Run(); 5693 5694 EXPECT_EQ(1, d.received_redirect_count()); 5695 5696 req.Cancel(); 5697 base::RunLoop().Run(); 5698 5699 EXPECT_EQ(1, d.response_started_count()); 5700 EXPECT_EQ(0, d.bytes_received()); 5701 EXPECT_FALSE(d.received_data_before_response()); 5702 EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status()); 5703 } 5704} 5705 5706TEST_F(URLRequestTestHTTP, VaryHeader) { 5707 ASSERT_TRUE(test_server_.Start()); 5708 5709 // Populate the cache. 5710 { 5711 TestDelegate d; 5712 URLRequest req(test_server_.GetURL("echoheadercache?foo"), 5713 DEFAULT_PRIORITY, 5714 &d, 5715 &default_context_); 5716 HttpRequestHeaders headers; 5717 headers.SetHeader("foo", "1"); 5718 req.SetExtraRequestHeaders(headers); 5719 req.Start(); 5720 base::RunLoop().Run(); 5721 5722 LoadTimingInfo load_timing_info; 5723 req.GetLoadTimingInfo(&load_timing_info); 5724 TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES); 5725 } 5726 5727 // Expect a cache hit. 5728 { 5729 TestDelegate d; 5730 URLRequest req(test_server_.GetURL("echoheadercache?foo"), 5731 DEFAULT_PRIORITY, 5732 &d, 5733 &default_context_); 5734 HttpRequestHeaders headers; 5735 headers.SetHeader("foo", "1"); 5736 req.SetExtraRequestHeaders(headers); 5737 req.Start(); 5738 base::RunLoop().Run(); 5739 5740 EXPECT_TRUE(req.was_cached()); 5741 5742 LoadTimingInfo load_timing_info; 5743 req.GetLoadTimingInfo(&load_timing_info); 5744 TestLoadTimingCacheHitNoNetwork(load_timing_info); 5745 } 5746 5747 // Expect a cache miss. 5748 { 5749 TestDelegate d; 5750 URLRequest req(test_server_.GetURL("echoheadercache?foo"), 5751 DEFAULT_PRIORITY, 5752 &d, 5753 &default_context_); 5754 HttpRequestHeaders headers; 5755 headers.SetHeader("foo", "2"); 5756 req.SetExtraRequestHeaders(headers); 5757 req.Start(); 5758 base::RunLoop().Run(); 5759 5760 EXPECT_FALSE(req.was_cached()); 5761 5762 LoadTimingInfo load_timing_info; 5763 req.GetLoadTimingInfo(&load_timing_info); 5764 TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES); 5765 } 5766} 5767 5768TEST_F(URLRequestTestHTTP, BasicAuth) { 5769 ASSERT_TRUE(test_server_.Start()); 5770 5771 // populate the cache 5772 { 5773 TestDelegate d; 5774 d.set_credentials(AuthCredentials(kUser, kSecret)); 5775 5776 URLRequest r(test_server_.GetURL("auth-basic"), 5777 DEFAULT_PRIORITY, 5778 &d, 5779 &default_context_); 5780 r.Start(); 5781 5782 base::RunLoop().Run(); 5783 5784 EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos); 5785 } 5786 5787 // repeat request with end-to-end validation. since auth-basic results in a 5788 // cachable page, we expect this test to result in a 304. in which case, the 5789 // response should be fetched from the cache. 5790 { 5791 TestDelegate d; 5792 d.set_credentials(AuthCredentials(kUser, kSecret)); 5793 5794 URLRequest r(test_server_.GetURL("auth-basic"), 5795 DEFAULT_PRIORITY, 5796 &d, 5797 &default_context_); 5798 r.SetLoadFlags(LOAD_VALIDATE_CACHE); 5799 r.Start(); 5800 5801 base::RunLoop().Run(); 5802 5803 EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos); 5804 5805 // Should be the same cached document. 5806 EXPECT_TRUE(r.was_cached()); 5807 } 5808} 5809 5810// Check that Set-Cookie headers in 401 responses are respected. 5811// http://crbug.com/6450 5812TEST_F(URLRequestTestHTTP, BasicAuthWithCookies) { 5813 ASSERT_TRUE(test_server_.Start()); 5814 5815 GURL url_requiring_auth = 5816 test_server_.GetURL("auth-basic?set-cookie-if-challenged"); 5817 5818 // Request a page that will give a 401 containing a Set-Cookie header. 5819 // Verify that when the transaction is restarted, it includes the new cookie. 5820 { 5821 TestNetworkDelegate network_delegate; // Must outlive URLRequest. 5822 TestURLRequestContext context(true); 5823 context.set_network_delegate(&network_delegate); 5824 context.Init(); 5825 5826 TestDelegate d; 5827 d.set_credentials(AuthCredentials(kUser, kSecret)); 5828 5829 URLRequest r(url_requiring_auth, DEFAULT_PRIORITY, &d, &context); 5830 r.Start(); 5831 5832 base::RunLoop().Run(); 5833 5834 EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos); 5835 5836 // Make sure we sent the cookie in the restarted transaction. 5837 EXPECT_TRUE(d.data_received().find("Cookie: got_challenged=true") 5838 != std::string::npos); 5839 } 5840 5841 // Same test as above, except this time the restart is initiated earlier 5842 // (without user intervention since identity is embedded in the URL). 5843 { 5844 TestNetworkDelegate network_delegate; // Must outlive URLRequest. 5845 TestURLRequestContext context(true); 5846 context.set_network_delegate(&network_delegate); 5847 context.Init(); 5848 5849 TestDelegate d; 5850 5851 GURL::Replacements replacements; 5852 std::string username("user2"); 5853 std::string password("secret"); 5854 replacements.SetUsernameStr(username); 5855 replacements.SetPasswordStr(password); 5856 GURL url_with_identity = url_requiring_auth.ReplaceComponents(replacements); 5857 5858 URLRequest r(url_with_identity, DEFAULT_PRIORITY, &d, &context); 5859 r.Start(); 5860 5861 base::RunLoop().Run(); 5862 5863 EXPECT_TRUE(d.data_received().find("user2/secret") != std::string::npos); 5864 5865 // Make sure we sent the cookie in the restarted transaction. 5866 EXPECT_TRUE(d.data_received().find("Cookie: got_challenged=true") 5867 != std::string::npos); 5868 } 5869} 5870 5871// Tests that load timing works as expected with auth and the cache. 5872TEST_F(URLRequestTestHTTP, BasicAuthLoadTiming) { 5873 ASSERT_TRUE(test_server_.Start()); 5874 5875 // populate the cache 5876 { 5877 TestDelegate d; 5878 d.set_credentials(AuthCredentials(kUser, kSecret)); 5879 5880 URLRequest r(test_server_.GetURL("auth-basic"), 5881 DEFAULT_PRIORITY, 5882 &d, 5883 &default_context_); 5884 r.Start(); 5885 5886 base::RunLoop().Run(); 5887 5888 EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos); 5889 5890 LoadTimingInfo load_timing_info_before_auth; 5891 EXPECT_TRUE(default_network_delegate_.GetLoadTimingInfoBeforeAuth( 5892 &load_timing_info_before_auth)); 5893 TestLoadTimingNotReused(load_timing_info_before_auth, 5894 CONNECT_TIMING_HAS_DNS_TIMES); 5895 5896 LoadTimingInfo load_timing_info; 5897 r.GetLoadTimingInfo(&load_timing_info); 5898 // The test server does not support keep alive sockets, so the second 5899 // request with auth should use a new socket. 5900 TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES); 5901 EXPECT_NE(load_timing_info_before_auth.socket_log_id, 5902 load_timing_info.socket_log_id); 5903 EXPECT_LE(load_timing_info_before_auth.receive_headers_end, 5904 load_timing_info.connect_timing.connect_start); 5905 } 5906 5907 // Repeat request with end-to-end validation. Since auth-basic results in a 5908 // cachable page, we expect this test to result in a 304. In which case, the 5909 // response should be fetched from the cache. 5910 { 5911 TestDelegate d; 5912 d.set_credentials(AuthCredentials(kUser, kSecret)); 5913 5914 URLRequest r(test_server_.GetURL("auth-basic"), 5915 DEFAULT_PRIORITY, 5916 &d, 5917 &default_context_); 5918 r.SetLoadFlags(LOAD_VALIDATE_CACHE); 5919 r.Start(); 5920 5921 base::RunLoop().Run(); 5922 5923 EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos); 5924 5925 // Should be the same cached document. 5926 EXPECT_TRUE(r.was_cached()); 5927 5928 // Since there was a request that went over the wire, the load timing 5929 // information should include connection times. 5930 LoadTimingInfo load_timing_info; 5931 r.GetLoadTimingInfo(&load_timing_info); 5932 TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES); 5933 } 5934} 5935 5936// In this test, we do a POST which the server will 302 redirect. 5937// The subsequent transaction should use GET, and should not send the 5938// Content-Type header. 5939// http://code.google.com/p/chromium/issues/detail?id=843 5940TEST_F(URLRequestTestHTTP, Post302RedirectGet) { 5941 ASSERT_TRUE(test_server_.Start()); 5942 5943 const char kData[] = "hello world"; 5944 5945 TestDelegate d; 5946 URLRequest req(test_server_.GetURL("files/redirect-to-echoall"), 5947 DEFAULT_PRIORITY, 5948 &d, 5949 &default_context_); 5950 req.set_method("POST"); 5951 req.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData))); 5952 5953 // Set headers (some of which are specific to the POST). 5954 HttpRequestHeaders headers; 5955 headers.AddHeadersFromString( 5956 "Content-Type: multipart/form-data; " 5957 "boundary=----WebKitFormBoundaryAADeAA+NAAWMAAwZ\r\n" 5958 "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9," 5959 "text/plain;q=0.8,image/png,*/*;q=0.5\r\n" 5960 "Accept-Language: en-US,en\r\n" 5961 "Accept-Charset: ISO-8859-1,*,utf-8\r\n" 5962 "Content-Length: 11\r\n" 5963 "Origin: http://localhost:1337/"); 5964 req.SetExtraRequestHeaders(headers); 5965 req.Start(); 5966 base::RunLoop().Run(); 5967 5968 std::string mime_type; 5969 req.GetMimeType(&mime_type); 5970 EXPECT_EQ("text/html", mime_type); 5971 5972 const std::string& data = d.data_received(); 5973 5974 // Check that the post-specific headers were stripped: 5975 EXPECT_FALSE(ContainsString(data, "Content-Length:")); 5976 EXPECT_FALSE(ContainsString(data, "Content-Type:")); 5977 EXPECT_FALSE(ContainsString(data, "Origin:")); 5978 5979 // These extra request headers should not have been stripped. 5980 EXPECT_TRUE(ContainsString(data, "Accept:")); 5981 EXPECT_TRUE(ContainsString(data, "Accept-Language:")); 5982 EXPECT_TRUE(ContainsString(data, "Accept-Charset:")); 5983} 5984 5985// The following tests check that we handle mutating the request method for 5986// HTTP redirects as expected. 5987// See http://crbug.com/56373 and http://crbug.com/102130. 5988 5989TEST_F(URLRequestTestHTTP, Redirect301Tests) { 5990 ASSERT_TRUE(test_server_.Start()); 5991 5992 const GURL url = test_server_.GetURL("files/redirect301-to-echo"); 5993 5994 HTTPRedirectMethodTest(url, "POST", "GET", true); 5995 HTTPRedirectMethodTest(url, "PUT", "PUT", true); 5996 HTTPRedirectMethodTest(url, "HEAD", "HEAD", false); 5997} 5998 5999TEST_F(URLRequestTestHTTP, Redirect302Tests) { 6000 ASSERT_TRUE(test_server_.Start()); 6001 6002 const GURL url = test_server_.GetURL("files/redirect302-to-echo"); 6003 6004 HTTPRedirectMethodTest(url, "POST", "GET", true); 6005 HTTPRedirectMethodTest(url, "PUT", "PUT", true); 6006 HTTPRedirectMethodTest(url, "HEAD", "HEAD", false); 6007} 6008 6009TEST_F(URLRequestTestHTTP, Redirect303Tests) { 6010 ASSERT_TRUE(test_server_.Start()); 6011 6012 const GURL url = test_server_.GetURL("files/redirect303-to-echo"); 6013 6014 HTTPRedirectMethodTest(url, "POST", "GET", true); 6015 HTTPRedirectMethodTest(url, "PUT", "GET", true); 6016 HTTPRedirectMethodTest(url, "HEAD", "HEAD", false); 6017} 6018 6019TEST_F(URLRequestTestHTTP, Redirect307Tests) { 6020 ASSERT_TRUE(test_server_.Start()); 6021 6022 const GURL url = test_server_.GetURL("files/redirect307-to-echo"); 6023 6024 HTTPRedirectMethodTest(url, "POST", "POST", true); 6025 HTTPRedirectMethodTest(url, "PUT", "PUT", true); 6026 HTTPRedirectMethodTest(url, "HEAD", "HEAD", false); 6027} 6028 6029TEST_F(URLRequestTestHTTP, Redirect308Tests) { 6030 ASSERT_TRUE(test_server_.Start()); 6031 6032 const GURL url = test_server_.GetURL("files/redirect308-to-echo"); 6033 6034 HTTPRedirectMethodTest(url, "POST", "POST", true); 6035 HTTPRedirectMethodTest(url, "PUT", "PUT", true); 6036 HTTPRedirectMethodTest(url, "HEAD", "HEAD", false); 6037} 6038 6039// Make sure that 308 responses without bodies are not treated as redirects. 6040// Certain legacy apis that pre-date the response code expect this behavior 6041// (Like Google Drive). 6042TEST_F(URLRequestTestHTTP, NoRedirectOn308WithoutLocationHeader) { 6043 ASSERT_TRUE(test_server_.Start()); 6044 6045 TestDelegate d; 6046 const GURL url = test_server_.GetURL("files/308-without-location-header"); 6047 6048 URLRequest request(url, DEFAULT_PRIORITY, &d, &default_context_); 6049 6050 request.Start(); 6051 base::RunLoop().Run(); 6052 EXPECT_EQ(URLRequestStatus::SUCCESS, request.status().status()); 6053 EXPECT_EQ(OK, request.status().error()); 6054 EXPECT_EQ(0, d.received_redirect_count()); 6055 EXPECT_EQ(308, request.response_headers()->response_code()); 6056 EXPECT_EQ("This is not a redirect.", d.data_received()); 6057} 6058 6059TEST_F(URLRequestTestHTTP, Redirect302PreserveReferenceFragment) { 6060 ASSERT_TRUE(test_server_.Start()); 6061 6062 GURL original_url(test_server_.GetURL("files/redirect302-to-echo#fragment")); 6063 GURL expected_url(test_server_.GetURL("echo#fragment")); 6064 6065 TestDelegate d; 6066 { 6067 URLRequest r(original_url, DEFAULT_PRIORITY, &d, &default_context_); 6068 6069 r.Start(); 6070 base::RunLoop().Run(); 6071 6072 EXPECT_EQ(2U, r.url_chain().size()); 6073 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 6074 EXPECT_EQ(net::OK, r.status().error()); 6075 EXPECT_EQ(original_url, r.original_url()); 6076 EXPECT_EQ(expected_url, r.url()); 6077 } 6078} 6079 6080TEST_F(URLRequestTestHTTP, InterceptPost302RedirectGet) { 6081 ASSERT_TRUE(test_server_.Start()); 6082 6083 const char kData[] = "hello world"; 6084 6085 TestDelegate d; 6086 URLRequest req(test_server_.GetURL("empty.html"), 6087 DEFAULT_PRIORITY, 6088 &d, 6089 &default_context_); 6090 req.set_method("POST"); 6091 req.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData))); 6092 HttpRequestHeaders headers; 6093 headers.SetHeader(HttpRequestHeaders::kContentLength, 6094 base::UintToString(arraysize(kData) - 1)); 6095 req.SetExtraRequestHeaders(headers); 6096 6097 URLRequestRedirectJob* job = new URLRequestRedirectJob( 6098 &req, &default_network_delegate_, test_server_.GetURL("echo"), 6099 URLRequestRedirectJob::REDIRECT_302_FOUND, "Very Good Reason"); 6100 AddTestInterceptor()->set_main_intercept_job(job); 6101 6102 req.Start(); 6103 base::RunLoop().Run(); 6104 EXPECT_EQ("GET", req.method()); 6105} 6106 6107TEST_F(URLRequestTestHTTP, InterceptPost307RedirectPost) { 6108 ASSERT_TRUE(test_server_.Start()); 6109 6110 const char kData[] = "hello world"; 6111 6112 TestDelegate d; 6113 URLRequest req(test_server_.GetURL("empty.html"), 6114 DEFAULT_PRIORITY, 6115 &d, 6116 &default_context_); 6117 req.set_method("POST"); 6118 req.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData))); 6119 HttpRequestHeaders headers; 6120 headers.SetHeader(HttpRequestHeaders::kContentLength, 6121 base::UintToString(arraysize(kData) - 1)); 6122 req.SetExtraRequestHeaders(headers); 6123 6124 URLRequestRedirectJob* job = new URLRequestRedirectJob( 6125 &req, &default_network_delegate_, test_server_.GetURL("echo"), 6126 URLRequestRedirectJob::REDIRECT_307_TEMPORARY_REDIRECT, 6127 "Very Good Reason"); 6128 AddTestInterceptor()->set_main_intercept_job(job); 6129 6130 req.Start(); 6131 base::RunLoop().Run(); 6132 EXPECT_EQ("POST", req.method()); 6133 EXPECT_EQ(kData, d.data_received()); 6134} 6135 6136// Check that default A-L header is sent. 6137TEST_F(URLRequestTestHTTP, DefaultAcceptLanguage) { 6138 ASSERT_TRUE(test_server_.Start()); 6139 6140 StaticHttpUserAgentSettings settings("en", std::string()); 6141 TestNetworkDelegate network_delegate; // Must outlive URLRequests. 6142 TestURLRequestContext context(true); 6143 context.set_network_delegate(&network_delegate); 6144 context.set_http_user_agent_settings(&settings); 6145 context.Init(); 6146 6147 TestDelegate d; 6148 URLRequest req(test_server_.GetURL("echoheader?Accept-Language"), 6149 DEFAULT_PRIORITY, 6150 &d, 6151 &context); 6152 req.Start(); 6153 base::RunLoop().Run(); 6154 EXPECT_EQ("en", d.data_received()); 6155} 6156 6157// Check that an empty A-L header is not sent. http://crbug.com/77365. 6158TEST_F(URLRequestTestHTTP, EmptyAcceptLanguage) { 6159 ASSERT_TRUE(test_server_.Start()); 6160 6161 std::string empty_string; // Avoid most vexing parse on line below. 6162 StaticHttpUserAgentSettings settings(empty_string, empty_string); 6163 TestNetworkDelegate network_delegate; // Must outlive URLRequests. 6164 TestURLRequestContext context(true); 6165 context.set_network_delegate(&network_delegate); 6166 context.Init(); 6167 // We override the language after initialization because empty entries 6168 // get overridden by Init(). 6169 context.set_http_user_agent_settings(&settings); 6170 6171 TestDelegate d; 6172 URLRequest req(test_server_.GetURL("echoheader?Accept-Language"), 6173 DEFAULT_PRIORITY, 6174 &d, 6175 &context); 6176 req.Start(); 6177 base::RunLoop().Run(); 6178 EXPECT_EQ("None", d.data_received()); 6179} 6180 6181// Check that if request overrides the A-L header, the default is not appended. 6182// See http://crbug.com/20894 6183TEST_F(URLRequestTestHTTP, OverrideAcceptLanguage) { 6184 ASSERT_TRUE(test_server_.Start()); 6185 6186 TestDelegate d; 6187 URLRequest req(test_server_.GetURL("echoheader?Accept-Language"), 6188 DEFAULT_PRIORITY, 6189 &d, 6190 &default_context_); 6191 HttpRequestHeaders headers; 6192 headers.SetHeader(HttpRequestHeaders::kAcceptLanguage, "ru"); 6193 req.SetExtraRequestHeaders(headers); 6194 req.Start(); 6195 base::RunLoop().Run(); 6196 EXPECT_EQ(std::string("ru"), d.data_received()); 6197} 6198 6199// Check that default A-E header is sent. 6200TEST_F(URLRequestTestHTTP, DefaultAcceptEncoding) { 6201 ASSERT_TRUE(test_server_.Start()); 6202 6203 TestDelegate d; 6204 URLRequest req(test_server_.GetURL("echoheader?Accept-Encoding"), 6205 DEFAULT_PRIORITY, 6206 &d, 6207 &default_context_); 6208 HttpRequestHeaders headers; 6209 req.SetExtraRequestHeaders(headers); 6210 req.Start(); 6211 base::RunLoop().Run(); 6212 EXPECT_TRUE(ContainsString(d.data_received(), "gzip")); 6213} 6214 6215// Check that if request overrides the A-E header, the default is not appended. 6216// See http://crbug.com/47381 6217TEST_F(URLRequestTestHTTP, OverrideAcceptEncoding) { 6218 ASSERT_TRUE(test_server_.Start()); 6219 6220 TestDelegate d; 6221 URLRequest req(test_server_.GetURL("echoheader?Accept-Encoding"), 6222 DEFAULT_PRIORITY, 6223 &d, 6224 &default_context_); 6225 HttpRequestHeaders headers; 6226 headers.SetHeader(HttpRequestHeaders::kAcceptEncoding, "identity"); 6227 req.SetExtraRequestHeaders(headers); 6228 req.Start(); 6229 base::RunLoop().Run(); 6230 EXPECT_FALSE(ContainsString(d.data_received(), "gzip")); 6231 EXPECT_TRUE(ContainsString(d.data_received(), "identity")); 6232} 6233 6234// Check that setting the A-C header sends the proper header. 6235TEST_F(URLRequestTestHTTP, SetAcceptCharset) { 6236 ASSERT_TRUE(test_server_.Start()); 6237 6238 TestDelegate d; 6239 URLRequest req(test_server_.GetURL("echoheader?Accept-Charset"), 6240 DEFAULT_PRIORITY, 6241 &d, 6242 &default_context_); 6243 HttpRequestHeaders headers; 6244 headers.SetHeader(HttpRequestHeaders::kAcceptCharset, "koi-8r"); 6245 req.SetExtraRequestHeaders(headers); 6246 req.Start(); 6247 base::RunLoop().Run(); 6248 EXPECT_EQ(std::string("koi-8r"), d.data_received()); 6249} 6250 6251// Check that default User-Agent header is sent. 6252TEST_F(URLRequestTestHTTP, DefaultUserAgent) { 6253 ASSERT_TRUE(test_server_.Start()); 6254 6255 TestDelegate d; 6256 URLRequest req(test_server_.GetURL("echoheader?User-Agent"), 6257 DEFAULT_PRIORITY, 6258 &d, 6259 &default_context_); 6260 req.Start(); 6261 base::RunLoop().Run(); 6262 EXPECT_EQ(req.context()->http_user_agent_settings()->GetUserAgent(), 6263 d.data_received()); 6264} 6265 6266// Check that if request overrides the User-Agent header, 6267// the default is not appended. 6268TEST_F(URLRequestTestHTTP, OverrideUserAgent) { 6269 ASSERT_TRUE(test_server_.Start()); 6270 6271 TestDelegate d; 6272 URLRequest req(test_server_.GetURL("echoheader?User-Agent"), 6273 DEFAULT_PRIORITY, 6274 &d, 6275 &default_context_); 6276 HttpRequestHeaders headers; 6277 headers.SetHeader(HttpRequestHeaders::kUserAgent, "Lynx (textmode)"); 6278 req.SetExtraRequestHeaders(headers); 6279 req.Start(); 6280 base::RunLoop().Run(); 6281 EXPECT_EQ(std::string("Lynx (textmode)"), d.data_received()); 6282} 6283 6284// Check that a NULL HttpUserAgentSettings causes the corresponding empty 6285// User-Agent header to be sent but does not send the Accept-Language and 6286// Accept-Charset headers. 6287TEST_F(URLRequestTestHTTP, EmptyHttpUserAgentSettings) { 6288 ASSERT_TRUE(test_server_.Start()); 6289 6290 TestNetworkDelegate network_delegate; // Must outlive URLRequests. 6291 TestURLRequestContext context(true); 6292 context.set_network_delegate(&network_delegate); 6293 context.Init(); 6294 // We override the HttpUserAgentSettings after initialization because empty 6295 // entries get overridden by Init(). 6296 context.set_http_user_agent_settings(NULL); 6297 6298 struct { 6299 const char* request; 6300 const char* expected_response; 6301 } tests[] = { { "echoheader?Accept-Language", "None" }, 6302 { "echoheader?Accept-Charset", "None" }, 6303 { "echoheader?User-Agent", "" } }; 6304 6305 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); i++) { 6306 TestDelegate d; 6307 URLRequest req( 6308 test_server_.GetURL(tests[i].request), DEFAULT_PRIORITY, &d, &context); 6309 req.Start(); 6310 base::RunLoop().Run(); 6311 EXPECT_EQ(tests[i].expected_response, d.data_received()) 6312 << " Request = \"" << tests[i].request << "\""; 6313 } 6314} 6315 6316// Make sure that URLRequest passes on its priority updates to 6317// newly-created jobs after the first one. 6318TEST_F(URLRequestTestHTTP, SetSubsequentJobPriority) { 6319 ASSERT_TRUE(test_server_.Start()); 6320 6321 TestDelegate d; 6322 URLRequest req(test_server_.GetURL("empty.html"), 6323 DEFAULT_PRIORITY, 6324 &d, 6325 &default_context_); 6326 EXPECT_EQ(DEFAULT_PRIORITY, req.priority()); 6327 6328 scoped_refptr<URLRequestRedirectJob> redirect_job = 6329 new URLRequestRedirectJob( 6330 &req, &default_network_delegate_, test_server_.GetURL("echo"), 6331 URLRequestRedirectJob::REDIRECT_302_FOUND, "Very Good Reason"); 6332 AddTestInterceptor()->set_main_intercept_job(redirect_job.get()); 6333 6334 req.SetPriority(LOW); 6335 req.Start(); 6336 EXPECT_TRUE(req.is_pending()); 6337 6338 scoped_refptr<URLRequestTestJob> job = 6339 new URLRequestTestJob(&req, &default_network_delegate_); 6340 AddTestInterceptor()->set_main_intercept_job(job.get()); 6341 6342 // Should trigger |job| to be started. 6343 base::RunLoop().Run(); 6344 EXPECT_EQ(LOW, job->priority()); 6345} 6346 6347// Check that creating a network request while entering/exiting suspend mode 6348// fails as it should. This is the only case where an HttpTransactionFactory 6349// does not return an HttpTransaction. 6350TEST_F(URLRequestTestHTTP, NetworkSuspendTest) { 6351 // Create a new HttpNetworkLayer that thinks it's suspended. 6352 HttpNetworkSession::Params params; 6353 params.host_resolver = default_context_.host_resolver(); 6354 params.cert_verifier = default_context_.cert_verifier(); 6355 params.transport_security_state = default_context_.transport_security_state(); 6356 params.proxy_service = default_context_.proxy_service(); 6357 params.ssl_config_service = default_context_.ssl_config_service(); 6358 params.http_auth_handler_factory = 6359 default_context_.http_auth_handler_factory(); 6360 params.network_delegate = &default_network_delegate_; 6361 params.http_server_properties = default_context_.http_server_properties(); 6362 scoped_ptr<HttpNetworkLayer> network_layer( 6363 new HttpNetworkLayer(new HttpNetworkSession(params))); 6364 network_layer->OnSuspend(); 6365 6366 HttpCache http_cache(network_layer.release(), default_context_.net_log(), 6367 HttpCache::DefaultBackend::InMemory(0)); 6368 6369 TestURLRequestContext context(true); 6370 context.set_http_transaction_factory(&http_cache); 6371 context.Init(); 6372 6373 TestDelegate d; 6374 URLRequest req(GURL("http://127.0.0.1/"), 6375 DEFAULT_PRIORITY, 6376 &d, 6377 &context); 6378 req.Start(); 6379 base::RunLoop().Run(); 6380 6381 EXPECT_TRUE(d.request_failed()); 6382 EXPECT_EQ(URLRequestStatus::FAILED, req.status().status()); 6383 EXPECT_EQ(ERR_NETWORK_IO_SUSPENDED, req.status().error()); 6384} 6385 6386// Check that creating a network request while entering/exiting suspend mode 6387// fails as it should in the case there is no cache. This is the only case 6388// where an HttpTransactionFactory does not return an HttpTransaction. 6389TEST_F(URLRequestTestHTTP, NetworkSuspendTestNoCache) { 6390 // Create a new HttpNetworkLayer that thinks it's suspended. 6391 HttpNetworkSession::Params params; 6392 params.host_resolver = default_context_.host_resolver(); 6393 params.cert_verifier = default_context_.cert_verifier(); 6394 params.transport_security_state = default_context_.transport_security_state(); 6395 params.proxy_service = default_context_.proxy_service(); 6396 params.ssl_config_service = default_context_.ssl_config_service(); 6397 params.http_auth_handler_factory = 6398 default_context_.http_auth_handler_factory(); 6399 params.network_delegate = &default_network_delegate_; 6400 params.http_server_properties = default_context_.http_server_properties(); 6401 HttpNetworkLayer network_layer(new HttpNetworkSession(params)); 6402 network_layer.OnSuspend(); 6403 6404 TestURLRequestContext context(true); 6405 context.set_http_transaction_factory(&network_layer); 6406 context.Init(); 6407 6408 TestDelegate d; 6409 URLRequest req(GURL("http://127.0.0.1/"), 6410 DEFAULT_PRIORITY, 6411 &d, 6412 &context); 6413 req.Start(); 6414 base::RunLoop().Run(); 6415 6416 EXPECT_TRUE(d.request_failed()); 6417 EXPECT_EQ(URLRequestStatus::FAILED, req.status().status()); 6418 EXPECT_EQ(ERR_NETWORK_IO_SUSPENDED, req.status().error()); 6419} 6420 6421class HTTPSRequestTest : public testing::Test { 6422 public: 6423 HTTPSRequestTest() : default_context_(true) { 6424 default_context_.set_network_delegate(&default_network_delegate_); 6425 default_context_.Init(); 6426 } 6427 virtual ~HTTPSRequestTest() {} 6428 6429 protected: 6430 TestNetworkDelegate default_network_delegate_; // Must outlive URLRequest. 6431 TestURLRequestContext default_context_; 6432}; 6433 6434TEST_F(HTTPSRequestTest, HTTPSGetTest) { 6435 SpawnedTestServer test_server( 6436 SpawnedTestServer::TYPE_HTTPS, 6437 SpawnedTestServer::kLocalhost, 6438 base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 6439 ASSERT_TRUE(test_server.Start()); 6440 6441 TestDelegate d; 6442 { 6443 URLRequest r(test_server.GetURL(std::string()), 6444 DEFAULT_PRIORITY, 6445 &d, 6446 &default_context_); 6447 r.Start(); 6448 EXPECT_TRUE(r.is_pending()); 6449 6450 base::RunLoop().Run(); 6451 6452 EXPECT_EQ(1, d.response_started_count()); 6453 EXPECT_FALSE(d.received_data_before_response()); 6454 EXPECT_NE(0, d.bytes_received()); 6455 CheckSSLInfo(r.ssl_info()); 6456 EXPECT_EQ(test_server.host_port_pair().host(), 6457 r.GetSocketAddress().host()); 6458 EXPECT_EQ(test_server.host_port_pair().port(), 6459 r.GetSocketAddress().port()); 6460 } 6461} 6462 6463TEST_F(HTTPSRequestTest, HTTPSMismatchedTest) { 6464 SpawnedTestServer::SSLOptions ssl_options( 6465 SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME); 6466 SpawnedTestServer test_server( 6467 SpawnedTestServer::TYPE_HTTPS, 6468 ssl_options, 6469 base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 6470 ASSERT_TRUE(test_server.Start()); 6471 6472 bool err_allowed = true; 6473 for (int i = 0; i < 2 ; i++, err_allowed = !err_allowed) { 6474 TestDelegate d; 6475 { 6476 d.set_allow_certificate_errors(err_allowed); 6477 URLRequest r(test_server.GetURL(std::string()), 6478 DEFAULT_PRIORITY, 6479 &d, 6480 &default_context_); 6481 6482 r.Start(); 6483 EXPECT_TRUE(r.is_pending()); 6484 6485 base::RunLoop().Run(); 6486 6487 EXPECT_EQ(1, d.response_started_count()); 6488 EXPECT_FALSE(d.received_data_before_response()); 6489 EXPECT_TRUE(d.have_certificate_errors()); 6490 if (err_allowed) { 6491 EXPECT_NE(0, d.bytes_received()); 6492 CheckSSLInfo(r.ssl_info()); 6493 } else { 6494 EXPECT_EQ(0, d.bytes_received()); 6495 } 6496 } 6497 } 6498} 6499 6500TEST_F(HTTPSRequestTest, HTTPSExpiredTest) { 6501 SpawnedTestServer::SSLOptions ssl_options( 6502 SpawnedTestServer::SSLOptions::CERT_EXPIRED); 6503 SpawnedTestServer test_server( 6504 SpawnedTestServer::TYPE_HTTPS, 6505 ssl_options, 6506 base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 6507 ASSERT_TRUE(test_server.Start()); 6508 6509 // Iterate from false to true, just so that we do the opposite of the 6510 // previous test in order to increase test coverage. 6511 bool err_allowed = false; 6512 for (int i = 0; i < 2 ; i++, err_allowed = !err_allowed) { 6513 TestDelegate d; 6514 { 6515 d.set_allow_certificate_errors(err_allowed); 6516 URLRequest r(test_server.GetURL(std::string()), 6517 DEFAULT_PRIORITY, 6518 &d, 6519 &default_context_); 6520 6521 r.Start(); 6522 EXPECT_TRUE(r.is_pending()); 6523 6524 base::RunLoop().Run(); 6525 6526 EXPECT_EQ(1, d.response_started_count()); 6527 EXPECT_FALSE(d.received_data_before_response()); 6528 EXPECT_TRUE(d.have_certificate_errors()); 6529 if (err_allowed) { 6530 EXPECT_NE(0, d.bytes_received()); 6531 CheckSSLInfo(r.ssl_info()); 6532 } else { 6533 EXPECT_EQ(0, d.bytes_received()); 6534 } 6535 } 6536 } 6537} 6538 6539// Tests TLSv1.1 -> TLSv1 fallback. Verifies that we don't fall back more 6540// than necessary. 6541TEST_F(HTTPSRequestTest, TLSv1Fallback) { 6542 // The OpenSSL library in use may not support TLS 1.1. 6543#if !defined(USE_OPENSSL) 6544 EXPECT_GT(kDefaultSSLVersionMax, SSL_PROTOCOL_VERSION_TLS1); 6545#endif 6546 if (kDefaultSSLVersionMax <= SSL_PROTOCOL_VERSION_TLS1) 6547 return; 6548 6549 SpawnedTestServer::SSLOptions ssl_options( 6550 SpawnedTestServer::SSLOptions::CERT_OK); 6551 ssl_options.tls_intolerant = 6552 SpawnedTestServer::SSLOptions::TLS_INTOLERANT_TLS1_1; 6553 SpawnedTestServer test_server( 6554 SpawnedTestServer::TYPE_HTTPS, 6555 ssl_options, 6556 base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 6557 ASSERT_TRUE(test_server.Start()); 6558 6559 TestDelegate d; 6560 TestURLRequestContext context(true); 6561 context.Init(); 6562 d.set_allow_certificate_errors(true); 6563 URLRequest r( 6564 test_server.GetURL(std::string()), DEFAULT_PRIORITY, &d, &context); 6565 r.Start(); 6566 6567 base::RunLoop().Run(); 6568 6569 EXPECT_EQ(1, d.response_started_count()); 6570 EXPECT_NE(0, d.bytes_received()); 6571 EXPECT_EQ(static_cast<int>(SSL_CONNECTION_VERSION_TLS1), 6572 SSLConnectionStatusToVersion(r.ssl_info().connection_status)); 6573 EXPECT_TRUE(r.ssl_info().connection_status & SSL_CONNECTION_VERSION_FALLBACK); 6574} 6575 6576// Tests that we don't fallback with servers that implement TLS_FALLBACK_SCSV. 6577#if defined(USE_OPENSSL) 6578TEST_F(HTTPSRequestTest, DISABLED_FallbackSCSV) { 6579#else 6580TEST_F(HTTPSRequestTest, FallbackSCSV) { 6581#endif 6582 SpawnedTestServer::SSLOptions ssl_options( 6583 SpawnedTestServer::SSLOptions::CERT_OK); 6584 // Configure HTTPS server to be intolerant of TLS >= 1.0 in order to trigger 6585 // a version fallback. 6586 ssl_options.tls_intolerant = 6587 SpawnedTestServer::SSLOptions::TLS_INTOLERANT_ALL; 6588 // Have the server process TLS_FALLBACK_SCSV so that version fallback 6589 // connections are rejected. 6590 ssl_options.fallback_scsv_enabled = true; 6591 6592 SpawnedTestServer test_server( 6593 SpawnedTestServer::TYPE_HTTPS, 6594 ssl_options, 6595 base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 6596 ASSERT_TRUE(test_server.Start()); 6597 6598 TestDelegate d; 6599 TestURLRequestContext context(true); 6600 context.Init(); 6601 d.set_allow_certificate_errors(true); 6602 URLRequest r( 6603 test_server.GetURL(std::string()), DEFAULT_PRIORITY, &d, &context); 6604 r.Start(); 6605 6606 base::RunLoop().Run(); 6607 6608 EXPECT_EQ(1, d.response_started_count()); 6609 // ERR_SSL_VERSION_OR_CIPHER_MISMATCH is how the server simulates version 6610 // intolerance. If the fallback SCSV is processed when the original error 6611 // that caused the fallback should be returned, which should be 6612 // ERR_SSL_VERSION_OR_CIPHER_MISMATCH. 6613 EXPECT_EQ(ERR_SSL_VERSION_OR_CIPHER_MISMATCH, r.status().error()); 6614} 6615 6616// This tests that a load of www.google.com with a certificate error sets 6617// the |certificate_errors_are_fatal| flag correctly. This flag will cause 6618// the interstitial to be fatal. 6619TEST_F(HTTPSRequestTest, HTTPSPreloadedHSTSTest) { 6620 SpawnedTestServer::SSLOptions ssl_options( 6621 SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME); 6622 SpawnedTestServer test_server( 6623 SpawnedTestServer::TYPE_HTTPS, 6624 ssl_options, 6625 base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 6626 ASSERT_TRUE(test_server.Start()); 6627 6628 // We require that the URL be www.google.com in order to pick up the 6629 // preloaded HSTS entries in the TransportSecurityState. This means that we 6630 // have to use a MockHostResolver in order to direct www.google.com to the 6631 // testserver. By default, MockHostResolver maps all hosts to 127.0.0.1. 6632 6633 MockHostResolver host_resolver; 6634 TestNetworkDelegate network_delegate; // Must outlive URLRequest. 6635 TestURLRequestContext context(true); 6636 context.set_network_delegate(&network_delegate); 6637 context.set_host_resolver(&host_resolver); 6638 TransportSecurityState transport_security_state; 6639 context.set_transport_security_state(&transport_security_state); 6640 context.Init(); 6641 6642 TestDelegate d; 6643 URLRequest r(GURL(base::StringPrintf("https://www.google.com:%d", 6644 test_server.host_port_pair().port())), 6645 DEFAULT_PRIORITY, 6646 &d, 6647 &context); 6648 6649 r.Start(); 6650 EXPECT_TRUE(r.is_pending()); 6651 6652 base::RunLoop().Run(); 6653 6654 EXPECT_EQ(1, d.response_started_count()); 6655 EXPECT_FALSE(d.received_data_before_response()); 6656 EXPECT_TRUE(d.have_certificate_errors()); 6657 EXPECT_TRUE(d.certificate_errors_are_fatal()); 6658} 6659 6660// This tests that cached HTTPS page loads do not cause any updates to the 6661// TransportSecurityState. 6662TEST_F(HTTPSRequestTest, HTTPSErrorsNoClobberTSSTest) { 6663 // The actual problem -- CERT_MISMATCHED_NAME in this case -- doesn't 6664 // matter. It just has to be any error. 6665 SpawnedTestServer::SSLOptions ssl_options( 6666 SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME); 6667 SpawnedTestServer test_server( 6668 SpawnedTestServer::TYPE_HTTPS, 6669 ssl_options, 6670 base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 6671 ASSERT_TRUE(test_server.Start()); 6672 6673 // We require that the URL be www.google.com in order to pick up the static 6674 // and dynamic STS and PKP entries in the TransportSecurityState. This means 6675 // that we have to use a MockHostResolver in order to direct www.google.com to 6676 // the testserver. By default, MockHostResolver maps all hosts to 127.0.0.1. 6677 6678 MockHostResolver host_resolver; 6679 TestNetworkDelegate network_delegate; // Must outlive URLRequest. 6680 TestURLRequestContext context(true); 6681 context.set_network_delegate(&network_delegate); 6682 context.set_host_resolver(&host_resolver); 6683 TransportSecurityState transport_security_state; 6684 6685 TransportSecurityState::DomainState static_domain_state; 6686 EXPECT_TRUE(transport_security_state.GetStaticDomainState( 6687 "www.google.com", true, &static_domain_state)); 6688 context.set_transport_security_state(&transport_security_state); 6689 context.Init(); 6690 6691 TransportSecurityState::DomainState dynamic_domain_state; 6692 EXPECT_FALSE(transport_security_state.GetDynamicDomainState( 6693 "www.google.com", &dynamic_domain_state)); 6694 6695 TestDelegate d; 6696 URLRequest r(GURL(base::StringPrintf("https://www.google.com:%d", 6697 test_server.host_port_pair().port())), 6698 DEFAULT_PRIORITY, 6699 &d, 6700 &context); 6701 6702 r.Start(); 6703 EXPECT_TRUE(r.is_pending()); 6704 6705 base::RunLoop().Run(); 6706 6707 EXPECT_EQ(1, d.response_started_count()); 6708 EXPECT_FALSE(d.received_data_before_response()); 6709 EXPECT_TRUE(d.have_certificate_errors()); 6710 EXPECT_TRUE(d.certificate_errors_are_fatal()); 6711 6712 // Get a fresh copy of the states, and check that they haven't changed. 6713 TransportSecurityState::DomainState new_static_domain_state; 6714 EXPECT_TRUE(transport_security_state.GetStaticDomainState( 6715 "www.google.com", true, &new_static_domain_state)); 6716 TransportSecurityState::DomainState new_dynamic_domain_state; 6717 EXPECT_FALSE(transport_security_state.GetDynamicDomainState( 6718 "www.google.com", &new_dynamic_domain_state)); 6719 6720 EXPECT_EQ(new_static_domain_state.sts.upgrade_mode, 6721 static_domain_state.sts.upgrade_mode); 6722 EXPECT_EQ(new_static_domain_state.sts.include_subdomains, 6723 static_domain_state.sts.include_subdomains); 6724 EXPECT_EQ(new_static_domain_state.pkp.include_subdomains, 6725 static_domain_state.pkp.include_subdomains); 6726 EXPECT_TRUE(FingerprintsEqual(new_static_domain_state.pkp.spki_hashes, 6727 static_domain_state.pkp.spki_hashes)); 6728 EXPECT_TRUE(FingerprintsEqual(new_static_domain_state.pkp.bad_spki_hashes, 6729 static_domain_state.pkp.bad_spki_hashes)); 6730} 6731 6732// Make sure HSTS preserves a POST request's method and body. 6733TEST_F(HTTPSRequestTest, HSTSPreservesPosts) { 6734 static const char kData[] = "hello world"; 6735 6736 SpawnedTestServer::SSLOptions ssl_options( 6737 SpawnedTestServer::SSLOptions::CERT_OK); 6738 SpawnedTestServer test_server( 6739 SpawnedTestServer::TYPE_HTTPS, 6740 ssl_options, 6741 base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 6742 ASSERT_TRUE(test_server.Start()); 6743 6744 6745 // Per spec, TransportSecurityState expects a domain name, rather than an IP 6746 // address, so a MockHostResolver is needed to redirect www.somewhere.com to 6747 // the SpawnedTestServer. By default, MockHostResolver maps all hosts 6748 // to 127.0.0.1. 6749 MockHostResolver host_resolver; 6750 6751 // Force https for www.somewhere.com. 6752 TransportSecurityState transport_security_state; 6753 base::Time expiry = base::Time::Now() + base::TimeDelta::FromDays(1000); 6754 bool include_subdomains = false; 6755 transport_security_state.AddHSTS("www.somewhere.com", expiry, 6756 include_subdomains); 6757 6758 TestNetworkDelegate network_delegate; // Must outlive URLRequest. 6759 6760 TestURLRequestContext context(true); 6761 context.set_host_resolver(&host_resolver); 6762 context.set_transport_security_state(&transport_security_state); 6763 context.set_network_delegate(&network_delegate); 6764 context.Init(); 6765 6766 TestDelegate d; 6767 // Navigating to https://www.somewhere.com instead of https://127.0.0.1 will 6768 // cause a certificate error. Ignore the error. 6769 d.set_allow_certificate_errors(true); 6770 6771 URLRequest req(GURL(base::StringPrintf("http://www.somewhere.com:%d/echo", 6772 test_server.host_port_pair().port())), 6773 DEFAULT_PRIORITY, 6774 &d, 6775 &context); 6776 req.set_method("POST"); 6777 req.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData))); 6778 6779 req.Start(); 6780 base::RunLoop().Run(); 6781 6782 EXPECT_EQ("https", req.url().scheme()); 6783 EXPECT_EQ("POST", req.method()); 6784 EXPECT_EQ(kData, d.data_received()); 6785 6786 LoadTimingInfo load_timing_info; 6787 network_delegate.GetLoadTimingInfoBeforeRedirect(&load_timing_info); 6788 // LoadTimingInfo of HSTS redirects is similar to that of network cache hits 6789 TestLoadTimingCacheHitNoNetwork(load_timing_info); 6790} 6791 6792TEST_F(HTTPSRequestTest, SSLv3Fallback) { 6793 SpawnedTestServer::SSLOptions ssl_options( 6794 SpawnedTestServer::SSLOptions::CERT_OK); 6795 ssl_options.tls_intolerant = 6796 SpawnedTestServer::SSLOptions::TLS_INTOLERANT_ALL; 6797 SpawnedTestServer test_server( 6798 SpawnedTestServer::TYPE_HTTPS, 6799 ssl_options, 6800 base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 6801 ASSERT_TRUE(test_server.Start()); 6802 6803 TestDelegate d; 6804 TestURLRequestContext context(true); 6805 context.Init(); 6806 d.set_allow_certificate_errors(true); 6807 URLRequest r( 6808 test_server.GetURL(std::string()), DEFAULT_PRIORITY, &d, &context); 6809 r.Start(); 6810 6811 base::RunLoop().Run(); 6812 6813 EXPECT_EQ(1, d.response_started_count()); 6814 EXPECT_NE(0, d.bytes_received()); 6815 EXPECT_EQ(static_cast<int>(SSL_CONNECTION_VERSION_SSL3), 6816 SSLConnectionStatusToVersion(r.ssl_info().connection_status)); 6817 EXPECT_TRUE(r.ssl_info().connection_status & SSL_CONNECTION_VERSION_FALLBACK); 6818} 6819 6820namespace { 6821 6822class SSLClientAuthTestDelegate : public TestDelegate { 6823 public: 6824 SSLClientAuthTestDelegate() : on_certificate_requested_count_(0) { 6825 } 6826 virtual void OnCertificateRequested( 6827 URLRequest* request, 6828 SSLCertRequestInfo* cert_request_info) OVERRIDE { 6829 on_certificate_requested_count_++; 6830 base::MessageLoop::current()->Quit(); 6831 } 6832 int on_certificate_requested_count() { 6833 return on_certificate_requested_count_; 6834 } 6835 private: 6836 int on_certificate_requested_count_; 6837}; 6838 6839} // namespace 6840 6841// TODO(davidben): Test the rest of the code. Specifically, 6842// - Filtering which certificates to select. 6843// - Sending a certificate back. 6844// - Getting a certificate request in an SSL renegotiation sending the 6845// HTTP request. 6846TEST_F(HTTPSRequestTest, ClientAuthTest) { 6847 SpawnedTestServer::SSLOptions ssl_options; 6848 ssl_options.request_client_certificate = true; 6849 SpawnedTestServer test_server( 6850 SpawnedTestServer::TYPE_HTTPS, 6851 ssl_options, 6852 base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 6853 ASSERT_TRUE(test_server.Start()); 6854 6855 SSLClientAuthTestDelegate d; 6856 { 6857 URLRequest r(test_server.GetURL(std::string()), 6858 DEFAULT_PRIORITY, 6859 &d, 6860 &default_context_); 6861 6862 r.Start(); 6863 EXPECT_TRUE(r.is_pending()); 6864 6865 base::RunLoop().Run(); 6866 6867 EXPECT_EQ(1, d.on_certificate_requested_count()); 6868 EXPECT_FALSE(d.received_data_before_response()); 6869 EXPECT_EQ(0, d.bytes_received()); 6870 6871 // Send no certificate. 6872 // TODO(davidben): Get temporary client cert import (with keys) working on 6873 // all platforms so we can test sending a cert as well. 6874 r.ContinueWithCertificate(NULL); 6875 6876 base::RunLoop().Run(); 6877 6878 EXPECT_EQ(1, d.response_started_count()); 6879 EXPECT_FALSE(d.received_data_before_response()); 6880 EXPECT_NE(0, d.bytes_received()); 6881 } 6882} 6883 6884TEST_F(HTTPSRequestTest, ResumeTest) { 6885 // Test that we attempt a session resume when making two connections to the 6886 // same host. 6887 SpawnedTestServer::SSLOptions ssl_options; 6888 ssl_options.record_resume = true; 6889 SpawnedTestServer test_server( 6890 SpawnedTestServer::TYPE_HTTPS, 6891 ssl_options, 6892 base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 6893 ASSERT_TRUE(test_server.Start()); 6894 6895 SSLClientSocket::ClearSessionCache(); 6896 6897 { 6898 TestDelegate d; 6899 URLRequest r(test_server.GetURL("ssl-session-cache"), 6900 DEFAULT_PRIORITY, 6901 &d, 6902 &default_context_); 6903 6904 r.Start(); 6905 EXPECT_TRUE(r.is_pending()); 6906 6907 base::RunLoop().Run(); 6908 6909 EXPECT_EQ(1, d.response_started_count()); 6910 } 6911 6912 reinterpret_cast<HttpCache*>(default_context_.http_transaction_factory())-> 6913 CloseAllConnections(); 6914 6915 { 6916 TestDelegate d; 6917 URLRequest r(test_server.GetURL("ssl-session-cache"), 6918 DEFAULT_PRIORITY, 6919 &d, 6920 &default_context_); 6921 6922 r.Start(); 6923 EXPECT_TRUE(r.is_pending()); 6924 6925 base::RunLoop().Run(); 6926 6927 // The response will look like; 6928 // insert abc 6929 // lookup abc 6930 // insert xyz 6931 // 6932 // With a newline at the end which makes the split think that there are 6933 // four lines. 6934 6935 EXPECT_EQ(1, d.response_started_count()); 6936 std::vector<std::string> lines; 6937 base::SplitString(d.data_received(), '\n', &lines); 6938 ASSERT_EQ(4u, lines.size()) << d.data_received(); 6939 6940 std::string session_id; 6941 6942 for (size_t i = 0; i < 2; i++) { 6943 std::vector<std::string> parts; 6944 base::SplitString(lines[i], '\t', &parts); 6945 ASSERT_EQ(2u, parts.size()); 6946 if (i == 0) { 6947 EXPECT_EQ("insert", parts[0]); 6948 session_id = parts[1]; 6949 } else { 6950 EXPECT_EQ("lookup", parts[0]); 6951 EXPECT_EQ(session_id, parts[1]); 6952 } 6953 } 6954 } 6955} 6956 6957TEST_F(HTTPSRequestTest, SSLSessionCacheShardTest) { 6958 // Test that sessions aren't resumed when the value of ssl_session_cache_shard 6959 // differs. 6960 SpawnedTestServer::SSLOptions ssl_options; 6961 ssl_options.record_resume = true; 6962 SpawnedTestServer test_server( 6963 SpawnedTestServer::TYPE_HTTPS, 6964 ssl_options, 6965 base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 6966 ASSERT_TRUE(test_server.Start()); 6967 6968 SSLClientSocket::ClearSessionCache(); 6969 6970 { 6971 TestDelegate d; 6972 URLRequest r(test_server.GetURL("ssl-session-cache"), 6973 DEFAULT_PRIORITY, 6974 &d, 6975 &default_context_); 6976 6977 r.Start(); 6978 EXPECT_TRUE(r.is_pending()); 6979 6980 base::RunLoop().Run(); 6981 6982 EXPECT_EQ(1, d.response_started_count()); 6983 } 6984 6985 // Now create a new HttpCache with a different ssl_session_cache_shard value. 6986 HttpNetworkSession::Params params; 6987 params.host_resolver = default_context_.host_resolver(); 6988 params.cert_verifier = default_context_.cert_verifier(); 6989 params.transport_security_state = default_context_.transport_security_state(); 6990 params.proxy_service = default_context_.proxy_service(); 6991 params.ssl_config_service = default_context_.ssl_config_service(); 6992 params.http_auth_handler_factory = 6993 default_context_.http_auth_handler_factory(); 6994 params.network_delegate = &default_network_delegate_; 6995 params.http_server_properties = default_context_.http_server_properties(); 6996 params.ssl_session_cache_shard = "alternate"; 6997 6998 scoped_ptr<net::HttpCache> cache(new net::HttpCache( 6999 new net::HttpNetworkSession(params), 7000 net::HttpCache::DefaultBackend::InMemory(0))); 7001 7002 default_context_.set_http_transaction_factory(cache.get()); 7003 7004 { 7005 TestDelegate d; 7006 URLRequest r(test_server.GetURL("ssl-session-cache"), 7007 DEFAULT_PRIORITY, 7008 &d, 7009 &default_context_); 7010 7011 r.Start(); 7012 EXPECT_TRUE(r.is_pending()); 7013 7014 base::RunLoop().Run(); 7015 7016 // The response will look like; 7017 // insert abc 7018 // insert xyz 7019 // 7020 // With a newline at the end which makes the split think that there are 7021 // three lines. 7022 7023 EXPECT_EQ(1, d.response_started_count()); 7024 std::vector<std::string> lines; 7025 base::SplitString(d.data_received(), '\n', &lines); 7026 ASSERT_EQ(3u, lines.size()); 7027 7028 std::string session_id; 7029 for (size_t i = 0; i < 2; i++) { 7030 std::vector<std::string> parts; 7031 base::SplitString(lines[i], '\t', &parts); 7032 ASSERT_EQ(2u, parts.size()); 7033 EXPECT_EQ("insert", parts[0]); 7034 if (i == 0) { 7035 session_id = parts[1]; 7036 } else { 7037 EXPECT_NE(session_id, parts[1]); 7038 } 7039 } 7040 } 7041} 7042 7043class HTTPSSessionTest : public testing::Test { 7044 public: 7045 HTTPSSessionTest() : default_context_(true) { 7046 cert_verifier_.set_default_result(net::OK); 7047 7048 default_context_.set_network_delegate(&default_network_delegate_); 7049 default_context_.set_cert_verifier(&cert_verifier_); 7050 default_context_.Init(); 7051 } 7052 virtual ~HTTPSSessionTest() {} 7053 7054 protected: 7055 MockCertVerifier cert_verifier_; 7056 TestNetworkDelegate default_network_delegate_; // Must outlive URLRequest. 7057 TestURLRequestContext default_context_; 7058}; 7059 7060// Tests that session resumption is not attempted if an invalid certificate 7061// is presented. 7062TEST_F(HTTPSSessionTest, DontResumeSessionsForInvalidCertificates) { 7063 SpawnedTestServer::SSLOptions ssl_options; 7064 ssl_options.record_resume = true; 7065 SpawnedTestServer test_server( 7066 SpawnedTestServer::TYPE_HTTPS, 7067 ssl_options, 7068 base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 7069 ASSERT_TRUE(test_server.Start()); 7070 7071 SSLClientSocket::ClearSessionCache(); 7072 7073 // Simulate the certificate being expired and attempt a connection. 7074 cert_verifier_.set_default_result(net::ERR_CERT_DATE_INVALID); 7075 { 7076 TestDelegate d; 7077 URLRequest r(test_server.GetURL("ssl-session-cache"), 7078 DEFAULT_PRIORITY, 7079 &d, 7080 &default_context_); 7081 7082 r.Start(); 7083 EXPECT_TRUE(r.is_pending()); 7084 7085 base::RunLoop().Run(); 7086 7087 EXPECT_EQ(1, d.response_started_count()); 7088 } 7089 7090 reinterpret_cast<HttpCache*>(default_context_.http_transaction_factory())-> 7091 CloseAllConnections(); 7092 7093 // Now change the certificate to be acceptable (so that the response is 7094 // loaded), and ensure that no session id is presented to the peer. 7095 cert_verifier_.set_default_result(net::OK); 7096 { 7097 TestDelegate d; 7098 URLRequest r(test_server.GetURL("ssl-session-cache"), 7099 DEFAULT_PRIORITY, 7100 &d, 7101 &default_context_); 7102 7103 r.Start(); 7104 EXPECT_TRUE(r.is_pending()); 7105 7106 base::RunLoop().Run(); 7107 7108 // The response will look like; 7109 // insert abc 7110 // insert xyz 7111 // 7112 // With a newline at the end which makes the split think that there are 7113 // three lines. 7114 // 7115 // If a session was presented (eg: a bug), then the response would look 7116 // like; 7117 // insert abc 7118 // lookup abc 7119 // insert xyz 7120 7121 EXPECT_EQ(1, d.response_started_count()); 7122 std::vector<std::string> lines; 7123 base::SplitString(d.data_received(), '\n', &lines); 7124 ASSERT_EQ(3u, lines.size()) << d.data_received(); 7125 7126 std::string session_id; 7127 for (size_t i = 0; i < 2; i++) { 7128 std::vector<std::string> parts; 7129 base::SplitString(lines[i], '\t', &parts); 7130 ASSERT_EQ(2u, parts.size()); 7131 EXPECT_EQ("insert", parts[0]); 7132 if (i == 0) { 7133 session_id = parts[1]; 7134 } else { 7135 EXPECT_NE(session_id, parts[1]); 7136 } 7137 } 7138 } 7139} 7140 7141class TestSSLConfigService : public SSLConfigService { 7142 public: 7143 TestSSLConfigService(bool ev_enabled, 7144 bool online_rev_checking, 7145 bool rev_checking_required_local_anchors) 7146 : ev_enabled_(ev_enabled), 7147 online_rev_checking_(online_rev_checking), 7148 rev_checking_required_local_anchors_( 7149 rev_checking_required_local_anchors) {} 7150 7151 // SSLConfigService: 7152 virtual void GetSSLConfig(SSLConfig* config) OVERRIDE { 7153 *config = SSLConfig(); 7154 config->rev_checking_enabled = online_rev_checking_; 7155 config->verify_ev_cert = ev_enabled_; 7156 config->rev_checking_required_local_anchors = 7157 rev_checking_required_local_anchors_; 7158 } 7159 7160 protected: 7161 virtual ~TestSSLConfigService() {} 7162 7163 private: 7164 const bool ev_enabled_; 7165 const bool online_rev_checking_; 7166 const bool rev_checking_required_local_anchors_; 7167}; 7168 7169// This the fingerprint of the "Testing CA" certificate used by the testserver. 7170// See net/data/ssl/certificates/ocsp-test-root.pem. 7171static const SHA1HashValue kOCSPTestCertFingerprint = 7172 { { 0xf1, 0xad, 0xf6, 0xce, 0x42, 0xac, 0xe7, 0xb4, 0xf4, 0x24, 7173 0xdb, 0x1a, 0xf7, 0xa0, 0x9f, 0x09, 0xa1, 0xea, 0xf1, 0x5c } }; 7174 7175// This is the SHA256, SPKI hash of the "Testing CA" certificate used by the 7176// testserver. 7177static const SHA256HashValue kOCSPTestCertSPKI = { { 7178 0xee, 0xe6, 0x51, 0x2d, 0x4c, 0xfa, 0xf7, 0x3e, 7179 0x6c, 0xd8, 0xca, 0x67, 0xed, 0xb5, 0x5d, 0x49, 7180 0x76, 0xe1, 0x52, 0xa7, 0x6e, 0x0e, 0xa0, 0x74, 7181 0x09, 0x75, 0xe6, 0x23, 0x24, 0xbd, 0x1b, 0x28, 7182} }; 7183 7184// This is the policy OID contained in the certificates that testserver 7185// generates. 7186static const char kOCSPTestCertPolicy[] = "1.3.6.1.4.1.11129.2.4.1"; 7187 7188class HTTPSOCSPTest : public HTTPSRequestTest { 7189 public: 7190 HTTPSOCSPTest() 7191 : context_(true), 7192 ev_test_policy_( 7193 new ScopedTestEVPolicy(EVRootCAMetadata::GetInstance(), 7194 kOCSPTestCertFingerprint, 7195 kOCSPTestCertPolicy)) { 7196 } 7197 7198 virtual void SetUp() OVERRIDE { 7199 SetupContext(&context_); 7200 context_.Init(); 7201 7202 scoped_refptr<net::X509Certificate> root_cert = 7203 ImportCertFromFile(GetTestCertsDirectory(), "ocsp-test-root.pem"); 7204 CHECK_NE(static_cast<X509Certificate*>(NULL), root_cert); 7205 test_root_.reset(new ScopedTestRoot(root_cert.get())); 7206 7207#if defined(USE_NSS) || defined(OS_IOS) 7208 SetURLRequestContextForNSSHttpIO(&context_); 7209 EnsureNSSHttpIOInit(); 7210#endif 7211 } 7212 7213 void DoConnection(const SpawnedTestServer::SSLOptions& ssl_options, 7214 CertStatus* out_cert_status) { 7215 // We always overwrite out_cert_status. 7216 *out_cert_status = 0; 7217 SpawnedTestServer test_server( 7218 SpawnedTestServer::TYPE_HTTPS, 7219 ssl_options, 7220 base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 7221 ASSERT_TRUE(test_server.Start()); 7222 7223 TestDelegate d; 7224 d.set_allow_certificate_errors(true); 7225 URLRequest r( 7226 test_server.GetURL(std::string()), DEFAULT_PRIORITY, &d, &context_); 7227 r.Start(); 7228 7229 base::RunLoop().Run(); 7230 7231 EXPECT_EQ(1, d.response_started_count()); 7232 *out_cert_status = r.ssl_info().cert_status; 7233 } 7234 7235 virtual ~HTTPSOCSPTest() { 7236#if defined(USE_NSS) || defined(OS_IOS) 7237 ShutdownNSSHttpIO(); 7238#endif 7239 } 7240 7241 protected: 7242 // SetupContext configures the URLRequestContext that will be used for making 7243 // connetions to testserver. This can be overridden in test subclasses for 7244 // different behaviour. 7245 virtual void SetupContext(URLRequestContext* context) { 7246 context->set_ssl_config_service( 7247 new TestSSLConfigService(true /* check for EV */, 7248 true /* online revocation checking */, 7249 false /* require rev. checking for local 7250 anchors */)); 7251 } 7252 7253 scoped_ptr<ScopedTestRoot> test_root_; 7254 TestURLRequestContext context_; 7255 scoped_ptr<ScopedTestEVPolicy> ev_test_policy_; 7256}; 7257 7258static CertStatus ExpectedCertStatusForFailedOnlineRevocationCheck() { 7259#if defined(OS_WIN) 7260 // Windows can return CERT_STATUS_UNABLE_TO_CHECK_REVOCATION but we don't 7261 // have that ability on other platforms. 7262 return CERT_STATUS_UNABLE_TO_CHECK_REVOCATION; 7263#else 7264 return 0; 7265#endif 7266} 7267 7268// SystemSupportsHardFailRevocationChecking returns true iff the current 7269// operating system supports revocation checking and can distinguish between 7270// situations where a given certificate lacks any revocation information (eg: 7271// no CRLDistributionPoints and no OCSP Responder AuthorityInfoAccess) and when 7272// revocation information cannot be obtained (eg: the CRL was unreachable). 7273// If it does not, then tests which rely on 'hard fail' behaviour should be 7274// skipped. 7275static bool SystemSupportsHardFailRevocationChecking() { 7276#if defined(OS_WIN) || defined(USE_NSS) || defined(OS_IOS) 7277 return true; 7278#else 7279 return false; 7280#endif 7281} 7282 7283// SystemUsesChromiumEVMetadata returns true iff the current operating system 7284// uses Chromium's EV metadata (i.e. EVRootCAMetadata). If it does not, then 7285// several tests are effected because our testing EV certificate won't be 7286// recognised as EV. 7287static bool SystemUsesChromiumEVMetadata() { 7288#if defined(USE_OPENSSL_CERTS) && !defined(OS_ANDROID) 7289 // http://crbug.com/117478 - OpenSSL does not support EV validation. 7290 return false; 7291#elif (defined(OS_MACOSX) && !defined(OS_IOS)) || defined(OS_ANDROID) 7292 // On OS X and Android, we use the system to tell us whether a certificate is 7293 // EV or not and the system won't recognise our testing root. 7294 return false; 7295#else 7296 return true; 7297#endif 7298} 7299 7300static bool SystemSupportsOCSP() { 7301#if defined(USE_OPENSSL) 7302 // http://crbug.com/117478 - OpenSSL does not support OCSP. 7303 return false; 7304#elif defined(OS_WIN) 7305 return base::win::GetVersion() >= base::win::VERSION_VISTA; 7306#elif defined(OS_ANDROID) 7307 // TODO(jnd): http://crbug.com/117478 - EV verification is not yet supported. 7308 return false; 7309#else 7310 return true; 7311#endif 7312} 7313 7314TEST_F(HTTPSOCSPTest, Valid) { 7315 if (!SystemSupportsOCSP()) { 7316 LOG(WARNING) << "Skipping test because system doesn't support OCSP"; 7317 return; 7318 } 7319 7320 SpawnedTestServer::SSLOptions ssl_options( 7321 SpawnedTestServer::SSLOptions::CERT_AUTO); 7322 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_OK; 7323 7324 CertStatus cert_status; 7325 DoConnection(ssl_options, &cert_status); 7326 7327 EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS); 7328 7329 EXPECT_EQ(SystemUsesChromiumEVMetadata(), 7330 static_cast<bool>(cert_status & CERT_STATUS_IS_EV)); 7331 7332 EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED); 7333} 7334 7335TEST_F(HTTPSOCSPTest, Revoked) { 7336 if (!SystemSupportsOCSP()) { 7337 LOG(WARNING) << "Skipping test because system doesn't support OCSP"; 7338 return; 7339 } 7340 7341 SpawnedTestServer::SSLOptions ssl_options( 7342 SpawnedTestServer::SSLOptions::CERT_AUTO); 7343 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_REVOKED; 7344 7345 CertStatus cert_status; 7346 DoConnection(ssl_options, &cert_status); 7347 7348#if !(defined(OS_MACOSX) && !defined(OS_IOS)) 7349 // Doesn't pass on OS X yet for reasons that need to be investigated. 7350 EXPECT_EQ(CERT_STATUS_REVOKED, cert_status & CERT_STATUS_ALL_ERRORS); 7351#endif 7352 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV); 7353 EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED); 7354} 7355 7356TEST_F(HTTPSOCSPTest, Invalid) { 7357 if (!SystemSupportsOCSP()) { 7358 LOG(WARNING) << "Skipping test because system doesn't support OCSP"; 7359 return; 7360 } 7361 7362 SpawnedTestServer::SSLOptions ssl_options( 7363 SpawnedTestServer::SSLOptions::CERT_AUTO); 7364 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID; 7365 7366 CertStatus cert_status; 7367 DoConnection(ssl_options, &cert_status); 7368 7369 EXPECT_EQ(ExpectedCertStatusForFailedOnlineRevocationCheck(), 7370 cert_status & CERT_STATUS_ALL_ERRORS); 7371 7372 // Without a positive OCSP response, we shouldn't show the EV status. 7373 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV); 7374 EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED); 7375} 7376 7377class HTTPSHardFailTest : public HTTPSOCSPTest { 7378 protected: 7379 virtual void SetupContext(URLRequestContext* context) OVERRIDE { 7380 context->set_ssl_config_service( 7381 new TestSSLConfigService(false /* check for EV */, 7382 false /* online revocation checking */, 7383 true /* require rev. checking for local 7384 anchors */)); 7385 } 7386}; 7387 7388 7389TEST_F(HTTPSHardFailTest, FailsOnOCSPInvalid) { 7390 if (!SystemSupportsOCSP()) { 7391 LOG(WARNING) << "Skipping test because system doesn't support OCSP"; 7392 return; 7393 } 7394 7395 if (!SystemSupportsHardFailRevocationChecking()) { 7396 LOG(WARNING) << "Skipping test because system doesn't support hard fail " 7397 << "revocation checking"; 7398 return; 7399 } 7400 7401 SpawnedTestServer::SSLOptions ssl_options( 7402 SpawnedTestServer::SSLOptions::CERT_AUTO); 7403 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID; 7404 7405 CertStatus cert_status; 7406 DoConnection(ssl_options, &cert_status); 7407 7408 EXPECT_EQ(CERT_STATUS_REVOKED, 7409 cert_status & CERT_STATUS_REVOKED); 7410 7411 // Without a positive OCSP response, we shouldn't show the EV status. 7412 EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED); 7413} 7414 7415class HTTPSEVCRLSetTest : public HTTPSOCSPTest { 7416 protected: 7417 virtual void SetupContext(URLRequestContext* context) OVERRIDE { 7418 context->set_ssl_config_service( 7419 new TestSSLConfigService(true /* check for EV */, 7420 false /* online revocation checking */, 7421 false /* require rev. checking for local 7422 anchors */)); 7423 } 7424}; 7425 7426TEST_F(HTTPSEVCRLSetTest, MissingCRLSetAndInvalidOCSP) { 7427 if (!SystemSupportsOCSP()) { 7428 LOG(WARNING) << "Skipping test because system doesn't support OCSP"; 7429 return; 7430 } 7431 7432 SpawnedTestServer::SSLOptions ssl_options( 7433 SpawnedTestServer::SSLOptions::CERT_AUTO); 7434 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID; 7435 SSLConfigService::SetCRLSet(scoped_refptr<CRLSet>()); 7436 7437 CertStatus cert_status; 7438 DoConnection(ssl_options, &cert_status); 7439 7440 EXPECT_EQ(ExpectedCertStatusForFailedOnlineRevocationCheck(), 7441 cert_status & CERT_STATUS_ALL_ERRORS); 7442 7443 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV); 7444 EXPECT_EQ(SystemUsesChromiumEVMetadata(), 7445 static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED)); 7446} 7447 7448TEST_F(HTTPSEVCRLSetTest, MissingCRLSetAndRevokedOCSP) { 7449 if (!SystemSupportsOCSP()) { 7450 LOG(WARNING) << "Skipping test because system doesn't support OCSP"; 7451 return; 7452 } 7453 7454 SpawnedTestServer::SSLOptions ssl_options( 7455 SpawnedTestServer::SSLOptions::CERT_AUTO); 7456 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_REVOKED; 7457 SSLConfigService::SetCRLSet(scoped_refptr<CRLSet>()); 7458 7459 CertStatus cert_status; 7460 DoConnection(ssl_options, &cert_status); 7461 7462 // Currently only works for Windows. When using NSS or OS X, it's not 7463 // possible to determine whether the check failed because of actual 7464 // revocation or because there was an OCSP failure. 7465#if defined(OS_WIN) 7466 EXPECT_EQ(CERT_STATUS_REVOKED, cert_status & CERT_STATUS_ALL_ERRORS); 7467#else 7468 EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS); 7469#endif 7470 7471 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV); 7472 EXPECT_EQ(SystemUsesChromiumEVMetadata(), 7473 static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED)); 7474} 7475 7476TEST_F(HTTPSEVCRLSetTest, MissingCRLSetAndGoodOCSP) { 7477 if (!SystemSupportsOCSP()) { 7478 LOG(WARNING) << "Skipping test because system doesn't support OCSP"; 7479 return; 7480 } 7481 7482 SpawnedTestServer::SSLOptions ssl_options( 7483 SpawnedTestServer::SSLOptions::CERT_AUTO); 7484 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_OK; 7485 SSLConfigService::SetCRLSet(scoped_refptr<CRLSet>()); 7486 7487 CertStatus cert_status; 7488 DoConnection(ssl_options, &cert_status); 7489 7490 EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS); 7491 7492 EXPECT_EQ(SystemUsesChromiumEVMetadata(), 7493 static_cast<bool>(cert_status & CERT_STATUS_IS_EV)); 7494 EXPECT_EQ(SystemUsesChromiumEVMetadata(), 7495 static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED)); 7496} 7497 7498TEST_F(HTTPSEVCRLSetTest, ExpiredCRLSet) { 7499 if (!SystemSupportsOCSP()) { 7500 LOG(WARNING) << "Skipping test because system doesn't support OCSP"; 7501 return; 7502 } 7503 7504 SpawnedTestServer::SSLOptions ssl_options( 7505 SpawnedTestServer::SSLOptions::CERT_AUTO); 7506 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID; 7507 SSLConfigService::SetCRLSet( 7508 scoped_refptr<CRLSet>(CRLSet::ExpiredCRLSetForTesting())); 7509 7510 CertStatus cert_status; 7511 DoConnection(ssl_options, &cert_status); 7512 7513 EXPECT_EQ(ExpectedCertStatusForFailedOnlineRevocationCheck(), 7514 cert_status & CERT_STATUS_ALL_ERRORS); 7515 7516 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV); 7517 EXPECT_EQ(SystemUsesChromiumEVMetadata(), 7518 static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED)); 7519} 7520 7521TEST_F(HTTPSEVCRLSetTest, FreshCRLSetCovered) { 7522 if (!SystemSupportsOCSP()) { 7523 LOG(WARNING) << "Skipping test because system doesn't support OCSP"; 7524 return; 7525 } 7526 7527 SpawnedTestServer::SSLOptions ssl_options( 7528 SpawnedTestServer::SSLOptions::CERT_AUTO); 7529 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID; 7530 SSLConfigService::SetCRLSet( 7531 scoped_refptr<CRLSet>(CRLSet::ForTesting( 7532 false, &kOCSPTestCertSPKI, ""))); 7533 7534 CertStatus cert_status; 7535 DoConnection(ssl_options, &cert_status); 7536 7537 // With a fresh CRLSet that covers the issuing certificate, we shouldn't do a 7538 // revocation check for EV. 7539 EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS); 7540 EXPECT_EQ(SystemUsesChromiumEVMetadata(), 7541 static_cast<bool>(cert_status & CERT_STATUS_IS_EV)); 7542 EXPECT_FALSE( 7543 static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED)); 7544} 7545 7546TEST_F(HTTPSEVCRLSetTest, FreshCRLSetNotCovered) { 7547 if (!SystemSupportsOCSP()) { 7548 LOG(WARNING) << "Skipping test because system doesn't support OCSP"; 7549 return; 7550 } 7551 7552 SpawnedTestServer::SSLOptions ssl_options( 7553 SpawnedTestServer::SSLOptions::CERT_AUTO); 7554 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID; 7555 SSLConfigService::SetCRLSet( 7556 scoped_refptr<CRLSet>(CRLSet::EmptyCRLSetForTesting())); 7557 7558 CertStatus cert_status = 0; 7559 DoConnection(ssl_options, &cert_status); 7560 7561 // Even with a fresh CRLSet, we should still do online revocation checks when 7562 // the certificate chain isn't covered by the CRLSet, which it isn't in this 7563 // test. 7564 EXPECT_EQ(ExpectedCertStatusForFailedOnlineRevocationCheck(), 7565 cert_status & CERT_STATUS_ALL_ERRORS); 7566 7567 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV); 7568 EXPECT_EQ(SystemUsesChromiumEVMetadata(), 7569 static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED)); 7570} 7571 7572TEST_F(HTTPSEVCRLSetTest, ExpiredCRLSetAndRevokedNonEVCert) { 7573 // Test that when EV verification is requested, but online revocation 7574 // checking is disabled, and the leaf certificate is not in fact EV, that 7575 // no revocation checking actually happens. 7576 if (!SystemSupportsOCSP()) { 7577 LOG(WARNING) << "Skipping test because system doesn't support OCSP"; 7578 return; 7579 } 7580 7581 // Unmark the certificate's OID as EV, which should disable revocation 7582 // checking (as per the user preference) 7583 ev_test_policy_.reset(); 7584 7585 SpawnedTestServer::SSLOptions ssl_options( 7586 SpawnedTestServer::SSLOptions::CERT_AUTO); 7587 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_REVOKED; 7588 SSLConfigService::SetCRLSet( 7589 scoped_refptr<CRLSet>(CRLSet::ExpiredCRLSetForTesting())); 7590 7591 CertStatus cert_status; 7592 DoConnection(ssl_options, &cert_status); 7593 7594 EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS); 7595 7596 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV); 7597 EXPECT_FALSE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED); 7598} 7599 7600class HTTPSCRLSetTest : public HTTPSOCSPTest { 7601 protected: 7602 virtual void SetupContext(URLRequestContext* context) OVERRIDE { 7603 context->set_ssl_config_service( 7604 new TestSSLConfigService(false /* check for EV */, 7605 false /* online revocation checking */, 7606 false /* require rev. checking for local 7607 anchors */)); 7608 } 7609}; 7610 7611TEST_F(HTTPSCRLSetTest, ExpiredCRLSet) { 7612 SpawnedTestServer::SSLOptions ssl_options( 7613 SpawnedTestServer::SSLOptions::CERT_AUTO); 7614 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID; 7615 SSLConfigService::SetCRLSet( 7616 scoped_refptr<CRLSet>(CRLSet::ExpiredCRLSetForTesting())); 7617 7618 CertStatus cert_status; 7619 DoConnection(ssl_options, &cert_status); 7620 7621 // If we're not trying EV verification then, even if the CRLSet has expired, 7622 // we don't fall back to online revocation checks. 7623 EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS); 7624 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV); 7625 EXPECT_FALSE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED); 7626} 7627 7628TEST_F(HTTPSCRLSetTest, CRLSetRevoked) { 7629#if defined(USE_OPENSSL) 7630 LOG(WARNING) << "Skipping test because system doesn't support CRLSets"; 7631 return; 7632#endif 7633 7634 SpawnedTestServer::SSLOptions ssl_options( 7635 SpawnedTestServer::SSLOptions::CERT_AUTO); 7636 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_OK; 7637 ssl_options.cert_serial = 10; 7638 SSLConfigService::SetCRLSet( 7639 scoped_refptr<CRLSet>(CRLSet::ForTesting( 7640 false, &kOCSPTestCertSPKI, "\x0a"))); 7641 7642 CertStatus cert_status = 0; 7643 DoConnection(ssl_options, &cert_status); 7644 7645 // If the certificate is recorded as revoked in the CRLSet, that should be 7646 // reflected without online revocation checking. 7647 EXPECT_EQ(CERT_STATUS_REVOKED, cert_status & CERT_STATUS_ALL_ERRORS); 7648 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV); 7649 EXPECT_FALSE( 7650 static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED)); 7651} 7652#endif // !defined(OS_IOS) 7653 7654#if !defined(DISABLE_FTP_SUPPORT) 7655class URLRequestTestFTP : public URLRequestTest { 7656 public: 7657 URLRequestTestFTP() 7658 : test_server_(SpawnedTestServer::TYPE_FTP, SpawnedTestServer::kLocalhost, 7659 base::FilePath()) { 7660 } 7661 7662 protected: 7663 SpawnedTestServer test_server_; 7664}; 7665 7666// Make sure an FTP request using an unsafe ports fails. 7667TEST_F(URLRequestTestFTP, UnsafePort) { 7668 ASSERT_TRUE(test_server_.Start()); 7669 7670 URLRequestJobFactoryImpl job_factory; 7671 FtpNetworkLayer ftp_transaction_factory(default_context_.host_resolver()); 7672 7673 GURL url("ftp://127.0.0.1:7"); 7674 job_factory.SetProtocolHandler( 7675 "ftp", 7676 new FtpProtocolHandler(&ftp_transaction_factory)); 7677 default_context_.set_job_factory(&job_factory); 7678 7679 TestDelegate d; 7680 { 7681 URLRequest r(url, DEFAULT_PRIORITY, &d, &default_context_); 7682 r.Start(); 7683 EXPECT_TRUE(r.is_pending()); 7684 7685 base::RunLoop().Run(); 7686 7687 EXPECT_FALSE(r.is_pending()); 7688 EXPECT_EQ(URLRequestStatus::FAILED, r.status().status()); 7689 EXPECT_EQ(ERR_UNSAFE_PORT, r.status().error()); 7690 } 7691} 7692 7693// Flaky, see http://crbug.com/25045. 7694TEST_F(URLRequestTestFTP, DISABLED_FTPDirectoryListing) { 7695 ASSERT_TRUE(test_server_.Start()); 7696 7697 TestDelegate d; 7698 { 7699 URLRequest r( 7700 test_server_.GetURL("/"), DEFAULT_PRIORITY, &d, &default_context_); 7701 r.Start(); 7702 EXPECT_TRUE(r.is_pending()); 7703 7704 base::RunLoop().Run(); 7705 7706 EXPECT_FALSE(r.is_pending()); 7707 EXPECT_EQ(1, d.response_started_count()); 7708 EXPECT_FALSE(d.received_data_before_response()); 7709 EXPECT_LT(0, d.bytes_received()); 7710 EXPECT_EQ(test_server_.host_port_pair().host(), 7711 r.GetSocketAddress().host()); 7712 EXPECT_EQ(test_server_.host_port_pair().port(), 7713 r.GetSocketAddress().port()); 7714 } 7715} 7716 7717// Flaky, see http://crbug.com/25045. 7718TEST_F(URLRequestTestFTP, DISABLED_FTPGetTestAnonymous) { 7719 ASSERT_TRUE(test_server_.Start()); 7720 7721 base::FilePath app_path; 7722 PathService::Get(base::DIR_SOURCE_ROOT, &app_path); 7723 app_path = app_path.AppendASCII("LICENSE"); 7724 TestDelegate d; 7725 { 7726 URLRequest r(test_server_.GetURL("/LICENSE"), 7727 DEFAULT_PRIORITY, 7728 &d, 7729 &default_context_); 7730 r.Start(); 7731 EXPECT_TRUE(r.is_pending()); 7732 7733 base::RunLoop().Run(); 7734 7735 int64 file_size = 0; 7736 base::GetFileSize(app_path, &file_size); 7737 7738 EXPECT_FALSE(r.is_pending()); 7739 EXPECT_EQ(1, d.response_started_count()); 7740 EXPECT_FALSE(d.received_data_before_response()); 7741 EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size)); 7742 EXPECT_EQ(test_server_.host_port_pair().host(), 7743 r.GetSocketAddress().host()); 7744 EXPECT_EQ(test_server_.host_port_pair().port(), 7745 r.GetSocketAddress().port()); 7746 } 7747} 7748 7749// Flaky, see http://crbug.com/25045. 7750TEST_F(URLRequestTestFTP, DISABLED_FTPGetTest) { 7751 ASSERT_TRUE(test_server_.Start()); 7752 7753 base::FilePath app_path; 7754 PathService::Get(base::DIR_SOURCE_ROOT, &app_path); 7755 app_path = app_path.AppendASCII("LICENSE"); 7756 TestDelegate d; 7757 { 7758 URLRequest r( 7759 test_server_.GetURLWithUserAndPassword("/LICENSE", "chrome", "chrome"), 7760 DEFAULT_PRIORITY, 7761 &d, 7762 &default_context_); 7763 r.Start(); 7764 EXPECT_TRUE(r.is_pending()); 7765 7766 base::RunLoop().Run(); 7767 7768 int64 file_size = 0; 7769 base::GetFileSize(app_path, &file_size); 7770 7771 EXPECT_FALSE(r.is_pending()); 7772 EXPECT_EQ(test_server_.host_port_pair().host(), 7773 r.GetSocketAddress().host()); 7774 EXPECT_EQ(test_server_.host_port_pair().port(), 7775 r.GetSocketAddress().port()); 7776 EXPECT_EQ(1, d.response_started_count()); 7777 EXPECT_FALSE(d.received_data_before_response()); 7778 EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size)); 7779 7780 LoadTimingInfo load_timing_info; 7781 r.GetLoadTimingInfo(&load_timing_info); 7782 TestLoadTimingNoHttpResponse(load_timing_info); 7783 } 7784} 7785 7786// Flaky, see http://crbug.com/25045. 7787TEST_F(URLRequestTestFTP, DISABLED_FTPCheckWrongPassword) { 7788 ASSERT_TRUE(test_server_.Start()); 7789 7790 base::FilePath app_path; 7791 PathService::Get(base::DIR_SOURCE_ROOT, &app_path); 7792 app_path = app_path.AppendASCII("LICENSE"); 7793 TestDelegate d; 7794 { 7795 URLRequest r(test_server_.GetURLWithUserAndPassword( 7796 "/LICENSE", "chrome", "wrong_password"), 7797 DEFAULT_PRIORITY, 7798 &d, 7799 &default_context_); 7800 r.Start(); 7801 EXPECT_TRUE(r.is_pending()); 7802 7803 base::RunLoop().Run(); 7804 7805 int64 file_size = 0; 7806 base::GetFileSize(app_path, &file_size); 7807 7808 EXPECT_FALSE(r.is_pending()); 7809 EXPECT_EQ(1, d.response_started_count()); 7810 EXPECT_FALSE(d.received_data_before_response()); 7811 EXPECT_EQ(d.bytes_received(), 0); 7812 } 7813} 7814 7815// Flaky, see http://crbug.com/25045. 7816TEST_F(URLRequestTestFTP, DISABLED_FTPCheckWrongPasswordRestart) { 7817 ASSERT_TRUE(test_server_.Start()); 7818 7819 base::FilePath app_path; 7820 PathService::Get(base::DIR_SOURCE_ROOT, &app_path); 7821 app_path = app_path.AppendASCII("LICENSE"); 7822 TestDelegate d; 7823 // Set correct login credentials. The delegate will be asked for them when 7824 // the initial login with wrong credentials will fail. 7825 d.set_credentials(AuthCredentials(kChrome, kChrome)); 7826 { 7827 URLRequest r(test_server_.GetURLWithUserAndPassword( 7828 "/LICENSE", "chrome", "wrong_password"), 7829 DEFAULT_PRIORITY, 7830 &d, 7831 &default_context_); 7832 r.Start(); 7833 EXPECT_TRUE(r.is_pending()); 7834 7835 base::RunLoop().Run(); 7836 7837 int64 file_size = 0; 7838 base::GetFileSize(app_path, &file_size); 7839 7840 EXPECT_FALSE(r.is_pending()); 7841 EXPECT_EQ(1, d.response_started_count()); 7842 EXPECT_FALSE(d.received_data_before_response()); 7843 EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size)); 7844 } 7845} 7846 7847// Flaky, see http://crbug.com/25045. 7848TEST_F(URLRequestTestFTP, DISABLED_FTPCheckWrongUser) { 7849 ASSERT_TRUE(test_server_.Start()); 7850 7851 base::FilePath app_path; 7852 PathService::Get(base::DIR_SOURCE_ROOT, &app_path); 7853 app_path = app_path.AppendASCII("LICENSE"); 7854 TestDelegate d; 7855 { 7856 URLRequest r(test_server_.GetURLWithUserAndPassword( 7857 "/LICENSE", "wrong_user", "chrome"), 7858 DEFAULT_PRIORITY, 7859 &d, 7860 &default_context_); 7861 r.Start(); 7862 EXPECT_TRUE(r.is_pending()); 7863 7864 base::RunLoop().Run(); 7865 7866 int64 file_size = 0; 7867 base::GetFileSize(app_path, &file_size); 7868 7869 EXPECT_FALSE(r.is_pending()); 7870 EXPECT_EQ(1, d.response_started_count()); 7871 EXPECT_FALSE(d.received_data_before_response()); 7872 EXPECT_EQ(d.bytes_received(), 0); 7873 } 7874} 7875 7876// Flaky, see http://crbug.com/25045. 7877TEST_F(URLRequestTestFTP, DISABLED_FTPCheckWrongUserRestart) { 7878 ASSERT_TRUE(test_server_.Start()); 7879 7880 base::FilePath app_path; 7881 PathService::Get(base::DIR_SOURCE_ROOT, &app_path); 7882 app_path = app_path.AppendASCII("LICENSE"); 7883 TestDelegate d; 7884 // Set correct login credentials. The delegate will be asked for them when 7885 // the initial login with wrong credentials will fail. 7886 d.set_credentials(AuthCredentials(kChrome, kChrome)); 7887 { 7888 URLRequest r(test_server_.GetURLWithUserAndPassword( 7889 "/LICENSE", "wrong_user", "chrome"), 7890 DEFAULT_PRIORITY, 7891 &d, 7892 &default_context_); 7893 r.Start(); 7894 EXPECT_TRUE(r.is_pending()); 7895 7896 base::RunLoop().Run(); 7897 7898 int64 file_size = 0; 7899 base::GetFileSize(app_path, &file_size); 7900 7901 EXPECT_FALSE(r.is_pending()); 7902 EXPECT_EQ(1, d.response_started_count()); 7903 EXPECT_FALSE(d.received_data_before_response()); 7904 EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size)); 7905 } 7906} 7907 7908// Flaky, see http://crbug.com/25045. 7909TEST_F(URLRequestTestFTP, DISABLED_FTPCacheURLCredentials) { 7910 ASSERT_TRUE(test_server_.Start()); 7911 7912 base::FilePath app_path; 7913 PathService::Get(base::DIR_SOURCE_ROOT, &app_path); 7914 app_path = app_path.AppendASCII("LICENSE"); 7915 7916 scoped_ptr<TestDelegate> d(new TestDelegate); 7917 { 7918 // Pass correct login identity in the URL. 7919 URLRequest r( 7920 test_server_.GetURLWithUserAndPassword("/LICENSE", "chrome", "chrome"), 7921 DEFAULT_PRIORITY, 7922 d.get(), 7923 &default_context_); 7924 r.Start(); 7925 EXPECT_TRUE(r.is_pending()); 7926 7927 base::RunLoop().Run(); 7928 7929 int64 file_size = 0; 7930 base::GetFileSize(app_path, &file_size); 7931 7932 EXPECT_FALSE(r.is_pending()); 7933 EXPECT_EQ(1, d->response_started_count()); 7934 EXPECT_FALSE(d->received_data_before_response()); 7935 EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size)); 7936 } 7937 7938 d.reset(new TestDelegate); 7939 { 7940 // This request should use cached identity from previous request. 7941 URLRequest r(test_server_.GetURL("/LICENSE"), 7942 DEFAULT_PRIORITY, 7943 d.get(), 7944 &default_context_); 7945 r.Start(); 7946 EXPECT_TRUE(r.is_pending()); 7947 7948 base::RunLoop().Run(); 7949 7950 int64 file_size = 0; 7951 base::GetFileSize(app_path, &file_size); 7952 7953 EXPECT_FALSE(r.is_pending()); 7954 EXPECT_EQ(1, d->response_started_count()); 7955 EXPECT_FALSE(d->received_data_before_response()); 7956 EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size)); 7957 } 7958} 7959 7960// Flaky, see http://crbug.com/25045. 7961TEST_F(URLRequestTestFTP, DISABLED_FTPCacheLoginBoxCredentials) { 7962 ASSERT_TRUE(test_server_.Start()); 7963 7964 base::FilePath app_path; 7965 PathService::Get(base::DIR_SOURCE_ROOT, &app_path); 7966 app_path = app_path.AppendASCII("LICENSE"); 7967 7968 scoped_ptr<TestDelegate> d(new TestDelegate); 7969 // Set correct login credentials. The delegate will be asked for them when 7970 // the initial login with wrong credentials will fail. 7971 d->set_credentials(AuthCredentials(kChrome, kChrome)); 7972 { 7973 URLRequest r(test_server_.GetURLWithUserAndPassword( 7974 "/LICENSE", "chrome", "wrong_password"), 7975 DEFAULT_PRIORITY, 7976 d.get(), 7977 &default_context_); 7978 r.Start(); 7979 EXPECT_TRUE(r.is_pending()); 7980 7981 base::RunLoop().Run(); 7982 7983 int64 file_size = 0; 7984 base::GetFileSize(app_path, &file_size); 7985 7986 EXPECT_FALSE(r.is_pending()); 7987 EXPECT_EQ(1, d->response_started_count()); 7988 EXPECT_FALSE(d->received_data_before_response()); 7989 EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size)); 7990 } 7991 7992 // Use a new delegate without explicit credentials. The cached ones should be 7993 // used. 7994 d.reset(new TestDelegate); 7995 { 7996 // Don't pass wrong credentials in the URL, they would override valid cached 7997 // ones. 7998 URLRequest r(test_server_.GetURL("/LICENSE"), 7999 DEFAULT_PRIORITY, 8000 d.get(), 8001 &default_context_); 8002 r.Start(); 8003 EXPECT_TRUE(r.is_pending()); 8004 8005 base::RunLoop().Run(); 8006 8007 int64 file_size = 0; 8008 base::GetFileSize(app_path, &file_size); 8009 8010 EXPECT_FALSE(r.is_pending()); 8011 EXPECT_EQ(1, d->response_started_count()); 8012 EXPECT_FALSE(d->received_data_before_response()); 8013 EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size)); 8014 } 8015} 8016#endif // !defined(DISABLE_FTP_SUPPORT) 8017 8018} // namespace net 8019