Index: net/url_request/url_request_unittest.cc |
diff --git a/net/url_request/url_request_unittest.cc b/net/url_request/url_request_unittest.cc |
index aab2b324798702eec3111935b873e6ac915a176f..01af382db0f8cb435b2c19f1d6b7f6f85b7fc763 100644 |
--- a/net/url_request/url_request_unittest.cc |
+++ b/net/url_request/url_request_unittest.cc |
@@ -5331,14 +5331,14 @@ TEST_F(URLRequestTestHTTP, UnsafeRedirectToDifferentUnsafeURL) { |
} |
} |
-// Redirects from an URL with fragment to an unsafe URL without fragment should |
-// be allowed. |
-TEST_F(URLRequestTestHTTP, UnsafeRedirectWithReferenceFragment) { |
+// Redirects from an URL with fragment to an unsafe URL with fragment should |
+// be allowed, and the reference fragment of the target URL should be preserved. |
+TEST_F(URLRequestTestHTTP, UnsafeRedirectWithDifferentReferenceFragment) { |
ASSERT_TRUE(test_server_.Start()); |
- GURL original_url(test_server_.GetURL("original#fragment")); |
- GURL unsafe_url("data:,url-marked-safe-and-used-in-redirect"); |
- GURL expected_url("data:,url-marked-safe-and-used-in-redirect#fragment"); |
+ GURL original_url(test_server_.GetURL("original#fragment1")); |
+ GURL unsafe_url("data:,url-marked-safe-and-used-in-redirect#fragment2"); |
+ GURL expected_url("data:,url-marked-safe-and-used-in-redirect#fragment2"); |
default_network_delegate_.set_redirect_on_headers_received_url(unsafe_url); |
default_network_delegate_.set_allowed_unsafe_redirect_url(unsafe_url); |
@@ -5358,16 +5358,17 @@ TEST_F(URLRequestTestHTTP, UnsafeRedirectWithReferenceFragment) { |
} |
} |
-// Redirects from an URL with fragment to an unsafe URL with fragment should |
-// be allowed, and the reference fragment of the target URL should be preserved. |
-TEST_F(URLRequestTestHTTP, UnsafeRedirectWithDifferentReferenceFragment) { |
+// When a delegate has specified a safe redirect URL, but it does not match the |
+// redirect target, then do not prevent the reference fragment from being added. |
+TEST_F(URLRequestTestHTTP, RedirectWithReferenceFragmentAndUnrelatedUnsafeUrl) { |
ASSERT_TRUE(test_server_.Start()); |
- GURL original_url(test_server_.GetURL("original#fragment1")); |
- GURL unsafe_url("data:,url-marked-safe-and-used-in-redirect#fragment2"); |
- GURL expected_url("data:,url-marked-safe-and-used-in-redirect#fragment2"); |
+ GURL original_url(test_server_.GetURL("original#expected-fragment")); |
+ GURL unsafe_url("data:text/html,this-url-does-not-match-redirect-url"); |
+ GURL redirect_url(test_server_.GetURL("target")); |
+ GURL expected_redirect_url(test_server_.GetURL("target#expected-fragment")); |
- default_network_delegate_.set_redirect_on_headers_received_url(unsafe_url); |
+ default_network_delegate_.set_redirect_on_headers_received_url(redirect_url); |
default_network_delegate_.set_allowed_unsafe_redirect_url(unsafe_url); |
TestDelegate d; |
@@ -5381,22 +5382,21 @@ TEST_F(URLRequestTestHTTP, UnsafeRedirectWithDifferentReferenceFragment) { |
EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); |
EXPECT_EQ(net::OK, r.status().error()); |
EXPECT_EQ(original_url, r.original_url()); |
- EXPECT_EQ(expected_url, r.url()); |
+ EXPECT_EQ(expected_redirect_url, r.url()); |
} |
} |
-// When a delegate has specified a safe redirect URL, but it does not match the |
-// redirect target, then do not prevent the reference fragment from being added. |
+// When a delegate has specified a safe redirect URL, assume that the redirect |
+// URL should not be changed. In particular, the reference fragment should not |
+// be modified. |
TEST_F(URLRequestTestHTTP, RedirectWithReferenceFragment) { |
ASSERT_TRUE(test_server_.Start()); |
- GURL original_url(test_server_.GetURL("original#expected-fragment")); |
- GURL unsafe_url("data:text/html,this-url-does-not-match-redirect-url"); |
- GURL redirect_url(test_server_.GetURL("target")); |
- GURL expected_redirect_url(test_server_.GetURL("target#expected-fragment")); |
+ GURL original_url(test_server_.GetURL("original#should-not-be-appended")); |
+ GURL redirect_url("data:text/html,expect-no-reference-fragment"); |
default_network_delegate_.set_redirect_on_headers_received_url(redirect_url); |
- default_network_delegate_.set_allowed_unsafe_redirect_url(unsafe_url); |
+ default_network_delegate_.set_allowed_unsafe_redirect_url(redirect_url); |
TestDelegate d; |
{ |
@@ -5409,10 +5409,35 @@ TEST_F(URLRequestTestHTTP, RedirectWithReferenceFragment) { |
EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); |
EXPECT_EQ(net::OK, r.status().error()); |
EXPECT_EQ(original_url, r.original_url()); |
- EXPECT_EQ(expected_redirect_url, r.url()); |
+ EXPECT_EQ(redirect_url, r.url()); |
} |
} |
+// When a URLRequestRedirectJob is created, the redirection must be followed and |
+// the reference fragment of the target URL must not be modified. |
+TEST_F(URLRequestTestHTTP, RedirectJobWithReferenceFragment) { |
+ ASSERT_TRUE(test_server_.Start()); |
+ |
+ GURL original_url(test_server_.GetURL("original#should-not-be-appended")); |
+ GURL redirect_url(test_server_.GetURL("echo")); |
+ |
+ TestDelegate d; |
+ URLRequest r(original_url, DEFAULT_PRIORITY, &d, &default_context_); |
+ |
+ URLRequestRedirectJob* job = new URLRequestRedirectJob( |
+ &r, &default_network_delegate_, redirect_url, |
+ URLRequestRedirectJob::REDIRECT_302_FOUND, "Very Good Reason"); |
+ AddTestInterceptor()->set_main_intercept_job(job); |
+ |
+ r.Start(); |
+ base::RunLoop().Run(); |
+ |
+ EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); |
+ EXPECT_EQ(net::OK, r.status().error()); |
+ EXPECT_EQ(original_url, r.original_url()); |
+ EXPECT_EQ(redirect_url, r.url()); |
+} |
+ |
TEST_F(URLRequestTestHTTP, NoUserPassInReferrer) { |
ASSERT_TRUE(test_server_.Start()); |
@@ -5992,6 +6017,27 @@ TEST_F(URLRequestTestHTTP, Redirect307Tests) { |
HTTPRedirectMethodTest(url, "HEAD", "HEAD", false); |
} |
+TEST_F(URLRequestTestHTTP, Redirect302PreserveReferenceFragment) { |
+ ASSERT_TRUE(test_server_.Start()); |
+ |
+ GURL original_url(test_server_.GetURL("files/redirect302-to-echo#fragment")); |
+ GURL expected_url(test_server_.GetURL("echo#fragment")); |
+ |
+ TestDelegate d; |
+ { |
+ URLRequest r(original_url, DEFAULT_PRIORITY, &d, &default_context_); |
+ |
+ r.Start(); |
+ base::RunLoop().Run(); |
+ |
+ EXPECT_EQ(2U, r.url_chain().size()); |
+ EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); |
+ EXPECT_EQ(net::OK, r.status().error()); |
+ EXPECT_EQ(original_url, r.original_url()); |
+ EXPECT_EQ(expected_url, r.url()); |
+ } |
+} |
+ |
TEST_F(URLRequestTestHTTP, InterceptPost302RedirectGet) { |
ASSERT_TRUE(test_server_.Start()); |