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