Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: net/url_request/url_request_unittest.cc

Issue 154473002: Support redirectUrl at onHeadersReceived in WebRequest / DWR API (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Pass allowed_unsafe_redirect_url via delegate parameter instead of HttpResponseHeaders + fragment t… Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
OLDNEW
« net/url_request/url_request_http_job.cc ('K') | « net/url_request/url_request_test_util.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698