Index: net/url_request/url_request_unittest.cc |
=================================================================== |
--- net/url_request/url_request_unittest.cc (revision 106917) |
+++ net/url_request/url_request_unittest.cc (working copy) |
@@ -283,6 +283,45 @@ |
} |
protected: |
+ // Requests |redirect_url|, which must return a HTTP 3xx redirect. |
+ // |request_method| is the method to use for the initial request. |
+ // |redirect_method| is the method that is expected to be used for the second |
+ // request, after redirection. |
+ // If |include_data| is true, data is uploaded with the request. The |
+ // response body is expected to match it exactly, if and only if |
+ // |request_method| == |redirect_method|. |
+ void HTTPRedirectMethodTest(const GURL& redirect_url, |
+ const std::string& request_method, |
+ const std::string& redirect_method, |
+ bool include_data) { |
+ static const char kData[] = "hello world"; |
+ TestDelegate d; |
+ TestURLRequest req(redirect_url, &d); |
+ req.set_context(default_context_); |
+ req.set_method(request_method); |
+ if (include_data) { |
+ req.set_upload(CreateSimpleUploadData(kData).get()); |
+ HttpRequestHeaders headers; |
+ headers.SetHeader(HttpRequestHeaders::kContentLength, |
+ base::UintToString(arraysize(kData) - 1)); |
+ req.SetExtraRequestHeaders(headers); |
+ } |
+ req.Start(); |
+ MessageLoop::current()->Run(); |
+ EXPECT_EQ(redirect_method, req.method()); |
+ EXPECT_EQ(URLRequestStatus::SUCCESS, req.status().status()); |
+ EXPECT_EQ(OK, req.status().error()); |
+ if (include_data) { |
+ if (request_method == redirect_method) { |
+ EXPECT_EQ(kData, d.data_received()); |
+ } else { |
+ EXPECT_NE(kData, d.data_received()); |
+ } |
+ } |
+ if (HasFailure()) |
+ LOG(WARNING) << "Request method was: " << request_method; |
+ } |
+ |
void HTTPUploadDataOperationTest(const std::string& method) { |
const int kMsgSize = 20000; // multiple of 10 |
const int kIterations = 50; |
@@ -2443,26 +2482,45 @@ |
EXPECT_TRUE(ContainsString(data, "Accept-Charset:")); |
} |
-TEST_F(URLRequestTestHTTP, Post307RedirectPost) { |
+// The following tests check that we handle mutating the request method for |
+// HTTP redirects as expected. See http://crbug.com/56373. |
+ |
+TEST_F(URLRequestTestHTTP, Redirect301Tests) { |
ASSERT_TRUE(test_server_.Start()); |
- const char kData[] = "hello world"; |
+ const GURL url = test_server_.GetURL("files/redirect301-to-echo"); |
- TestDelegate d; |
- TestURLRequest req(test_server_.GetURL("files/redirect307-to-echo"), &d); |
- req.set_context(default_context_); |
- req.set_method("POST"); |
- req.set_upload(CreateSimpleUploadData(kData).get()); |
- HttpRequestHeaders headers; |
- headers.SetHeader(HttpRequestHeaders::kContentLength, |
- base::UintToString(arraysize(kData) - 1)); |
- req.SetExtraRequestHeaders(headers); |
- req.Start(); |
- MessageLoop::current()->Run(); |
- EXPECT_EQ("POST", req.method()); |
- EXPECT_EQ(kData, d.data_received()); |
+ HTTPRedirectMethodTest(url, "POST", "GET", true); |
+ HTTPRedirectMethodTest(url, "PUT", "PUT", true); |
} |
+TEST_F(URLRequestTestHTTP, Redirect302Tests) { |
+ ASSERT_TRUE(test_server_.Start()); |
+ |
+ const GURL url = test_server_.GetURL("files/redirect302-to-echo"); |
+ |
+ HTTPRedirectMethodTest(url, "POST", "GET", true); |
+ HTTPRedirectMethodTest(url, "PUT", "PUT", true); |
+} |
+ |
+TEST_F(URLRequestTestHTTP, Redirect303Tests) { |
+ ASSERT_TRUE(test_server_.Start()); |
+ |
+ const GURL url = test_server_.GetURL("files/redirect303-to-echo"); |
+ |
+ HTTPRedirectMethodTest(url, "POST", "GET", true); |
+ HTTPRedirectMethodTest(url, "PUT", "GET", true); |
+} |
+ |
+TEST_F(URLRequestTestHTTP, Redirect307Tests) { |
+ ASSERT_TRUE(test_server_.Start()); |
+ |
+ const GURL url = test_server_.GetURL("files/redirect307-to-echo"); |
+ |
+ HTTPRedirectMethodTest(url, "POST", "POST", true); |
+ HTTPRedirectMethodTest(url, "PUT", "PUT", true); |
+} |
+ |
TEST_F(URLRequestTestHTTP, InterceptPost302RedirectGet) { |
ASSERT_TRUE(test_server_.Start()); |