1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/url_request/url_request.h"
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/compiler_specific.h"
8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/singleton.h"
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/message_loop.h"
10731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/metrics/stats_counters.h"
11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/synchronization/lock.h"
12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/base/host_port_pair.h"
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/load_flags.h"
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/net_errors.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/net_log.h"
16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/base/network_delegate.h"
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/ssl_cert_request_info.h"
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/upload_data.h"
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/http/http_response_headers.h"
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/http/http_util.h"
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/url_request/url_request_context.h"
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "net/url_request/url_request_error_job.h"
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/url_request/url_request_job.h"
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/url_request/url_request_job_manager.h"
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/url_request/url_request_netlog_params.h"
26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "net/url_request/url_request_redirect_job.h"
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottusing base::Time;
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottusing std::string;
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace net {
32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Max number of http redirects to follow.  Same number as gecko.
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kMaxRedirects = 20;
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Discard headers which have meaning in POST (Content-Length, Content-Type,
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Origin).
40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid StripPostSpecificHeaders(HttpRequestHeaders* headers) {
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // These are headers that may be attached to a POST.
42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  headers->RemoveHeader(HttpRequestHeaders::kContentLength);
43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  headers->RemoveHeader(HttpRequestHeaders::kContentType);
44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  headers->RemoveHeader(HttpRequestHeaders::kOrigin);
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
47dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// This counter keeps track of the identifiers used for URL requests so far.
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// 0 is reserved to represent an invalid ID.
49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenuint64 g_next_url_request_identifier = 1;
50dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// This lock protects g_next_url_request_identifier.
52dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbase::Lock g_next_url_request_identifier_lock;
53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
54dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Returns an prior unused identifier for URL requests.
55dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenuint64 GenerateURLRequestIdentifier() {
56dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  base::AutoLock lock(g_next_url_request_identifier_lock);
57dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return g_next_url_request_identifier++;
58dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
59dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott///////////////////////////////////////////////////////////////////////////////
633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// URLRequest::Interceptor
643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
653345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickURLRequestJob* URLRequest::Interceptor::MaybeInterceptRedirect(
663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    URLRequest* request,
673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const GURL& location) {
683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return NULL;
693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
713345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickURLRequestJob* URLRequest::Interceptor::MaybeInterceptResponse(
723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    URLRequest* request) {
733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return NULL;
743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick///////////////////////////////////////////////////////////////////////////////
773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// URLRequest::Delegate
783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid URLRequest::Delegate::OnReceivedRedirect(URLRequest* request,
803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                              const GURL& new_url,
813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                              bool* defer_redirect) {
823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid URLRequest::Delegate::OnAuthRequired(URLRequest* request,
85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                          AuthChallengeInfo* auth_info) {
863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  request->CancelAuth();
873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid URLRequest::Delegate::OnCertificateRequested(
903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    URLRequest* request,
91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    SSLCertRequestInfo* cert_request_info) {
923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  request->ContinueWithCertificate(NULL);
933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid URLRequest::Delegate::OnSSLCertificateError(URLRequest* request,
963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                                 int cert_error,
97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                                 X509Certificate* cert) {
983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  request->Cancel();
993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid URLRequest::Delegate::OnGetCookies(URLRequest* request,
1023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                        bool blocked_by_policy) {
1033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid URLRequest::Delegate::OnSetCookie(URLRequest* request,
1063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                       const std::string& cookie_line,
107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       const CookieOptions& options,
1083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                       bool blocked_by_policy) {
1093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick///////////////////////////////////////////////////////////////////////////////
112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// URLRequest
113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottURLRequest::URLRequest(const GURL& url, Delegate* delegate)
115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    : url_chain_(1, url),
116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      method_("GET"),
117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      load_flags_(LOAD_NORMAL),
118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      delegate_(delegate),
119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      is_pending_(false),
120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      redirect_limit_(kMaxRedirects),
121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      final_upload_progress_(0),
122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      priority_(LOWEST),
123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      identifier_(GenerateURLRequestIdentifier()),
124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      ALLOW_THIS_IN_INITIALIZER_LIST(
125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          before_request_callback_(this, &URLRequest::BeforeRequestComplete)) {
126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SIMPLE_STATS_COUNTER("URLRequestCount");
127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Sanity check out environment.
129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(MessageLoop::current()) <<
130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "The current MessageLoop must exist";
131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK_EQ(MessageLoop::TYPE_IO, MessageLoop::current()->type()) <<
132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "The current MessageLoop must be TYPE_IO";
133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottURLRequest::~URLRequest() {
136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (context_ && context_->network_delegate())
137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    context_->network_delegate()->NotifyURLRequestDestroyed(this);
138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Cancel();
140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (job_)
142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    OrphanJob();
143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  set_context(NULL);
145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottURLRequest::ProtocolFactory* URLRequest::RegisterProtocolFactory(
149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const string& scheme, ProtocolFactory* factory) {
15021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return URLRequestJobManager::GetInstance()->RegisterProtocolFactory(scheme,
15121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                                                      factory);
152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid URLRequest::RegisterRequestInterceptor(Interceptor* interceptor) {
15621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  URLRequestJobManager::GetInstance()->RegisterRequestInterceptor(interceptor);
157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid URLRequest::UnregisterRequestInterceptor(Interceptor* interceptor) {
16121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  URLRequestJobManager::GetInstance()->UnregisterRequestInterceptor(
16221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      interceptor);
163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid URLRequest::AppendBytesToUpload(const char* bytes, int bytes_len) {
166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(bytes_len > 0 && bytes);
167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (!upload_)
168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    upload_ = new UploadData();
169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  upload_->AppendBytes(bytes, bytes_len);
170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid URLRequest::AppendFileRangeToUpload(
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const FilePath& file_path,
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    uint64 offset,
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    uint64 length,
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const base::Time& expected_modification_time) {
177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(file_path.value().length() > 0 && length > 0);
178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (!upload_)
179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    upload_ = new UploadData();
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  upload_->AppendFileRange(file_path, offset, length,
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           expected_modification_time);
182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
18472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid URLRequest::EnableChunkedUpload() {
18572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DCHECK(!upload_ || upload_->is_chunked());
18672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!upload_) {
18772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    upload_ = new UploadData();
18872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    upload_->set_is_chunked(true);
18972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
19072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
19172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
192dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid URLRequest::AppendChunkToUpload(const char* bytes,
193dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                     int bytes_len,
194dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                     bool is_last_chunk) {
19572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DCHECK(upload_);
19672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DCHECK(upload_->is_chunked());
19772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DCHECK_GT(bytes_len, 0);
198dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  upload_->AppendChunk(bytes, bytes_len, is_last_chunk);
19972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
20072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
201ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid URLRequest::set_upload(UploadData* upload) {
202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  upload_ = upload;
203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Get the upload data directly.
206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenUploadData* URLRequest::get_upload() {
207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return upload_.get();
208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool URLRequest::has_upload() const {
211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return upload_ != NULL;
212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid URLRequest::SetExtraRequestHeaderById(int id, const string& value,
215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                           bool overwrite) {
216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(!is_pending_);
217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  NOTREACHED() << "implement me!";
218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid URLRequest::SetExtraRequestHeaderByName(const string& name,
221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                             const string& value,
222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                             bool overwrite) {
223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(!is_pending_);
2246aec04f56872b7b764c365c1ad4e3bba2d708977Kristian Monsen  if (overwrite) {
2256aec04f56872b7b764c365c1ad4e3bba2d708977Kristian Monsen    extra_request_headers_.SetHeader(name, value);
2266aec04f56872b7b764c365c1ad4e3bba2d708977Kristian Monsen  } else {
2276aec04f56872b7b764c365c1ad4e3bba2d708977Kristian Monsen    extra_request_headers_.SetHeaderIfMissing(name, value);
2286aec04f56872b7b764c365c1ad4e3bba2d708977Kristian Monsen  }
229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid URLRequest::SetExtraRequestHeaders(
232ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const HttpRequestHeaders& headers) {
233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(!is_pending_);
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  extra_request_headers_ = headers;
235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // NOTE: This method will likely become non-trivial once the other setters
237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // for request headers are implemented.
238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
240ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenLoadState URLRequest::GetLoadState() const {
241ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return job_ ? job_->GetLoadState() : LOAD_STATE_IDLE;
242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottuint64 URLRequest::GetUploadProgress() const {
245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (!job_) {
246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // We haven't started or the request was cancelled
247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return 0;
248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (final_upload_progress_) {
250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // The first job completed and none of the subsequent series of
251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // GETs when following redirects will upload anything, so we return the
252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // cached results from the initial job, the POST.
253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return final_upload_progress_;
254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return job_->GetUploadProgress();
256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid URLRequest::GetResponseHeaderById(int id, string* value) {
259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(job_);
260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  NOTREACHED() << "implement me!";
261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid URLRequest::GetResponseHeaderByName(const string& name, string* value) {
264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(value);
265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (response_info_.headers) {
266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    response_info_.headers->GetNormalizedHeader(name, value);
267c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  } else {
268c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    value->clear();
269c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
270c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
271c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid URLRequest::GetAllResponseHeaders(string* headers) {
273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(headers);
274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (response_info_.headers) {
275c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    response_info_.headers->GetNormalizedHeaders(headers);
276c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  } else {
277c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    headers->clear();
278c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
279c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
281dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenHostPortPair URLRequest::GetSocketAddress() const {
282dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DCHECK(job_);
283dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return job_->GetSocketAddress();
284dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
285dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
286ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenHttpResponseHeaders* URLRequest::response_headers() const {
287c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return response_info_.headers.get();
288c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
290c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool URLRequest::GetResponseCookies(ResponseCookies* cookies) {
291c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(job_);
292c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return job_->GetResponseCookies(cookies);
293c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
294c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
295c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid URLRequest::GetMimeType(string* mime_type) {
296c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(job_);
297c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  job_->GetMimeType(mime_type);
298c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
299c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
300c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid URLRequest::GetCharset(string* charset) {
301c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(job_);
302c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  job_->GetCharset(charset);
303c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
304c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
305c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint URLRequest::GetResponseCode() {
306c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(job_);
307c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return job_->GetResponseCode();
308c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
309c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
310c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
311c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool URLRequest::IsHandledProtocol(const std::string& scheme) {
31221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return URLRequestJobManager::GetInstance()->SupportsScheme(scheme);
313c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
314c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
315c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
316c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool URLRequest::IsHandledURL(const GURL& url) {
317c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (!url.is_valid()) {
318c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // We handle error cases.
319c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return true;
320c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
321c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
322c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return IsHandledProtocol(url.scheme());
323c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
324c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
3254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// static
3264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid URLRequest::AllowFileAccess() {
32721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  URLRequestJobManager::GetInstance()->set_enable_file_access(true);
3284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
3294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
3304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// static
3314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochbool URLRequest::IsFileAccessAllowed() {
33221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return URLRequestJobManager::GetInstance()->enable_file_access();
3334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
3344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
3354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
336c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid URLRequest::set_first_party_for_cookies(
337c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const GURL& first_party_for_cookies) {
338c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  first_party_for_cookies_ = first_party_for_cookies;
339c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
340c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
341c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid URLRequest::set_method(const std::string& method) {
342c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(!is_pending_);
343c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  method_ = method;
344c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
345c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
346c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid URLRequest::set_referrer(const std::string& referrer) {
347c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(!is_pending_);
348c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  referrer_ = referrer;
349c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
350c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
351c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottGURL URLRequest::GetSanitizedReferrer() const {
352c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  GURL ret(referrer());
353c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
354c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Ensure that we do not send username and password fields in the referrer.
355c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (ret.has_username() || ret.has_password()) {
356c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    GURL::Replacements referrer_mods;
357c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    referrer_mods.ClearUsername();
358c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    referrer_mods.ClearPassword();
359c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ret = ret.ReplaceComponents(referrer_mods);
360c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
361c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
362c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return ret;
363c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
364c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
365c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid URLRequest::Start() {
366ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  response_info_.request_time = Time::Now();
367ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
368ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Only notify the delegate for the initial request.
369ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (context_ && context_->network_delegate()) {
370ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (context_->network_delegate()->NotifyBeforeURLRequest(
371ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            this, &before_request_callback_, &delegate_redirect_url_) ==
372ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            net::ERR_IO_PENDING) {
373ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      net_log_.BeginEvent(NetLog::TYPE_URL_REQUEST_BLOCKED_ON_EXTENSION, NULL);
374ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;  // paused
375ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
376ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
377ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
378ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  StartInternal();
379c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
380c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
381c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott///////////////////////////////////////////////////////////////////////////////
382c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
383ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid URLRequest::BeforeRequestComplete(int error) {
384ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DCHECK(!job_);
385ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DCHECK_NE(ERR_IO_PENDING, error);
386ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
387ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  net_log_.EndEvent(NetLog::TYPE_URL_REQUEST_BLOCKED_ON_EXTENSION, NULL);
388ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (error != OK) {
389ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    StartJob(new URLRequestErrorJob(this, error));
390ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  } else if (!delegate_redirect_url_.is_empty()) {
391ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    GURL new_url;
392ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    new_url.Swap(&delegate_redirect_url_);
393ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    StartJob(new URLRequestRedirectJob(this, new_url));
394ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  } else {
395ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    StartInternal();
396ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
397ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
398ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
399ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid URLRequest::StartInternal() {
400ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  StartJob(URLRequestJobManager::GetInstance()->CreateJob(this));
401ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
402ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
403c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid URLRequest::StartJob(URLRequestJob* job) {
404c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(!is_pending_);
405c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(!job_);
406c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  net_log_.BeginEvent(
408ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NetLog::TYPE_URL_REQUEST_START_JOB,
409513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      make_scoped_refptr(new URLRequestStartEventParameters(
410ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          url(), method_, load_flags_, priority_)));
411c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
412c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  job_ = job;
413c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  job_->SetExtraRequestHeaders(extra_request_headers_);
414c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
415c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (upload_.get())
416c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    job_->SetUpload(upload_.get());
417c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
418c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  is_pending_ = true;
419c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
420c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  response_info_.was_cached = false;
421c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
422c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Don't allow errors to be sent from within Start().
423c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // TODO(brettw) this may cause NotifyDone to be sent synchronously,
424c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // we probably don't want this: they should be sent asynchronously so
425c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // the caller does not get reentered.
426c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  job_->Start();
427c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
428c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
429c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid URLRequest::Restart() {
430c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Should only be called if the original job didn't make any progress.
431c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(job_ && !job_->has_response_started());
43221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  RestartWithJob(URLRequestJobManager::GetInstance()->CreateJob(this));
433c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
434c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
435c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid URLRequest::RestartWithJob(URLRequestJob *job) {
436c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(job->request() == this);
437c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  PrepareToRestart();
438c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  StartJob(job);
439c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
440c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
441c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid URLRequest::Cancel() {
442ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DoCancel(ERR_ABORTED, SSLInfo());
443c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
444c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
445c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid URLRequest::SimulateError(int os_error) {
446ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DoCancel(os_error, SSLInfo());
447c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
448c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
449ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid URLRequest::SimulateSSLError(int os_error, const SSLInfo& ssl_info) {
450c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // This should only be called on a started request.
451c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (!is_pending_ || !job_ || job_->has_response_started()) {
452c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    NOTREACHED();
453c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return;
454c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
455c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DoCancel(os_error, ssl_info);
456c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
457c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
458ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid URLRequest::DoCancel(int os_error, const SSLInfo& ssl_info) {
459c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(os_error < 0);
460c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
461c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // If the URL request already has an error status, then canceling is a no-op.
462c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Plus, we don't want to change the error status once it has been set.
463c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (status_.is_success()) {
464c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    status_.set_status(URLRequestStatus::CANCELED);
465c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    status_.set_os_error(os_error);
466c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    response_info_.ssl_info = ssl_info;
467c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
468c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
469c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // There's nothing to do if we are not waiting on a Job.
470c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (!is_pending_ || !job_)
471c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return;
472c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
473c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  job_->Kill();
474c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
475c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The Job will call our NotifyDone method asynchronously.  This is done so
476c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // that the Delegate implementation can call Cancel without having to worry
477c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // about being called recursively.
478c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
479c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
480ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool URLRequest::Read(IOBuffer* dest, int dest_size, int* bytes_read) {
481c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(job_);
482c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(bytes_read);
483c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(!job_->is_done());
484c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  *bytes_read = 0;
485c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
486c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (dest_size == 0) {
487c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // Caller is not too bright.  I guess we've done what they asked.
488c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return true;
489c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
490c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
491c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Once the request fails or is cancelled, read will just return 0 bytes
492c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // to indicate end of stream.
493c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (!status_.is_success()) {
494c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return true;
495c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
496c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
497c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return job_->Read(dest, dest_size, bytes_read);
498c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
499c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid URLRequest::StopCaching() {
501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(job_);
502c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  job_->StopCaching();
503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
505c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid URLRequest::ReceivedRedirect(const GURL& location, bool* defer_redirect) {
50621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  URLRequestJob* job =
50721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      URLRequestJobManager::GetInstance()->MaybeInterceptRedirect(this,
50821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                                                  location);
509c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (job) {
510c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    RestartWithJob(job);
511c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  } else if (delegate_) {
512c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    delegate_->OnReceivedRedirect(this, location, defer_redirect);
513c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
514c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
515c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
516c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid URLRequest::ResponseStarted() {
517ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_refptr<NetLog::EventParameters> params;
518c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (!status_.is_success())
519ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    params = new NetLogIntegerParameter("net_error", status_.os_error());
520ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  net_log_.EndEvent(NetLog::TYPE_URL_REQUEST_START_JOB, params);
521c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
52221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  URLRequestJob* job =
52321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      URLRequestJobManager::GetInstance()->MaybeInterceptResponse(this);
524c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (job) {
525c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    RestartWithJob(job);
526dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  } else {
527dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (context_ && context_->network_delegate())
528dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      context_->network_delegate()->NotifyResponseStarted(this);
529dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (delegate_)
530dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      delegate_->OnResponseStarted(this);
531c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
532c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
533c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
534c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid URLRequest::FollowDeferredRedirect() {
535c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CHECK(job_);
536c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CHECK(status_.is_success());
537c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
538c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  job_->FollowDeferredRedirect();
539c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
540c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid URLRequest::SetAuth(const string16& username, const string16& password) {
542c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(job_);
543c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(job_->NeedsAuth());
544c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
545c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  job_->SetAuth(username, password);
546c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
547c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
548c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid URLRequest::CancelAuth() {
549c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(job_);
550c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(job_->NeedsAuth());
551c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
552c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  job_->CancelAuth();
553c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
554c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
555ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid URLRequest::ContinueWithCertificate(X509Certificate* client_cert) {
556c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(job_);
557c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
558c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  job_->ContinueWithCertificate(client_cert);
559c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
560c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
561c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid URLRequest::ContinueDespiteLastError() {
562c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(job_);
563c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
564c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  job_->ContinueDespiteLastError();
565c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
566c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
567c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid URLRequest::PrepareToRestart() {
568c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(job_);
569c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
570c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close the current URL_REQUEST_START_JOB, since we will be starting a new
571c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // one.
572ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  net_log_.EndEvent(NetLog::TYPE_URL_REQUEST_START_JOB, NULL);
573c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
574c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  OrphanJob();
575c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
576ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  response_info_ = HttpResponseInfo();
577ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  response_info_.request_time = Time::Now();
578c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  status_ = URLRequestStatus();
579c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  is_pending_ = false;
580c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
581c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
582c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid URLRequest::OrphanJob() {
583c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  job_->Kill();
584c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  job_->DetachRequest();  // ensures that the job will not call us again
585c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  job_ = NULL;
586c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
587c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
588c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint URLRequest::Redirect(const GURL& location, int http_status_code) {
589731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (net_log_.IsLoggingAllEvents()) {
590c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    net_log_.AddEvent(
591ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        NetLog::TYPE_URL_REQUEST_REDIRECTED,
592ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        make_scoped_refptr(new NetLogStringParameter(
593513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch            "location", location.possibly_invalid_spec())));
594c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
595c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (redirect_limit_ <= 0) {
596731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    DVLOG(1) << "disallowing redirect: exceeds limit";
597ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return ERR_TOO_MANY_REDIRECTS;
598c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
599c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
600c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (!location.is_valid())
601ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return ERR_INVALID_URL;
602c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
603c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (!job_->IsSafeRedirect(location)) {
604731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    DVLOG(1) << "disallowing redirect: unsafe protocol";
605ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return ERR_UNSAFE_REDIRECT;
606c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
607c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
608c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool strip_post_specific_headers = false;
609c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (http_status_code != 307) {
610c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // NOTE: Even though RFC 2616 says to preserve the request method when
611c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // following a 302 redirect, normal browsers don't do that.  Instead, they
612c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // all convert a POST into a GET in response to a 302 and so shall we.  For
613c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // 307 redirects, browsers preserve the method.  The RFC says to prompt the
614c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // user to confirm the generation of a new POST request, but IE omits this
615c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // prompt and so shall we.
616c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    strip_post_specific_headers = method_ == "POST";
617c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    method_ = "GET";
618c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    upload_ = NULL;
619c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
620c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
621c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Suppress the referrer if we're redirecting out of https.
622c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (GURL(referrer_).SchemeIsSecure() && !location.SchemeIsSecure())
623c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    referrer_.clear();
624c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
625ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  url_chain_.push_back(location);
626c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  --redirect_limit_;
627c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
628c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (strip_post_specific_headers) {
629c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // If being switched from POST to GET, must remove headers that were
630c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // specific to the POST and don't have meaning in GET. For example
631c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // the inclusion of a multipart Content-Type header in GET can cause
632c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // problems with some servers:
633c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // http://code.google.com/p/chromium/issues/detail?id=843
634c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    StripPostSpecificHeaders(&extra_request_headers_);
635c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
636c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
637c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (!final_upload_progress_)
638c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    final_upload_progress_ = job_->GetUploadProgress();
639c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
640c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  PrepareToRestart();
641ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  StartInternal();
642ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return OK;
643c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
644c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
645ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenURLRequestContext* URLRequest::context() const {
646c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return context_.get();
647c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
648c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
649c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid URLRequest::set_context(URLRequestContext* context) {
650c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  scoped_refptr<URLRequestContext> prev_context = context_;
651c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
652c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  context_ = context;
653c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
654c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If the context this request belongs to has changed, update the tracker.
655c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (prev_context != context) {
656ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    net_log_.EndEvent(NetLog::TYPE_REQUEST_ALIVE, NULL);
657ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    net_log_ = BoundNetLog();
658c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
659c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (context) {
660ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      net_log_ = BoundNetLog::Make(context->net_log(),
661ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                   NetLog::SOURCE_URL_REQUEST);
662ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      net_log_.BeginEvent(NetLog::TYPE_REQUEST_ALIVE, NULL);
663c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
664c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
665c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
666c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
667c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint64 URLRequest::GetExpectedContentSize() const {
668c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int64 expected_content_size = -1;
669c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (job_)
670c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    expected_content_size = job_->expected_content_size();
671c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
672c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return expected_content_size;
673c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
674c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
675c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottURLRequest::UserData* URLRequest::GetUserData(const void* key) const {
676c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  UserDataMap::const_iterator found = user_data_.find(key);
677c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (found != user_data_.end())
678c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return found->second.get();
679c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return NULL;
680c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
681c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
682c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid URLRequest::SetUserData(const void* key, UserData* data) {
683c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  user_data_[key] = linked_ptr<UserData>(data);
684c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
68521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
68621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}  // namespace net
687