Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "build/build_config.h" | 5 #include "build/build_config.h" |
| 6 | 6 |
| 7 #if defined(OS_WIN) | 7 #if defined(OS_WIN) |
| 8 #include <windows.h> | 8 #include <windows.h> |
| 9 #include <shlobj.h> | 9 #include <shlobj.h> |
| 10 #endif | 10 #endif |
| (...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 331 ASSERT_NE(AUTH_REQUIRED_RESPONSE_IO_PENDING, auth_retval); | 331 ASSERT_NE(AUTH_REQUIRED_RESPONSE_IO_PENDING, auth_retval); |
| 332 auth_retval_ = auth_retval; | 332 auth_retval_ = auth_retval; |
| 333 } | 333 } |
| 334 void set_auth_credentials(const AuthCredentials& auth_credentials) { | 334 void set_auth_credentials(const AuthCredentials& auth_credentials) { |
| 335 auth_credentials_ = auth_credentials; | 335 auth_credentials_ = auth_credentials; |
| 336 } | 336 } |
| 337 | 337 |
| 338 void set_redirect_url(const GURL& url) { | 338 void set_redirect_url(const GURL& url) { |
| 339 redirect_url_ = url; | 339 redirect_url_ = url; |
| 340 } | 340 } |
| 341 void set_redirect_url_on_headers_received(const GURL& url) { | |
| 342 redirect_url_on_headers_received_ = url; | |
| 343 } | |
| 341 | 344 |
| 342 void set_block_on(int block_on) { | 345 void set_block_on(int block_on) { |
| 343 block_on_ = block_on; | 346 block_on_ = block_on; |
| 344 } | 347 } |
| 345 | 348 |
| 346 // Allows the user to check in which state did we block. | 349 // Allows the user to check in which state did we block. |
| 347 Stage stage_blocked_for_callback() const { | 350 Stage stage_blocked_for_callback() const { |
| 348 EXPECT_EQ(USER_CALLBACK, block_mode_); | 351 EXPECT_EQ(USER_CALLBACK, block_mode_); |
| 349 return stage_blocked_for_callback_; | 352 return stage_blocked_for_callback_; |
| 350 } | 353 } |
| 351 | 354 |
| 352 private: | 355 private: |
| 353 void RunCallback(int response, const CompletionCallback& callback); | 356 void RunCallback(int response, const CompletionCallback& callback); |
| 354 void RunAuthCallback(AuthRequiredResponse response, | 357 void RunAuthCallback(AuthRequiredResponse response, |
| 355 const AuthCallback& callback); | 358 const AuthCallback& callback); |
| 356 | 359 |
| 357 // TestNetworkDelegate implementation. | 360 // TestNetworkDelegate implementation. |
| 358 virtual int OnBeforeURLRequest(URLRequest* request, | 361 virtual int OnBeforeURLRequest(URLRequest* request, |
| 359 const CompletionCallback& callback, | 362 const CompletionCallback& callback, |
| 360 GURL* new_url) OVERRIDE; | 363 GURL* new_url) OVERRIDE; |
| 361 | 364 |
| 362 virtual int OnBeforeSendHeaders(URLRequest* request, | 365 virtual int OnBeforeSendHeaders(URLRequest* request, |
| 363 const CompletionCallback& callback, | 366 const CompletionCallback& callback, |
| 364 HttpRequestHeaders* headers) OVERRIDE; | 367 HttpRequestHeaders* headers) OVERRIDE; |
| 365 | 368 |
| 366 virtual int OnHeadersReceived( | 369 virtual int OnHeadersReceived( |
| 367 URLRequest* request, | 370 URLRequest* request, |
| 368 const CompletionCallback& callback, | 371 const CompletionCallback& callback, |
| 369 const HttpResponseHeaders* original_response_headers, | 372 const HttpResponseHeaders* original_response_headers, |
| 370 scoped_refptr<HttpResponseHeaders>* override_response_headers) OVERRIDE; | 373 scoped_refptr<HttpResponseHeaders>* override_response_headers, |
| 374 GURL* allowed_unsafe_redirect_url) OVERRIDE; | |
| 371 | 375 |
| 372 virtual NetworkDelegate::AuthRequiredResponse OnAuthRequired( | 376 virtual NetworkDelegate::AuthRequiredResponse OnAuthRequired( |
| 373 URLRequest* request, | 377 URLRequest* request, |
| 374 const AuthChallengeInfo& auth_info, | 378 const AuthChallengeInfo& auth_info, |
| 375 const AuthCallback& callback, | 379 const AuthCallback& callback, |
| 376 AuthCredentials* credentials) OVERRIDE; | 380 AuthCredentials* credentials) OVERRIDE; |
| 377 | 381 |
| 378 // Resets the callbacks and |stage_blocked_for_callback_|. | 382 // Resets the callbacks and |stage_blocked_for_callback_|. |
| 379 void Reset(); | 383 void Reset(); |
| 380 | 384 |
| 381 // Checks whether we should block in |stage|. If yes, returns an error code | 385 // Checks whether we should block in |stage|. If yes, returns an error code |
| 382 // and optionally sets up callback based on |block_mode_|. If no, returns OK. | 386 // and optionally sets up callback based on |block_mode_|. If no, returns OK. |
| 383 int MaybeBlockStage(Stage stage, const CompletionCallback& callback); | 387 int MaybeBlockStage(Stage stage, const CompletionCallback& callback); |
| 384 | 388 |
| 385 // Configuration parameters, can be adjusted by public methods: | 389 // Configuration parameters, can be adjusted by public methods: |
| 386 const BlockMode block_mode_; | 390 const BlockMode block_mode_; |
| 387 | 391 |
| 388 // Values returned on blocking stages when mode is SYNCHRONOUS or | 392 // Values returned on blocking stages when mode is SYNCHRONOUS or |
| 389 // AUTO_CALLBACK. For USER_CALLBACK these are set automatically to IO_PENDING. | 393 // AUTO_CALLBACK. For USER_CALLBACK these are set automatically to IO_PENDING. |
| 390 int retval_; // To be returned in non-auth stages. | 394 int retval_; // To be returned in non-auth stages. |
| 391 AuthRequiredResponse auth_retval_; | 395 AuthRequiredResponse auth_retval_; |
| 392 | 396 |
| 393 GURL redirect_url_; // Used if non-empty. | 397 GURL redirect_url_; // Used if non-empty during OnBeforeURLRequest. |
| 398 GURL redirect_url_on_headers_received_; // Used if non-empty. | |
| 394 int block_on_; // Bit mask: in which stages to block. | 399 int block_on_; // Bit mask: in which stages to block. |
| 395 | 400 |
| 396 // |auth_credentials_| will be copied to |*target_auth_credential_| on | 401 // |auth_credentials_| will be copied to |*target_auth_credential_| on |
| 397 // callback. | 402 // callback. |
| 398 AuthCredentials auth_credentials_; | 403 AuthCredentials auth_credentials_; |
| 399 AuthCredentials* target_auth_credentials_; | 404 AuthCredentials* target_auth_credentials_; |
| 400 | 405 |
| 401 // Internal variables, not set by not the user: | 406 // Internal variables, not set by not the user: |
| 402 // Last blocked stage waiting for user callback (unused if |block_mode_| != | 407 // Last blocked stage waiting for user callback (unused if |block_mode_| != |
| 403 // USER_CALLBACK). | 408 // USER_CALLBACK). |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 475 HttpRequestHeaders* headers) { | 480 HttpRequestHeaders* headers) { |
| 476 TestNetworkDelegate::OnBeforeSendHeaders(request, callback, headers); | 481 TestNetworkDelegate::OnBeforeSendHeaders(request, callback, headers); |
| 477 | 482 |
| 478 return MaybeBlockStage(ON_BEFORE_SEND_HEADERS, callback); | 483 return MaybeBlockStage(ON_BEFORE_SEND_HEADERS, callback); |
| 479 } | 484 } |
| 480 | 485 |
| 481 int BlockingNetworkDelegate::OnHeadersReceived( | 486 int BlockingNetworkDelegate::OnHeadersReceived( |
| 482 URLRequest* request, | 487 URLRequest* request, |
| 483 const CompletionCallback& callback, | 488 const CompletionCallback& callback, |
| 484 const HttpResponseHeaders* original_response_headers, | 489 const HttpResponseHeaders* original_response_headers, |
| 485 scoped_refptr<HttpResponseHeaders>* override_response_headers) { | 490 scoped_refptr<HttpResponseHeaders>* override_response_headers, |
| 491 GURL* allowed_unsafe_redirect_url) { | |
| 486 TestNetworkDelegate::OnHeadersReceived( | 492 TestNetworkDelegate::OnHeadersReceived( |
| 487 request, callback, original_response_headers, | 493 request, callback, original_response_headers, |
| 488 override_response_headers); | 494 override_response_headers, allowed_unsafe_redirect_url); |
| 495 | |
| 496 if (!redirect_url_on_headers_received_.is_empty()) { | |
| 497 if (override_response_headers->get() == NULL) { | |
| 498 *override_response_headers = new net::HttpResponseHeaders( | |
| 499 original_response_headers->raw_headers()); | |
| 500 } | |
| 501 (*override_response_headers)->ReplaceStatusLine( | |
| 502 "HTTP/1.1 307 Temporary Redirect"); | |
| 503 (*override_response_headers)->RemoveHeader("location"); | |
| 504 (*override_response_headers)->AddHeader( | |
| 505 "Location: " + redirect_url_on_headers_received_.spec()); | |
| 506 *allowed_unsafe_redirect_url = redirect_url_on_headers_received_; | |
| 507 // Redirect just once. | |
| 508 redirect_url_on_headers_received_ = GURL(); | |
| 509 } | |
| 489 | 510 |
| 490 return MaybeBlockStage(ON_HEADERS_RECEIVED, callback); | 511 return MaybeBlockStage(ON_HEADERS_RECEIVED, callback); |
| 491 } | 512 } |
| 492 | 513 |
| 493 NetworkDelegate::AuthRequiredResponse BlockingNetworkDelegate::OnAuthRequired( | 514 NetworkDelegate::AuthRequiredResponse BlockingNetworkDelegate::OnAuthRequired( |
| 494 URLRequest* request, | 515 URLRequest* request, |
| 495 const AuthChallengeInfo& auth_info, | 516 const AuthChallengeInfo& auth_info, |
| 496 const AuthCallback& callback, | 517 const AuthCallback& callback, |
| 497 AuthCredentials* credentials) { | 518 AuthCredentials* credentials) { |
| 498 TestNetworkDelegate::OnAuthRequired(request, auth_info, callback, | 519 TestNetworkDelegate::OnAuthRequired(request, auth_info, callback, |
| (...skipping 1910 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2409 public: | 2430 public: |
| 2410 explicit FixedDateNetworkDelegate(const std::string& fixed_date) | 2431 explicit FixedDateNetworkDelegate(const std::string& fixed_date) |
| 2411 : fixed_date_(fixed_date) {} | 2432 : fixed_date_(fixed_date) {} |
| 2412 virtual ~FixedDateNetworkDelegate() {} | 2433 virtual ~FixedDateNetworkDelegate() {} |
| 2413 | 2434 |
| 2414 // net::NetworkDelegate implementation | 2435 // net::NetworkDelegate implementation |
| 2415 virtual int OnHeadersReceived( | 2436 virtual int OnHeadersReceived( |
| 2416 net::URLRequest* request, | 2437 net::URLRequest* request, |
| 2417 const net::CompletionCallback& callback, | 2438 const net::CompletionCallback& callback, |
| 2418 const net::HttpResponseHeaders* original_response_headers, | 2439 const net::HttpResponseHeaders* original_response_headers, |
| 2419 scoped_refptr<net::HttpResponseHeaders>* override_response_headers) | 2440 scoped_refptr<net::HttpResponseHeaders>* override_response_headers, |
| 2420 OVERRIDE; | 2441 GURL* allowed_unsafe_redirect_url) OVERRIDE; |
| 2421 | 2442 |
| 2422 private: | 2443 private: |
| 2423 std::string fixed_date_; | 2444 std::string fixed_date_; |
| 2424 | 2445 |
| 2425 DISALLOW_COPY_AND_ASSIGN(FixedDateNetworkDelegate); | 2446 DISALLOW_COPY_AND_ASSIGN(FixedDateNetworkDelegate); |
| 2426 }; | 2447 }; |
| 2427 | 2448 |
| 2428 int FixedDateNetworkDelegate::OnHeadersReceived( | 2449 int FixedDateNetworkDelegate::OnHeadersReceived( |
| 2429 net::URLRequest* request, | 2450 net::URLRequest* request, |
| 2430 const net::CompletionCallback& callback, | 2451 const net::CompletionCallback& callback, |
| 2431 const net::HttpResponseHeaders* original_response_headers, | 2452 const net::HttpResponseHeaders* original_response_headers, |
| 2432 scoped_refptr<net::HttpResponseHeaders>* override_response_headers) { | 2453 scoped_refptr<net::HttpResponseHeaders>* override_response_headers, |
| 2454 GURL* allowed_unsafe_redirect_url) { | |
| 2433 net::HttpResponseHeaders* new_response_headers = | 2455 net::HttpResponseHeaders* new_response_headers = |
| 2434 new net::HttpResponseHeaders(original_response_headers->raw_headers()); | 2456 new net::HttpResponseHeaders(original_response_headers->raw_headers()); |
| 2435 | 2457 |
| 2436 new_response_headers->RemoveHeader("Date"); | 2458 new_response_headers->RemoveHeader("Date"); |
| 2437 new_response_headers->AddHeader("Date: " + fixed_date_); | 2459 new_response_headers->AddHeader("Date: " + fixed_date_); |
| 2438 | 2460 |
| 2439 *override_response_headers = new_response_headers; | 2461 *override_response_headers = new_response_headers; |
| 2440 return TestNetworkDelegate::OnHeadersReceived(request, | 2462 return TestNetworkDelegate::OnHeadersReceived(request, |
| 2441 callback, | 2463 callback, |
| 2442 original_response_headers, | 2464 original_response_headers, |
| 2443 override_response_headers); | 2465 override_response_headers, |
| 2466 allowed_unsafe_redirect_url); | |
| 2444 } | 2467 } |
| 2445 | 2468 |
| 2446 // Test that cookie expiration times are adjusted for server/client clock | 2469 // Test that cookie expiration times are adjusted for server/client clock |
| 2447 // skew and that we handle incorrect timezone specifier "UTC" in HTTP Date | 2470 // skew and that we handle incorrect timezone specifier "UTC" in HTTP Date |
| 2448 // headers by defaulting to GMT. (crbug.com/135131) | 2471 // headers by defaulting to GMT. (crbug.com/135131) |
| 2449 TEST_F(URLRequestTest, AcceptClockSkewCookieWithWrongDateTimezone) { | 2472 TEST_F(URLRequestTest, AcceptClockSkewCookieWithWrongDateTimezone) { |
| 2450 LocalHttpTestServer test_server; | 2473 LocalHttpTestServer test_server; |
| 2451 ASSERT_TRUE(test_server.Start()); | 2474 ASSERT_TRUE(test_server.Start()); |
| 2452 | 2475 |
| 2453 // Set up an expired cookie. | 2476 // Set up an expired cookie. |
| (...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2689 EXPECT_TRUE(test_server_.Stop()); | 2712 EXPECT_TRUE(test_server_.Stop()); |
| 2690 EXPECT_TRUE(test_server_.Start()); | 2713 EXPECT_TRUE(test_server_.Start()); |
| 2691 } | 2714 } |
| 2692 | 2715 |
| 2693 return is_success; | 2716 return is_success; |
| 2694 } | 2717 } |
| 2695 | 2718 |
| 2696 LocalHttpTestServer test_server_; | 2719 LocalHttpTestServer test_server_; |
| 2697 }; | 2720 }; |
| 2698 | 2721 |
| 2722 namespace { | |
| 2723 | |
| 2724 // RedirectOnHeadersReceivedNetworkDelegate redirects to |redirect_url|, | |
| 2725 // optionally with an URL that has been marked safe for redirection. | |
| 2726 class RedirectOnHeadersReceivedNetworkDelegate : public TestNetworkDelegate { | |
| 2727 public: | |
| 2728 explicit RedirectOnHeadersReceivedNetworkDelegate(const GURL& redirect_url) | |
| 2729 : redirect_url_(redirect_url) {} | |
| 2730 virtual ~RedirectOnHeadersReceivedNetworkDelegate() {} | |
| 2731 | |
| 2732 // net::NetworkDelegate implementation | |
| 2733 virtual int OnHeadersReceived( | |
| 2734 net::URLRequest* request, | |
| 2735 const net::CompletionCallback& callback, | |
| 2736 const net::HttpResponseHeaders* original_response_headers, | |
| 2737 scoped_refptr<net::HttpResponseHeaders>* override_response_headers, | |
| 2738 GURL* allowed_unsafe_redirect_url) OVERRIDE; | |
| 2739 | |
| 2740 void set_url_marked_safe_for_redirect(const GURL& safe_url) { | |
| 2741 safe_url_ = safe_url; | |
| 2742 } | |
| 2743 | |
| 2744 private: | |
| 2745 GURL redirect_url_; | |
| 2746 GURL safe_url_; | |
| 2747 | |
| 2748 DISALLOW_COPY_AND_ASSIGN(RedirectOnHeadersReceivedNetworkDelegate); | |
| 2749 }; | |
| 2750 | |
| 2751 int RedirectOnHeadersReceivedNetworkDelegate::OnHeadersReceived( | |
| 2752 net::URLRequest* request, | |
| 2753 const net::CompletionCallback& callback, | |
| 2754 const net::HttpResponseHeaders* original_response_headers, | |
| 2755 scoped_refptr<net::HttpResponseHeaders>* override_response_headers, | |
| 2756 GURL* allowed_unsafe_redirect_url) { | |
| 2757 | |
| 2758 if (!redirect_url_.is_empty()) { | |
| 2759 net::HttpResponseHeaders* new_response_headers = | |
| 2760 new net::HttpResponseHeaders(original_response_headers->raw_headers()); | |
| 2761 | |
| 2762 new_response_headers->ReplaceStatusLine("HTTP/1.1 302 Found"); | |
| 2763 new_response_headers->RemoveHeader("Location"); | |
| 2764 new_response_headers->AddHeader("Location: " + redirect_url_.spec()); | |
| 2765 | |
| 2766 *override_response_headers = new_response_headers; | |
| 2767 *allowed_unsafe_redirect_url = safe_url_; | |
| 2768 redirect_url_ = GURL(); | |
| 2769 } | |
| 2770 return TestNetworkDelegate::OnHeadersReceived(request, | |
| 2771 callback, | |
| 2772 original_response_headers, | |
| 2773 override_response_headers, | |
| 2774 allowed_unsafe_redirect_url); | |
| 2775 } | |
| 2776 | |
| 2777 } // namespace | |
| 2778 | |
| 2779 // Tests that the allowed redirect URL is preserved when the Location header | |
| 2780 // has been overwritten. | |
| 2781 TEST_F(URLRequestTestHTTP, UnsafeRedirectToWhitelistedUnsafeURL) { | |
| 2782 ASSERT_TRUE(test_server_.Start()); | |
| 2783 | |
| 2784 GURL unsafe_url("data:text/html,this-is-considered-an-unsafe-url"); | |
| 2785 RedirectOnHeadersReceivedNetworkDelegate network_delegate(unsafe_url); | |
| 2786 network_delegate.set_url_marked_safe_for_redirect(unsafe_url); | |
| 2787 default_context_.set_network_delegate(&network_delegate); | |
| 2788 TestDelegate d; | |
| 2789 { | |
| 2790 URLRequest r(test_server_.GetURL("whatever"), | |
| 2791 DEFAULT_PRIORITY, | |
| 2792 &d, | |
| 2793 &default_context_); | |
| 2794 | |
| 2795 r.Start(); | |
| 2796 base::RunLoop().Run(); | |
| 2797 | |
| 2798 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); | |
| 2799 | |
| 2800 EXPECT_EQ(2U, r.url_chain().size()); | |
| 2801 EXPECT_EQ(0, r.status().error()); | |
| 2802 EXPECT_EQ(unsafe_url, r.url()); | |
| 2803 } | |
| 2804 } | |
| 2805 | |
| 2806 // Tests that a redirect to a different unsafe URL is blocked, even after adding | |
| 2807 // some other URL to the whitelist. | |
| 2808 TEST_F(URLRequestTestHTTP, UnsafeRedirectToDifferentUnsafeURL) { | |
| 2809 ASSERT_TRUE(test_server_.Start()); | |
| 2810 | |
| 2811 GURL unsafe_url("data:text/html,something"); | |
| 2812 GURL different_unsafe_url("data:text/html,something-else"); | |
| 2813 RedirectOnHeadersReceivedNetworkDelegate network_delegate(unsafe_url); | |
| 2814 network_delegate.set_url_marked_safe_for_redirect(different_unsafe_url); | |
| 2815 default_context_.set_network_delegate(&network_delegate); | |
| 2816 TestDelegate d; | |
| 2817 { | |
| 2818 URLRequest r(test_server_.GetURL("whatever"), | |
| 2819 DEFAULT_PRIORITY, | |
| 2820 &d, | |
| 2821 &default_context_); | |
| 2822 | |
| 2823 r.Start(); | |
| 2824 base::RunLoop().Run(); | |
| 2825 | |
| 2826 EXPECT_EQ(URLRequestStatus::FAILED, r.status().status()); | |
| 2827 EXPECT_EQ(ERR_UNSAFE_REDIRECT, r.status().error()); | |
| 2828 } | |
| 2829 } | |
| 2830 | |
| 2831 // Tests that a redirect to a safe URL is allowed, regardless of whether an | |
| 2832 // unsafe URL was whitelisted. | |
| 2833 TEST_F(URLRequestTestHTTP, UnsafeRedirectToSafeURL) { | |
| 2834 ASSERT_TRUE(test_server_.Start()); | |
| 2835 | |
| 2836 GURL safe_url(test_server_.GetURL("echoheader?")); | |
| 2837 GURL unrelated_unsafe_url("data:text/html,does-not-match-safe-url"); | |
| 2838 RedirectOnHeadersReceivedNetworkDelegate network_delegate(safe_url); | |
| 2839 network_delegate.set_url_marked_safe_for_redirect(unrelated_unsafe_url); | |
| 2840 default_context_.set_network_delegate(&network_delegate); | |
| 2841 TestDelegate d; | |
| 2842 { | |
| 2843 URLRequest r(test_server_.GetURL("whatever"), | |
| 2844 DEFAULT_PRIORITY, | |
| 2845 &d, | |
| 2846 &default_context_); | |
| 2847 | |
| 2848 r.Start(); | |
| 2849 base::RunLoop().Run(); | |
| 2850 | |
| 2851 EXPECT_EQ(2U, r.url_chain().size()); | |
| 2852 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); | |
| 2853 EXPECT_EQ(0, r.status().error()); | |
| 2854 EXPECT_EQ(safe_url, r.url()); | |
| 2855 EXPECT_EQ("", d.data_received()); | |
| 2856 } | |
| 2857 } | |
|
mmenke
2014/03/21 18:15:04
This test is indeed probably overkill.
robwu
2014/03/25 00:04:00
Indeed, removed; This case is already covered by t
| |
| 2858 | |
| 2859 // Redirects from an URL with fragment to an unsafe URL without fragment should | |
| 2860 // be allowed. | |
| 2861 TEST_F(URLRequestTestHTTP, UnsafeRedirectWithReferenceFragment) { | |
| 2862 ASSERT_TRUE(test_server_.Start()); | |
| 2863 | |
| 2864 GURL original_url(test_server_.GetURL("original#fragment")); | |
| 2865 GURL unsafe_url("data:,url-marked-safe-and-used-in-redirect"); | |
| 2866 GURL expected_url("data:,url-marked-safe-and-used-in-redirect#fragment"); | |
|
mmenke
2014/03/21 18:15:04
Suggest a linebreak after the GURLs in all of thes
robwu
2014/03/25 00:04:00
Done.
| |
| 2867 RedirectOnHeadersReceivedNetworkDelegate network_delegate(unsafe_url); | |
| 2868 network_delegate.set_url_marked_safe_for_redirect(unsafe_url); | |
| 2869 default_context_.set_network_delegate(&network_delegate); | |
| 2870 TestDelegate d; | |
| 2871 { | |
| 2872 URLRequest r(original_url, DEFAULT_PRIORITY, &d, &default_context_); | |
| 2873 | |
| 2874 r.Start(); | |
| 2875 base::RunLoop().Run(); | |
| 2876 | |
| 2877 EXPECT_EQ(2U, r.url_chain().size()); | |
| 2878 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); | |
| 2879 EXPECT_EQ(0, r.status().error()); | |
| 2880 EXPECT_EQ(original_url, r.original_url()); | |
| 2881 EXPECT_EQ(expected_url, r.url()); | |
| 2882 } | |
| 2883 } | |
| 2884 | |
| 2885 // When a delegate has specified a safe redirect URL, but it does not match the | |
| 2886 // redirect target, then do not prevent the reference fragment from being added. | |
| 2887 TEST_F(URLRequestTestHTTP, RedirectWithReferenceFragment) { | |
| 2888 ASSERT_TRUE(test_server_.Start()); | |
| 2889 | |
| 2890 GURL original_url(test_server_.GetURL("original#expected-fragment")); | |
| 2891 GURL unsafe_url("data:text/html,this-url-does-not-match-redirect-url"); | |
| 2892 GURL redirect_url(test_server_.GetURL("target")); | |
| 2893 GURL expected_redirect_url(test_server_.GetURL("target#expected-fragment")); | |
| 2894 RedirectOnHeadersReceivedNetworkDelegate network_delegate(redirect_url); | |
| 2895 network_delegate.set_url_marked_safe_for_redirect(unsafe_url); | |
| 2896 default_context_.set_network_delegate(&network_delegate); | |
| 2897 TestDelegate d; | |
| 2898 { | |
| 2899 URLRequest r(original_url, DEFAULT_PRIORITY, &d, &default_context_); | |
| 2900 | |
| 2901 r.Start(); | |
| 2902 base::RunLoop().Run(); | |
| 2903 | |
| 2904 EXPECT_EQ(2U, r.url_chain().size()); | |
| 2905 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); | |
| 2906 EXPECT_EQ(0, r.status().error()); | |
| 2907 EXPECT_EQ(original_url, r.original_url()); | |
| 2908 EXPECT_EQ(expected_redirect_url, r.url()); | |
| 2909 } | |
| 2910 } | |
|
mmenke
2014/03/21 18:15:04
I don't think we need this test. But I do think w
robwu
2014/03/25 00:04:00
Currently, the test is indeed redundant (it merely
| |
| 2911 | |
| 2699 // In this unit test, we're using the HTTPTestServer as a proxy server and | 2912 // In this unit test, we're using the HTTPTestServer as a proxy server and |
| 2700 // issuing a CONNECT request with the magic host name "www.redirect.com". | 2913 // issuing a CONNECT request with the magic host name "www.redirect.com". |
| 2701 // The HTTPTestServer will return a 302 response, which we should not | 2914 // The HTTPTestServer will return a 302 response, which we should not |
| 2702 // follow. | 2915 // follow. |
| 2703 TEST_F(URLRequestTestHTTP, ProxyTunnelRedirectTest) { | 2916 TEST_F(URLRequestTestHTTP, ProxyTunnelRedirectTest) { |
| 2704 ASSERT_TRUE(test_server_.Start()); | 2917 ASSERT_TRUE(test_server_.Start()); |
| 2705 | 2918 |
| 2706 TestNetworkDelegate network_delegate; // Must outlive URLRequest. | 2919 TestNetworkDelegate network_delegate; // Must outlive URLRequest. |
| 2707 TestURLRequestContextWithProxy context( | 2920 TestURLRequestContextWithProxy context( |
| 2708 test_server_.host_port_pair().ToString(), &network_delegate); | 2921 test_server_.host_port_pair().ToString(), &network_delegate); |
| (...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3000 EXPECT_EQ(original_url, r.original_url()); | 3213 EXPECT_EQ(original_url, r.original_url()); |
| 3001 EXPECT_EQ(2U, r.url_chain().size()); | 3214 EXPECT_EQ(2U, r.url_chain().size()); |
| 3002 EXPECT_EQ(1, network_delegate.created_requests()); | 3215 EXPECT_EQ(1, network_delegate.created_requests()); |
| 3003 EXPECT_EQ(0, network_delegate.destroyed_requests()); | 3216 EXPECT_EQ(0, network_delegate.destroyed_requests()); |
| 3004 EXPECT_EQ("POST", r.method()); | 3217 EXPECT_EQ("POST", r.method()); |
| 3005 EXPECT_EQ(kData, d.data_received()); | 3218 EXPECT_EQ(kData, d.data_received()); |
| 3006 } | 3219 } |
| 3007 EXPECT_EQ(1, network_delegate.destroyed_requests()); | 3220 EXPECT_EQ(1, network_delegate.destroyed_requests()); |
| 3008 } | 3221 } |
| 3009 | 3222 |
| 3223 // Tests that the network delegate can block and redirect a request to a new | |
| 3224 // URL during OnHeadersReceived. | |
| 3225 TEST_F(URLRequestTestHTTP, NetworkDelegateRedirectRequestOnHeadersReceived) { | |
| 3226 ASSERT_TRUE(test_server_.Start()); | |
| 3227 | |
| 3228 TestDelegate d; | |
| 3229 BlockingNetworkDelegate network_delegate( | |
| 3230 BlockingNetworkDelegate::AUTO_CALLBACK); | |
| 3231 network_delegate.set_block_on(BlockingNetworkDelegate::ON_HEADERS_RECEIVED); | |
| 3232 GURL redirect_url(test_server_.GetURL("simple.html")); | |
| 3233 network_delegate.set_redirect_url_on_headers_received(redirect_url); | |
| 3234 | |
| 3235 TestURLRequestContextWithProxy context( | |
| 3236 test_server_.host_port_pair().ToString(), &network_delegate); | |
| 3237 | |
| 3238 { | |
| 3239 GURL original_url(test_server_.GetURL("empty.html")); | |
| 3240 URLRequest r(original_url, DEFAULT_PRIORITY, &d, &context); | |
| 3241 | |
| 3242 r.Start(); | |
| 3243 base::RunLoop().Run(); | |
| 3244 | |
| 3245 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); | |
| 3246 EXPECT_EQ(0, r.status().error()); | |
| 3247 EXPECT_EQ(redirect_url, r.url()); | |
| 3248 EXPECT_EQ(original_url, r.original_url()); | |
| 3249 EXPECT_EQ(2U, r.url_chain().size()); | |
| 3250 EXPECT_EQ(2, network_delegate.created_requests()); | |
| 3251 EXPECT_EQ(0, network_delegate.destroyed_requests()); | |
| 3252 } | |
| 3253 EXPECT_EQ(1, network_delegate.destroyed_requests()); | |
| 3254 } | |
| 3255 | |
| 3256 // Tests that redirects caused by the network delegate during OnHeadersReceived | |
| 3257 // preserve POST data. | |
|
mmenke
2014/03/21 18:15:04
Both these test are probably overkill as well. Mo
robwu
2014/03/25 00:04:00
You're right. What I actually wanted to do was to
| |
| 3258 TEST_F(URLRequestTestHTTP, | |
| 3259 NetworkDelegateRedirectRequestOnHeadersReceivedPost) { | |
| 3260 ASSERT_TRUE(test_server_.Start()); | |
| 3261 | |
| 3262 const char kData[] = "hello world"; | |
| 3263 | |
| 3264 TestDelegate d; | |
| 3265 BlockingNetworkDelegate network_delegate( | |
| 3266 BlockingNetworkDelegate::AUTO_CALLBACK); | |
| 3267 network_delegate.set_block_on(BlockingNetworkDelegate::ON_HEADERS_RECEIVED); | |
| 3268 GURL redirect_url(test_server_.GetURL("echo")); | |
| 3269 network_delegate.set_redirect_url_on_headers_received(redirect_url); | |
| 3270 | |
| 3271 TestURLRequestContext context(true); | |
| 3272 context.set_network_delegate(&network_delegate); | |
| 3273 context.Init(); | |
| 3274 | |
| 3275 { | |
| 3276 GURL original_url(test_server_.GetURL("empty.html")); | |
| 3277 URLRequest r(original_url, DEFAULT_PRIORITY, &d, &context); | |
| 3278 r.set_method("POST"); | |
| 3279 r.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData))); | |
| 3280 HttpRequestHeaders headers; | |
| 3281 headers.SetHeader(HttpRequestHeaders::kContentLength, | |
| 3282 base::UintToString(arraysize(kData) - 1)); | |
| 3283 r.SetExtraRequestHeaders(headers); | |
| 3284 r.Start(); | |
| 3285 base::RunLoop().Run(); | |
| 3286 | |
| 3287 EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); | |
| 3288 EXPECT_EQ(0, r.status().error()); | |
| 3289 EXPECT_EQ(redirect_url, r.url()); | |
| 3290 EXPECT_EQ(original_url, r.original_url()); | |
| 3291 EXPECT_EQ(2U, r.url_chain().size()); | |
| 3292 EXPECT_EQ(2, network_delegate.created_requests()); | |
| 3293 EXPECT_EQ(0, network_delegate.destroyed_requests()); | |
| 3294 EXPECT_EQ("POST", r.method()); | |
| 3295 EXPECT_EQ(kData, d.data_received()); | |
| 3296 } | |
| 3297 EXPECT_EQ(1, network_delegate.destroyed_requests()); | |
| 3298 } | |
| 3299 | |
| 3010 // Tests that the network delegate can synchronously complete OnAuthRequired | 3300 // Tests that the network delegate can synchronously complete OnAuthRequired |
| 3011 // by taking no action. This indicates that the NetworkDelegate does not want to | 3301 // by taking no action. This indicates that the NetworkDelegate does not want to |
| 3012 // handle the challenge, and is passing the buck along to the | 3302 // handle the challenge, and is passing the buck along to the |
| 3013 // URLRequest::Delegate. | 3303 // URLRequest::Delegate. |
| 3014 TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredSyncNoAction) { | 3304 TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredSyncNoAction) { |
| 3015 ASSERT_TRUE(test_server_.Start()); | 3305 ASSERT_TRUE(test_server_.Start()); |
| 3016 | 3306 |
| 3017 TestDelegate d; | 3307 TestDelegate d; |
| 3018 BlockingNetworkDelegate network_delegate( | 3308 BlockingNetworkDelegate network_delegate( |
| 3019 BlockingNetworkDelegate::SYNCHRONOUS); | 3309 BlockingNetworkDelegate::SYNCHRONOUS); |
| (...skipping 892 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3912 const CompletionCallback& callback, | 4202 const CompletionCallback& callback, |
| 3913 HttpRequestHeaders* headers) OVERRIDE { | 4203 HttpRequestHeaders* headers) OVERRIDE { |
| 3914 TestNetworkDelegate::OnBeforeSendHeaders(request, callback, headers); | 4204 TestNetworkDelegate::OnBeforeSendHeaders(request, callback, headers); |
| 3915 return RunCallbackAsynchronously(request, callback); | 4205 return RunCallbackAsynchronously(request, callback); |
| 3916 } | 4206 } |
| 3917 | 4207 |
| 3918 virtual int OnHeadersReceived( | 4208 virtual int OnHeadersReceived( |
| 3919 URLRequest* request, | 4209 URLRequest* request, |
| 3920 const CompletionCallback& callback, | 4210 const CompletionCallback& callback, |
| 3921 const HttpResponseHeaders* original_response_headers, | 4211 const HttpResponseHeaders* original_response_headers, |
| 3922 scoped_refptr<HttpResponseHeaders>* override_response_headers) OVERRIDE { | 4212 scoped_refptr<HttpResponseHeaders>* override_response_headers, |
| 4213 GURL* allowed_unsafe_redirect_url) OVERRIDE { | |
| 3923 TestNetworkDelegate::OnHeadersReceived(request, callback, | 4214 TestNetworkDelegate::OnHeadersReceived(request, callback, |
| 3924 original_response_headers, | 4215 original_response_headers, |
| 3925 override_response_headers); | 4216 override_response_headers, |
| 4217 allowed_unsafe_redirect_url); | |
| 3926 return RunCallbackAsynchronously(request, callback); | 4218 return RunCallbackAsynchronously(request, callback); |
| 3927 } | 4219 } |
| 3928 | 4220 |
| 3929 virtual NetworkDelegate::AuthRequiredResponse OnAuthRequired( | 4221 virtual NetworkDelegate::AuthRequiredResponse OnAuthRequired( |
| 3930 URLRequest* request, | 4222 URLRequest* request, |
| 3931 const AuthChallengeInfo& auth_info, | 4223 const AuthChallengeInfo& auth_info, |
| 3932 const AuthCallback& callback, | 4224 const AuthCallback& callback, |
| 3933 AuthCredentials* credentials) OVERRIDE { | 4225 AuthCredentials* credentials) OVERRIDE { |
| 3934 AsyncDelegateLogger::Run( | 4226 AsyncDelegateLogger::Run( |
| 3935 request, | 4227 request, |
| (...skipping 3657 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7593 | 7885 |
| 7594 EXPECT_FALSE(r.is_pending()); | 7886 EXPECT_FALSE(r.is_pending()); |
| 7595 EXPECT_EQ(1, d->response_started_count()); | 7887 EXPECT_EQ(1, d->response_started_count()); |
| 7596 EXPECT_FALSE(d->received_data_before_response()); | 7888 EXPECT_FALSE(d->received_data_before_response()); |
| 7597 EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size)); | 7889 EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size)); |
| 7598 } | 7890 } |
| 7599 } | 7891 } |
| 7600 #endif // !defined(DISABLE_FTP_SUPPORT) | 7892 #endif // !defined(DISABLE_FTP_SUPPORT) |
| 7601 | 7893 |
| 7602 } // namespace net | 7894 } // namespace net |
| OLD | NEW |