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

Unified Diff: net/url_request/url_request_redirect_job.cc

Issue 422233006: Add fake headers to URLRequestRedirectJobs. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix tests Created 6 years, 4 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/url_request/url_request_redirect_job.h ('k') | net/url_request/url_request_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/url_request/url_request_redirect_job.cc
diff --git a/net/url_request/url_request_redirect_job.cc b/net/url_request/url_request_redirect_job.cc
index 818d4c397ec5dee4a69c2116851eb283b5d71b70..15ebdcdf1c098afbc165eba8a0cc9088f263e030 100644
--- a/net/url_request/url_request_redirect_job.cc
+++ b/net/url_request/url_request_redirect_job.cc
@@ -4,12 +4,18 @@
#include "net/url_request/url_request_redirect_job.h"
+#include <string>
+
#include "base/bind.h"
#include "base/compiler_specific.h"
#include "base/logging.h"
#include "base/message_loop/message_loop.h"
+#include "base/strings/stringprintf.h"
#include "net/base/load_timing_info.h"
+#include "net/base/net_errors.h"
#include "net/base/net_log.h"
+#include "net/http/http_response_headers.h"
+#include "net/http/http_util.h"
#include "net/url_request/url_request.h"
namespace net {
@@ -17,16 +23,36 @@ namespace net {
URLRequestRedirectJob::URLRequestRedirectJob(URLRequest* request,
NetworkDelegate* network_delegate,
const GURL& redirect_destination,
- StatusCode http_status_code,
+ ResponseCode response_code,
const std::string& redirect_reason)
: URLRequestJob(request, network_delegate),
redirect_destination_(redirect_destination),
- http_status_code_(http_status_code),
+ response_code_(response_code),
redirect_reason_(redirect_reason),
weak_factory_(this) {
DCHECK(!redirect_reason_.empty());
}
+void URLRequestRedirectJob::GetResponseInfo(HttpResponseInfo* info) {
+ // Should only be called after the URLRequest has been notified there's header
+ // information.
+ DCHECK(fake_headers_);
+
+ // This assumes |info| is a freshly constructed HttpResponseInfo.
+ info->headers = fake_headers_;
+ info->request_time = response_time_;
+ info->response_time = response_time_;
+}
+
+void URLRequestRedirectJob::GetLoadTimingInfo(
+ LoadTimingInfo* load_timing_info) const {
+ // Set send_start and send_end to receive_headers_end_ to be consistent
+ // with network cache behavior.
+ load_timing_info->send_start = receive_headers_end_;
+ load_timing_info->send_end = receive_headers_end_;
+ load_timing_info->receive_headers_end = receive_headers_end_;
+}
+
void URLRequestRedirectJob::Start() {
request()->net_log().AddEvent(
NetLog::TYPE_URL_REQUEST_REDIRECT_JOB,
@@ -37,33 +63,48 @@ void URLRequestRedirectJob::Start() {
weak_factory_.GetWeakPtr()));
}
-bool URLRequestRedirectJob::IsRedirectResponse(GURL* location,
- int* http_status_code) {
- *location = redirect_destination_;
- *http_status_code = http_status_code_;
- return true;
-}
-
bool URLRequestRedirectJob::CopyFragmentOnRedirect(const GURL& location) const {
// The instantiators have full control over the desired redirection target,
// including the reference fragment part of the URL.
return false;
}
+int URLRequestRedirectJob::GetResponseCode() const {
+ // Should only be called after the URLRequest has been notified there's header
+ // information.
+ DCHECK(fake_headers_);
+ return response_code_;
+}
+
URLRequestRedirectJob::~URLRequestRedirectJob() {}
void URLRequestRedirectJob::StartAsync() {
receive_headers_end_ = base::TimeTicks::Now();
- NotifyHeadersComplete();
-}
+ response_time_ = base::Time::Now();
-void URLRequestRedirectJob::GetLoadTimingInfo(
- LoadTimingInfo* load_timing_info) const {
- // Set send_start and send_end to receive_headers_end_ to keep consistent
- // with network cache behavior.
- load_timing_info->send_start = receive_headers_end_;
- load_timing_info->send_end = receive_headers_end_;
- load_timing_info->receive_headers_end = receive_headers_end_;
+ std::string header_string =
+ base::StringPrintf("HTTP/1.1 %i Internal Redirect\n"
+ "Location: %s\n"
+ "Non-Authoritative-Reason: %s",
+ response_code_,
+ redirect_destination_.spec().c_str(),
+ redirect_reason_.c_str());
+ fake_headers_ = new HttpResponseHeaders(
+ HttpUtil::AssembleRawHeaders(header_string.c_str(),
+ header_string.length()));
+ DCHECK(fake_headers_->IsRedirect(NULL));
+
+ request()->net_log().AddEvent(
+ NetLog::TYPE_URL_REQUEST_FAKE_RESPONSE_HEADERS_CREATED,
+ base::Bind(
+ &HttpResponseHeaders::NetLogCallback,
+ base::Unretained(fake_headers_.get())));
+
+ // TODO(mmenke): Consider calling the NetworkDelegate with the headers here.
+ // There's some weirdness about how to handle the case in which the delegate
+ // tries to modify the redirect location, in terms of how IsSafeRedirect
+ // should behave, and whether the fragment should be copied.
+ URLRequestJob::NotifyHeadersComplete();
}
} // namespace net
« no previous file with comments | « net/url_request/url_request_redirect_job.h ('k') | net/url_request/url_request_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698