url_request.cc revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/debug/stack_trace.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/lazy_instance.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/singleton.h" 149ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/metrics/histogram.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/stats_counters.h" 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/metrics/user_metrics.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h" 191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/lock.h" 211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/values.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/auth.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/host_port_pair.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/load_flags.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/load_timing_info.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_log.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/network_change_notifier.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/network_delegate.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/upload_data_stream.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_response_headers.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_util.h" 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/ssl/ssl_cert_request_info.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_error_job.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_job.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_job_manager.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_netlog_params.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_redirect_job.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using std::string; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Max number of http redirects to follow. Same number as gecko. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kMaxRedirects = 20; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Discard headers which have meaning in POST (Content-Length, Content-Type, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Origin). 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StripPostSpecificHeaders(HttpRequestHeaders* headers) { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These are headers that may be attached to a POST. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers->RemoveHeader(HttpRequestHeaders::kContentLength); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers->RemoveHeader(HttpRequestHeaders::kContentType); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers->RemoveHeader(HttpRequestHeaders::kOrigin); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(battre): Delete this, see http://crbug.com/89321: 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This counter keeps track of the identifiers used for URL requests so far. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 0 is reserved to represent an invalid ID. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint64 g_next_url_request_identifier = 1; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This lock protects g_next_url_request_identifier. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::LazyInstance<base::Lock>::Leaky 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_next_url_request_identifier_lock = LAZY_INSTANCE_INITIALIZER; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns an prior unused identifier for URL requests. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint64 GenerateURLRequestIdentifier() { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock lock(g_next_url_request_identifier_lock.Get()); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return g_next_url_request_identifier++; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// True once the first URLRequest was started. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool g_url_requests_started = false; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// True if cookies are accepted by default. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool g_default_can_use_cookies = true; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// When the URLRequest first assempts load timing information, it has the times 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// at which each event occurred. The API requires the time which the request 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// was blocked on each phase. This function handles the conversion. 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// In the case of reusing a SPDY session, old proxy results may have been 86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// reused, so proxy resolution times may be before the request was started. 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Due to preconnect and late binding, it is also possible for the connection 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// attempt to start before a request has been started, or proxy resolution 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// completed. 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This functions fixes both those cases. 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ConvertRealLoadTimesToBlockingTimes( 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::LoadTimingInfo* load_timing_info) { 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!load_timing_info->request_start.is_null()); 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Earliest time possible for the request to be blocking on connect events. 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeTicks block_on_connect = load_timing_info->request_start; 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!load_timing_info->proxy_resolve_start.is_null()) { 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!load_timing_info->proxy_resolve_end.is_null()); 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Make sure the proxy times are after request start. 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (load_timing_info->proxy_resolve_start < load_timing_info->request_start) 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_info->proxy_resolve_start = load_timing_info->request_start; 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (load_timing_info->proxy_resolve_end < load_timing_info->request_start) 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_info->proxy_resolve_end = load_timing_info->request_start; 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Connect times must also be after the proxy times. 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) block_on_connect = load_timing_info->proxy_resolve_end; 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Make sure connection times are after start and proxy times. 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::LoadTimingInfo::ConnectTiming* connect_timing = 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &load_timing_info->connect_timing; 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!connect_timing->dns_start.is_null()) { 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!connect_timing->dns_end.is_null()); 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (connect_timing->dns_start < block_on_connect) 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connect_timing->dns_start = block_on_connect; 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (connect_timing->dns_end < block_on_connect) 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connect_timing->dns_end = block_on_connect; 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!connect_timing->connect_start.is_null()) { 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!connect_timing->connect_end.is_null()); 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (connect_timing->connect_start < block_on_connect) 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connect_timing->connect_start = block_on_connect; 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (connect_timing->connect_end < block_on_connect) 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connect_timing->connect_end = block_on_connect; 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!connect_timing->ssl_start.is_null()) { 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!connect_timing->ssl_end.is_null()); 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (connect_timing->ssl_start < block_on_connect) 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connect_timing->ssl_start = block_on_connect; 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (connect_timing->ssl_end < block_on_connect) 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connect_timing->ssl_end = block_on_connect; 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::Deprecated::RegisterRequestInterceptor( 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Interceptor* interceptor) { 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest::RegisterRequestInterceptor(interceptor); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::Deprecated::UnregisterRequestInterceptor( 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Interceptor* interceptor) { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest::UnregisterRequestInterceptor(interceptor); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URLRequest::Interceptor 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequestJob* URLRequest::Interceptor::MaybeInterceptRedirect( 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest* request, 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegate* network_delegate, 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& location) { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequestJob* URLRequest::Interceptor::MaybeInterceptResponse( 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest* request, NetworkDelegate* network_delegate) { 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URLRequest::Delegate 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::Delegate::OnReceivedRedirect(URLRequest* request, 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& new_url, 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* defer_redirect) { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::Delegate::OnAuthRequired(URLRequest* request, 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthChallengeInfo* auth_info) { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request->CancelAuth(); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::Delegate::OnCertificateRequested( 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest* request, 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLCertRequestInfo* cert_request_info) { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request->Cancel(); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::Delegate::OnSSLCertificateError(URLRequest* request, 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SSLInfo& ssl_info, 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_hsts_ok) { 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request->Cancel(); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void URLRequest::Delegate::OnBeforeNetworkStart(URLRequest* request, 1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool* defer) { 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URLRequest 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequest::URLRequest(const GURL& url, 2020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) RequestPriority priority, 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Delegate* delegate, 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const URLRequestContext* context) 205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : identifier_(GenerateURLRequestIdentifier()) { 206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Init(url, priority, delegate, context, NULL); 207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)URLRequest::URLRequest(const GURL& url, 210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RequestPriority priority, 211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Delegate* delegate, 212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const URLRequestContext* context, 213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CookieStore* cookie_store) 214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : identifier_(GenerateURLRequestIdentifier()) { 215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Init(url, priority, delegate, context, cookie_store); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequest::~URLRequest() { 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cancel(); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (network_delegate_) { 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate_->NotifyURLRequestDestroyed(this); 223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (job_.get()) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) job_->NotifyURLRequestDestroyed(); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 227868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (job_.get()) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OrphanJob(); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int deleted = context_->url_requests()->erase(this); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK_EQ(1, deleted); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int net_error = OK; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Log error only on failure, not cancellation, as even successful requests 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // are "cancelled" on destruction. 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (status_.status() == URLRequestStatus::FAILED) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net_error = status_.error(); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net_log_.EndEventWithNetErrorCode(NetLog::TYPE_REQUEST_ALIVE, net_error); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::RegisterRequestInterceptor(Interceptor* interceptor) { 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestJobManager::GetInstance()->RegisterRequestInterceptor(interceptor); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::UnregisterRequestInterceptor(Interceptor* interceptor) { 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestJobManager::GetInstance()->UnregisterRequestInterceptor( 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 252a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void URLRequest::Init(const GURL& url, 253a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RequestPriority priority, 254a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Delegate* delegate, 255a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const URLRequestContext* context, 256a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CookieStore* cookie_store) { 257a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) context_ = context; 258a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) network_delegate_ = context->network_delegate(); 259a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) net_log_ = BoundNetLog::Make(context->net_log(), NetLog::SOURCE_URL_REQUEST); 260a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) url_chain_.push_back(url); 261a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) method_ = "GET"; 262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) referrer_policy_ = CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE; 263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) load_flags_ = LOAD_NORMAL; 264a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) delegate_ = delegate; 265a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) is_pending_ = false; 266a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) is_redirecting_ = false; 267a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) redirect_limit_ = kMaxRedirects; 268a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) priority_ = priority; 269a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) calling_delegate_ = false; 270a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) use_blocked_by_as_load_param_ =false; 271a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) before_request_callback_ = base::Bind(&URLRequest::BeforeRequestComplete, 272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Unretained(this)); 273a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) has_notified_completion_ = false; 274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) received_response_content_length_ = 0; 275a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) creation_time_ = base::TimeTicks::Now(); 276a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) notified_before_network_start_ = false; 277a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 278a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SIMPLE_STATS_COUNTER("URLRequestCount"); 279a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 280a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Sanity check out environment. 281a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(base::MessageLoop::current()) 282a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) << "The current base::MessageLoop must exist"; 283a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 284a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CHECK(context); 285a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) context->url_requests()->insert(this); 286a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) cookie_store_ = cookie_store; 287a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (cookie_store_ == NULL) 288a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) cookie_store_ = context->cookie_store(); 289a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 290a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) net_log_.BeginEvent(NetLog::TYPE_REQUEST_ALIVE); 291a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 292a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::EnableChunkedUpload() { 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!upload_data_stream_ || upload_data_stream_->is_chunked()); 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!upload_data_stream_) { 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) upload_data_stream_.reset( 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new UploadDataStream(UploadDataStream::CHUNKED, 0)); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::AppendChunkToUpload(const char* bytes, 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bytes_len, 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_last_chunk) { 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(upload_data_stream_); 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(upload_data_stream_->is_chunked()); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_GT(bytes_len, 0); 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) upload_data_stream_->AppendChunk(bytes, bytes_len, is_last_chunk); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void URLRequest::set_upload(scoped_ptr<UploadDataStream> upload) { 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!upload->is_chunked()); 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) upload_data_stream_ = upload.Pass(); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const UploadDataStream* URLRequest::get_upload() const { 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return upload_data_stream_.get(); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool URLRequest::has_upload() const { 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return upload_data_stream_.get() != NULL; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::SetExtraRequestHeaderById(int id, const string& value, 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool overwrite) { 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!is_pending_ || is_redirecting_); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "implement me!"; 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::SetExtraRequestHeaderByName(const string& name, 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string& value, 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool overwrite) { 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!is_pending_ || is_redirecting_); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (overwrite) { 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_request_headers_.SetHeader(name, value); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_request_headers_.SetHeaderIfMissing(name, value); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void URLRequest::RemoveRequestHeaderByName(const string& name) { 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!is_pending_ || is_redirecting_); 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extra_request_headers_.RemoveHeader(name); 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::SetExtraRequestHeaders( 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HttpRequestHeaders& headers) { 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!is_pending_); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_request_headers_ = headers; 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE: This method will likely become non-trivial once the other setters 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for request headers are implemented. 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 354eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool URLRequest::GetFullRequestHeaders(HttpRequestHeaders* headers) const { 355eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!job_.get()) 356eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 357eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 358eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return job_->GetFullRequestHeaders(headers); 359eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 360eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int64 URLRequest::GetTotalReceivedBytes() const { 3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!job_.get()) 3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return 0; 3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return job_->GetTotalReceivedBytes(); 3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LoadStateWithParam URLRequest::GetLoadState() const { 369a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // The !blocked_by_.empty() check allows |this| to report it's blocked on a 370a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // delegate before it has been started. 371a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (calling_delegate_ || !blocked_by_.empty()) { 3721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return LoadStateWithParam( 3731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) LOAD_STATE_WAITING_FOR_DELEGATE, 3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) use_blocked_by_as_load_param_ ? base::UTF8ToUTF16(blocked_by_) : 375a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16()); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 377868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return LoadStateWithParam(job_.get() ? job_->GetLoadState() : LOAD_STATE_IDLE, 378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16()); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)base::Value* URLRequest::GetStateAsValue() const { 3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* dict = new base::DictionaryValue(); 3831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) dict->SetString("url", original_url().possibly_invalid_spec()); 3841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (url_chain_.size() > 1) { 3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ListValue* list = new base::ListValue(); 3871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) for (std::vector<GURL>::const_iterator url = url_chain_.begin(); 3881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) url != url_chain_.end(); ++url) { 3891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) list->AppendString(url->possibly_invalid_spec()); 3901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 3911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) dict->Set("url_chain", list); 3921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 3931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) dict->SetInteger("load_flags", load_flags_); 3951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) LoadStateWithParam load_state = GetLoadState(); 3971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) dict->SetInteger("load_state", load_state.state); 3981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (!load_state.param.empty()) 3991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) dict->SetString("load_state_param", load_state.param); 400a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!blocked_by_.empty()) 401a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) dict->SetString("delegate_info", blocked_by_); 4021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 4031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) dict->SetString("method", method_); 4041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) dict->SetBoolean("has_upload", has_upload()); 4051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) dict->SetBoolean("is_pending", is_pending_); 4061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 4071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Add the status of the request. The status should always be IO_PENDING, and 4081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // the error should always be OK, unless something is holding onto a request 4091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // that has finished or a request was leaked. Neither of these should happen. 4101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) switch (status_.status()) { 4111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case URLRequestStatus::SUCCESS: 4121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) dict->SetString("status", "SUCCESS"); 4131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 4141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case URLRequestStatus::IO_PENDING: 4151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) dict->SetString("status", "IO_PENDING"); 4161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 4171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case URLRequestStatus::CANCELED: 4181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) dict->SetString("status", "CANCELED"); 4191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 4201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case URLRequestStatus::FAILED: 4211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) dict->SetString("status", "FAILED"); 4221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 4231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 4241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (status_.error() != OK) 4251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) dict->SetInteger("net_error", status_.error()); 4261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return dict; 4271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 4281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 429a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void URLRequest::LogBlockedBy(const char* blocked_by) { 430a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(blocked_by); 431a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK_GT(strlen(blocked_by), 0u); 432a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 433a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Only log information to NetLog during startup and certain deferring calls 434a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // to delegates. For all reads but the first, do nothing. 4351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (!calling_delegate_ && !response_info_.request_time.is_null()) 4361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return; 4371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 438a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LogUnblocked(); 439a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blocked_by_ = blocked_by; 440a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) use_blocked_by_as_load_param_ = false; 441a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 442a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) net_log_.BeginEvent( 443a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NetLog::TYPE_DELEGATE_INFO, 444a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NetLog::StringCallback("delegate_info", &blocked_by_)); 445a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 446a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 447a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void URLRequest::LogAndReportBlockedBy(const char* source) { 448a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LogBlockedBy(source); 449a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) use_blocked_by_as_load_param_ = true; 450a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 451a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 452a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void URLRequest::LogUnblocked() { 453a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (blocked_by_.empty()) 454a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 455a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 456a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) net_log_.EndEvent(NetLog::TYPE_DELEGATE_INFO); 457a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blocked_by_.clear(); 4581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 4591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UploadProgress URLRequest::GetUploadProgress() const { 461868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!job_.get()) { 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We haven't started or the request was cancelled 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UploadProgress(); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (final_upload_progress_.position()) { 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The first job completed and none of the subsequent series of 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GETs when following redirects will upload anything, so we return the 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // cached results from the initial job, the POST. 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return final_upload_progress_; 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return job_->GetUploadProgress(); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::GetResponseHeaderById(int id, string* value) { 475868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(job_.get()); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "implement me!"; 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::GetResponseHeaderByName(const string& name, string* value) { 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(value); 481868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (response_info_.headers.get()) { 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response_info_.headers->GetNormalizedHeader(name, value); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->clear(); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::GetAllResponseHeaders(string* headers) { 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(headers); 490868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (response_info_.headers.get()) { 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response_info_.headers->GetNormalizedHeaders(headers); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers->clear(); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HostPortPair URLRequest::GetSocketAddress() const { 498868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(job_.get()); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return job_->GetSocketAddress(); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HttpResponseHeaders* URLRequest::response_headers() const { 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return response_info_.headers.get(); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void URLRequest::GetLoadTimingInfo(LoadTimingInfo* load_timing_info) const { 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *load_timing_info = load_timing_info_; 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool URLRequest::GetResponseCookies(ResponseCookies* cookies) { 511868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(job_.get()); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return job_->GetResponseCookies(cookies); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::GetMimeType(string* mime_type) { 516868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(job_.get()); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) job_->GetMimeType(mime_type); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::GetCharset(string* charset) { 521868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(job_.get()); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) job_->GetCharset(charset); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)int URLRequest::GetResponseCode() const { 526868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(job_.get()); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return job_->GetResponseCode(); 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 530f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void URLRequest::SetLoadFlags(int flags) { 531f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if ((load_flags_ & LOAD_IGNORE_LIMITS) != (flags & LOAD_IGNORE_LIMITS)) { 532f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(!job_); 533f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(flags & LOAD_IGNORE_LIMITS); 534f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK_EQ(priority_, MAXIMUM_PRIORITY); 535f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 536f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) load_flags_ = flags; 537f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 538f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // This should be a no-op given the above DCHECKs, but do this 539f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // anyway for release mode. 540f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if ((load_flags_ & LOAD_IGNORE_LIMITS) != 0) 541f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetPriority(MAXIMUM_PRIORITY); 542f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 543f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::SetDefaultCookiePolicyToBlock() { 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(!g_url_requests_started); 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_default_can_use_cookies = false; 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool URLRequest::IsHandledProtocol(const std::string& scheme) { 552f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return URLRequestJobManager::SupportsScheme(scheme); 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool URLRequest::IsHandledURL(const GURL& url) { 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!url.is_valid()) { 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We handle error cases. 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return IsHandledProtocol(url.scheme()); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::set_first_party_for_cookies( 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& first_party_for_cookies) { 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_party_for_cookies_ = first_party_for_cookies; 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::set_method(const std::string& method) { 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!is_pending_); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) method_ = method; 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5759ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch// static 5769ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdochstd::string URLRequest::ComputeMethodForRedirect( 5779ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch const std::string& method, 5789ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch int http_status_code) { 5799ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch // For 303 redirects, all request methods except HEAD are converted to GET, 5809ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch // as per the latest httpbis draft. The draft also allows POST requests to 5819ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch // be converted to GETs when following 301/302 redirects, for historical 5829ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch // reasons. Most major browsers do this and so shall we. Both RFC 2616 and 5839ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch // the httpbis draft say to prompt the user to confirm the generation of new 5849ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch // requests, other than GET and HEAD requests, but IE omits these prompts and 5859ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch // so shall we. 5869ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch // See: https://tools.ietf.org/html/draft-ietf-httpbis-p2-semantics-17#section-7.3 5879ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch if ((http_status_code == 303 && method != "HEAD") || 5889ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch ((http_status_code == 301 || http_status_code == 302) && 5899ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch method == "POST")) { 5909ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch return "GET"; 5919ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch } 5929ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch return method; 5939ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch} 5949ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch 595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void URLRequest::SetReferrer(const std::string& referrer) { 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!is_pending_); 597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL referrer_url(referrer); 598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UMA_HISTOGRAM_BOOLEAN("Net.URLRequest_SetReferrer_IsEmptyOrValid", 599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) referrer_url.is_empty() || referrer_url.is_valid()); 60023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if (referrer_url.is_valid()) { 60123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) referrer_ = referrer_url.GetAsReferrer().spec(); 60223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } else { 60323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) referrer_ = referrer; 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::set_referrer_policy(ReferrerPolicy referrer_policy) { 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!is_pending_); 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) referrer_policy_ = referrer_policy; 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::set_delegate(Delegate* delegate) { 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_ = delegate; 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::Start() { 617f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Some values can be NULL, but the job factory must not be. 618f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(context_->job_factory()); 619f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(network_delegate_, context_->network_delegate()); 621a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Anything that sets |blocked_by_| before start should have cleaned up after 622a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // itself. 623a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(blocked_by_.empty()); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_url_requests_started = true; 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) response_info_.request_time = base::Time::Now(); 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) load_timing_info_ = LoadTimingInfo(); 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) load_timing_info_.request_start_time = response_info_.request_time; 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) load_timing_info_.request_start = base::TimeTicks::Now(); 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only notify the delegate for the initial request. 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (network_delegate_) { 6341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnCallToDelegate(); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error = network_delegate_->NotifyBeforeURLRequest( 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, before_request_callback_, &delegate_redirect_url_); 6371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // If ERR_IO_PENDING is returned, the delegate will invoke 6381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // |before_request_callback_| later. 6391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (error != ERR_IO_PENDING) 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BeforeRequestComplete(error); 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartJob(URLRequestJobManager::GetInstance()->CreateJob( 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, network_delegate_)); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::BeforeRequestComplete(int error) { 651868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(!job_.get()); 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_NE(ERR_IO_PENDING, error); 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(network_delegate_, context_->network_delegate()); 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that there are no callbacks to already canceled requests. 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_NE(URLRequestStatus::CANCELED, status_.status()); 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnCallToDelegateComplete(); 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (error != OK) { 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string source("delegate"); 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net_log_.AddEvent(NetLog::TYPE_CANCELLED, 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetLog::StringCallback("source", &source)); 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartJob(new URLRequestErrorJob(this, network_delegate_, error)); 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (!delegate_redirect_url_.is_empty()) { 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL new_url; 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_url.Swap(&delegate_redirect_url_); 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestRedirectJob* job = new URLRequestRedirectJob( 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, network_delegate_, new_url, 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Use status code 307 to preserve the method, so POST requests work. 672a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) URLRequestRedirectJob::REDIRECT_307_TEMPORARY_REDIRECT, "Delegate"); 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartJob(job); 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartJob(URLRequestJobManager::GetInstance()->CreateJob( 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, network_delegate_)); 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::StartJob(URLRequestJob* job) { 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!is_pending_); 682868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(!job_.get()); 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net_log_.BeginEvent( 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetLog::TYPE_URL_REQUEST_START_JOB, 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&NetLogURLRequestStartCallback, 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &url(), &method_, load_flags_, priority_, 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) upload_data_stream_ ? upload_data_stream_->identifier() : -1)); 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) job_ = job; 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) job_->SetExtraRequestHeaders(extra_request_headers_); 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) job_->SetPriority(priority_); 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (upload_data_stream_.get()) 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) job_->SetUpload(upload_data_stream_.get()); 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_pending_ = true; 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_redirecting_ = false; 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response_info_.was_cached = false; 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If the referrer is secure, but the requested URL is not, the referrer 7035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // policy should be something non-default. If you hit this, please file a 7045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // bug. 7055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (referrer_policy_ == 7065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE && 7075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL(referrer_).SchemeIsSecure() && !url().SchemeIsSecure()) { 7085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(OFFICIAL_BUILD) 7095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LOG(FATAL) << "Trying to send secure referrer for insecure load"; 7105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 7115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) referrer_.clear(); 7125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RecordAction( 7135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UserMetricsAction("Net.URLRequest_StartJob_InvalidReferrer")); 7145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't allow errors to be sent from within Start(). 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(brettw) this may cause NotifyDone to be sent synchronously, 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we probably don't want this: they should be sent asynchronously so 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the caller does not get reentered. 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) job_->Start(); 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::Restart() { 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should only be called if the original job didn't make any progress. 725868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(job_.get() && !job_->has_response_started()); 726868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RestartWithJob( 727868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) URLRequestJobManager::GetInstance()->CreateJob(this, network_delegate_)); 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::RestartWithJob(URLRequestJob *job) { 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(job->request() == this); 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrepareToRestart(); 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartJob(job); 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::Cancel() { 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoCancel(ERR_ABORTED, SSLInfo()); 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::CancelWithError(int error) { 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoCancel(error, SSLInfo()); 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::CancelWithSSLError(int error, const SSLInfo& ssl_info) { 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This should only be called on a started request. 746868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!is_pending_ || !job_.get() || job_->has_response_started()) { 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoCancel(error, ssl_info); 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::DoCancel(int error, const SSLInfo& ssl_info) { 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(error < 0); 7551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // If cancelled while calling a delegate, clear delegate info. 7561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (calling_delegate_) { 757a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LogUnblocked(); 7581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnCallToDelegateComplete(); 7591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the URL request already has an error status, then canceling is a no-op. 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Plus, we don't want to change the error status once it has been set. 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (status_.is_success()) { 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status_.set_status(URLRequestStatus::CANCELED); 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status_.set_error(error); 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response_info_.ssl_info = ssl_info; 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the request hasn't already been completed, log a cancellation event. 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!has_notified_completion_) { 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't log an error code on ERR_ABORTED, since that's redundant. 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net_log_.AddEventWithNetErrorCode(NetLog::TYPE_CANCELLED, 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error == ERR_ABORTED ? OK : error); 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 776868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (is_pending_ && job_.get()) 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) job_->Kill(); 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We need to notify about the end of this job here synchronously. The 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Job sends an asynchronous notification but by the time this is processed, 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // our |context_| is NULL. 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyRequestCompleted(); 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The Job will call our NotifyDone method asynchronously. This is done so 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that the Delegate implementation can call Cancel without having to worry 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // about being called recursively. 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool URLRequest::Read(IOBuffer* dest, int dest_size, int* bytes_read) { 790868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(job_.get()); 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(bytes_read); 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *bytes_read = 0; 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // If this is the first read, end the delegate call that may have started in 7951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // OnResponseStarted. 7961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnCallToDelegateComplete(); 7971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This handles a cancel that happens while paused. 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(ahendrickson): DCHECK() that it is not done after 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://crbug.com/115705 is fixed. 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (job_->is_done()) 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dest_size == 0) { 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Caller is not too bright. I guess we've done what they asked. 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Once the request fails or is cancelled, read will just return 0 bytes 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to indicate end of stream. 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!status_.is_success()) { 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool rv = job_->Read(dest, dest_size, bytes_read); 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If rv is false, the status cannot be success. 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(rv || status_.status() != URLRequestStatus::SUCCESS); 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rv && *bytes_read <= 0 && status_.is_success()) 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyRequestCompleted(); 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rv; 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::StopCaching() { 824868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(job_.get()); 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) job_->StopCaching(); 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::NotifyReceivedRedirect(const GURL& location, 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* defer_redirect) { 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_redirecting_ = true; 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestJob* job = 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestJobManager::GetInstance()->MaybeInterceptRedirect( 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, network_delegate_, location); 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (job) { 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RestartWithJob(job); 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (delegate_) { 8381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnCallToDelegate(); 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->OnReceivedRedirect(this, location, defer_redirect); 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |this| may be have been destroyed here. 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void URLRequest::NotifyBeforeNetworkStart(bool* defer) { 8455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (delegate_ && !notified_before_network_start_) { 8465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnCallToDelegate(); 8475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_->OnBeforeNetworkStart(this, defer); 8485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!*defer) 8495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnCallToDelegateComplete(); 8505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) notified_before_network_start_ = true; 8515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void URLRequest::ResumeNetworkStart() { 8555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(job_); 8565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(notified_before_network_start_); 8575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnCallToDelegateComplete(); 8595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) job_->ResumeNetworkStart(); 8605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::NotifyResponseStarted() { 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int net_error = OK; 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!status_.is_success()) 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net_error = status_.error(); 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net_log_.EndEventWithNetErrorCode(NetLog::TYPE_URL_REQUEST_START_JOB, 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net_error); 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestJob* job = 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestJobManager::GetInstance()->MaybeInterceptResponse( 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, network_delegate_); 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (job) { 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RestartWithJob(job); 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) { 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In some cases (e.g. an event was canceled), we might have sent the 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // completion event and receive a NotifyResponseStarted() later. 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!has_notified_completion_ && status_.is_success()) { 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (network_delegate_) 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate_->NotifyResponseStarted(this); 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify in case the entire URL Request has been finished. 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!has_notified_completion_ && !status_.is_success()) 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyRequestCompleted(); 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnCallToDelegate(); 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->OnResponseStarted(this); 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Nothing may appear below this line as OnResponseStarted may delete 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |this|. 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::FollowDeferredRedirect() { 896868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) CHECK(job_.get()); 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(status_.is_success()); 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) job_->FollowDeferredRedirect(); 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::SetAuth(const AuthCredentials& credentials) { 903868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(job_.get()); 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(job_->NeedsAuth()); 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) job_->SetAuth(credentials); 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::CancelAuth() { 910868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(job_.get()); 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(job_->NeedsAuth()); 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) job_->CancelAuth(); 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::ContinueWithCertificate(X509Certificate* client_cert) { 917868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(job_.get()); 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) job_->ContinueWithCertificate(client_cert); 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::ContinueDespiteLastError() { 923868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(job_.get()); 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) job_->ContinueDespiteLastError(); 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::PrepareToRestart() { 929868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(job_.get()); 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close the current URL_REQUEST_START_JOB, since we will be starting a new 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // one. 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net_log_.EndEvent(NetLog::TYPE_URL_REQUEST_START_JOB); 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OrphanJob(); 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response_info_ = HttpResponseInfo(); 9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) response_info_.request_time = base::Time::Now(); 9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) load_timing_info_ = LoadTimingInfo(); 9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) load_timing_info_.request_start_time = response_info_.request_time; 9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) load_timing_info_.request_start = base::TimeTicks::Now(); 9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status_ = URLRequestStatus(); 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_pending_ = false; 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::OrphanJob() { 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When calling this function, please check that URLRequestHttpJob is 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // not in between calling NetworkDelegate::NotifyHeadersReceived receiving 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the call back. This is currently guaranteed by the following strategies: 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - OrphanJob is called on JobRestart, in this case the URLRequestJob cannot 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be receiving any headers at that time. 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - OrphanJob is called in ~URLRequest, in this case 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NetworkDelegate::NotifyURLRequestDestroyed notifies the NetworkDelegate 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that the callback becomes invalid. 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) job_->Kill(); 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) job_->DetachRequest(); // ensures that the job will not call us again 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) job_ = NULL; 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int URLRequest::Redirect(const GURL& location, int http_status_code) { 9631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Matches call in NotifyReceivedRedirect. 9641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnCallToDelegateComplete(); 965a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (net_log_.IsLogging()) { 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net_log_.AddEvent( 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetLog::TYPE_URL_REQUEST_REDIRECTED, 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetLog::StringCallback("location", &location.possibly_invalid_spec())); 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (network_delegate_) 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate_->NotifyBeforeRedirect(this, location); 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (redirect_limit_ <= 0) { 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "disallowing redirect: exceeds limit"; 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ERR_TOO_MANY_REDIRECTS; 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!location.is_valid()) 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ERR_INVALID_URL; 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!job_->IsSafeRedirect(location)) { 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "disallowing redirect: unsafe protocol"; 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ERR_UNSAFE_REDIRECT; 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!final_upload_progress_.position()) 9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final_upload_progress_ = job_->GetUploadProgress(); 9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrepareToRestart(); 9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9919ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch std::string new_method(ComputeMethodForRedirect(method_, http_status_code)); 9929ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch if (new_method != method_) { 9939ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch if (method_ == "POST") { 9949ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch // If being switched from POST, must remove headers that were specific to 9959ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch // the POST and don't have meaning in other methods. For example the 9969ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch // inclusion of a multipart Content-Type header in GET can cause problems 9979ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch // with some servers: 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://code.google.com/p/chromium/issues/detail?id=843 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StripPostSpecificHeaders(&extra_request_headers_); 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10019ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch upload_data_stream_.reset(); 10029ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch method_.swap(new_method); 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Suppress the referrer if we're redirecting out of https. 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (referrer_policy_ == 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE && 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL(referrer_).SchemeIsSecure() && !location.SchemeIsSecure()) { 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) referrer_.clear(); 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_chain_.push_back(location); 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --redirect_limit_; 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Start(); 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const URLRequestContext* URLRequest::context() const { 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return context_; 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int64 URLRequest::GetExpectedContentSize() const { 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 expected_content_size = -1; 1025868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (job_.get()) 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_content_size = job_->expected_content_size(); 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return expected_content_size; 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void URLRequest::SetPriority(RequestPriority priority) { 10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_GE(priority, MINIMUM_PRIORITY); 10338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DCHECK_LE(priority, MAXIMUM_PRIORITY); 1034f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1035f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if ((load_flags_ & LOAD_IGNORE_LIMITS) && (priority != MAXIMUM_PRIORITY)) { 1036f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NOTREACHED(); 1037f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Maintain the invariant that requests with IGNORE_LIMITS set 1038f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // have MAXIMUM_PRIORITY for release mode. 1039f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 1040f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 1041f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (priority_ == priority) 10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) priority_ = priority; 1046868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (job_.get()) { 10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net_log_.AddEvent(NetLog::TYPE_URL_REQUEST_SET_PRIORITY, 10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetLog::IntegerCallback("priority", priority_)); 10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) job_->SetPriority(priority_); 10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool URLRequest::GetHSTSRedirect(GURL* redirect_url) const { 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url = this->url(); 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!url.SchemeIs("http")) 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1057010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TransportSecurityState* state = context()->transport_security_state(); 1058010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (state && 1059010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) state->ShouldUpgradeToSSL( 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url.host(), 1061010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SSLConfigService::IsSNIAvailable(context()->ssl_config_service()))) { 10625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Replacements<char> replacements; 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kNewScheme[] = "https"; 10645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu replacements.SetScheme(kNewScheme, url::Component(0, strlen(kNewScheme))); 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *redirect_url = url.ReplaceComponents(replacements); 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::NotifyAuthRequired(AuthChallengeInfo* auth_info) { 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegate::AuthRequiredResponse rv = 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION; 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) auth_info_ = auth_info; 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (network_delegate_) { 10761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnCallToDelegate(); 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = network_delegate_->NotifyAuthRequired( 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *auth_info, 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&URLRequest::NotifyAuthRequiredComplete, 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this)), 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &auth_credentials_); 10831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (rv == NetworkDelegate::AUTH_REQUIRED_RESPONSE_IO_PENDING) 10841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return; 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) NotifyAuthRequiredComplete(rv); 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::NotifyAuthRequiredComplete( 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegate::AuthRequiredResponse result) { 10921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnCallToDelegateComplete(); 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that there are no callbacks to already canceled requests. 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_NE(URLRequestStatus::CANCELED, status_.status()); 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NotifyAuthRequired may be called multiple times, such as 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when an authentication attempt fails. Clear out the data 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so it can be reset on another round. 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthCredentials credentials = auth_credentials_; 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) auth_credentials_ = AuthCredentials(); 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<AuthChallengeInfo> auth_info; 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) auth_info.swap(auth_info_); 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (result) { 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION: 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Defer to the URLRequest::Delegate, since the NetworkDelegate 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // didn't take an action. 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->OnAuthRequired(this, auth_info.get()); 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NetworkDelegate::AUTH_REQUIRED_RESPONSE_SET_AUTH: 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetAuth(credentials); 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NetworkDelegate::AUTH_REQUIRED_RESPONSE_CANCEL_AUTH: 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CancelAuth(); 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NetworkDelegate::AUTH_REQUIRED_RESPONSE_IO_PENDING: 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::NotifyCertificateRequested( 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLCertRequestInfo* cert_request_info) { 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->OnCertificateRequested(this, cert_request_info); 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::NotifySSLCertificateError(const SSLInfo& ssl_info, 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool fatal) { 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->OnSSLCertificateError(this, ssl_info, fatal); 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool URLRequest::CanGetCookies(const CookieList& cookie_list) const { 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!(load_flags_ & LOAD_DO_NOT_SEND_COOKIES)); 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (network_delegate_) { 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return network_delegate_->CanGetCookies(*this, cookie_list); 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return g_default_can_use_cookies; 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool URLRequest::CanSetCookie(const std::string& cookie_line, 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CookieOptions* options) const { 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!(load_flags_ & LOAD_DO_NOT_SAVE_COOKIES)); 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (network_delegate_) { 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return network_delegate_->CanSetCookie(*this, cookie_line, options); 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return g_default_can_use_cookies; 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool URLRequest::CanEnablePrivacyMode() const { 115790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (network_delegate_) { 115890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return network_delegate_->CanEnablePrivacyMode(url(), 115990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) first_party_for_cookies_); 116090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 116190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return !g_default_can_use_cookies; 116290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 116390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::NotifyReadCompleted(int bytes_read) { 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify in case the entire URL Request has been finished. 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (bytes_read <= 0) 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyRequestCompleted(); 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify NetworkChangeNotifier that we just received network data. 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is to identify cases where the NetworkChangeNotifier thinks we 11722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // are off-line but we are still receiving network data (crbug.com/124069), 11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // and to get rough network connection measurements. 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (bytes_read > 0 && !was_cached()) 11752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkChangeNotifier::NotifyDataReceived(*this, bytes_read); 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->OnReadCompleted(this, bytes_read); 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Nothing below this line as OnReadCompleted may delete |this|. 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void URLRequest::OnHeadersComplete() { 11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Cache load timing information now, as information will be lost once the 11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // socket is closed and the ClientSocketHandle is Reset, which will happen 11862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // once the body is complete. The start times should already be populated. 1187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (job_.get()) { 118890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Keep a copy of the two times the URLRequest sets. 118990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::TimeTicks request_start = load_timing_info_.request_start; 119090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Time request_start_time = load_timing_info_.request_start_time; 119190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 119290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Clear load times. Shouldn't be neded, but gives the GetLoadTimingInfo a 119390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // consistent place to start from. 119490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) load_timing_info_ = LoadTimingInfo(); 11952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) job_->GetLoadTimingInfo(&load_timing_info_); 119690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 119790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) load_timing_info_.request_start = request_start; 119890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) load_timing_info_.request_start_time = request_start_time; 119990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ConvertRealLoadTimesToBlockingTimes(&load_timing_info_); 1201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::NotifyRequestCompleted() { 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(battre): Get rid of this check, according to willchan it should 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // not be needed. 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (has_notified_completion_) 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_pending_ = false; 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_redirecting_ = false; 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_notified_completion_ = true; 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (network_delegate_) 1214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) network_delegate_->NotifyCompleted(this, job_.get() != NULL); 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void URLRequest::OnCallToDelegate() { 12181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DCHECK(!calling_delegate_); 1219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(blocked_by_.empty()); 12201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) calling_delegate_ = true; 12211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) net_log_.BeginEvent(NetLog::TYPE_URL_REQUEST_DELEGATE); 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void URLRequest::OnCallToDelegateComplete() { 1225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // This should have been cleared before resuming the request. 1226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(blocked_by_.empty()); 12271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (!calling_delegate_) 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 12291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) calling_delegate_ = false; 12301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) net_log_.EndEvent(NetLog::TYPE_URL_REQUEST_DELEGATE); 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequest::set_stack_trace(const base::debug::StackTrace& stack_trace) { 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::debug::StackTrace* stack_trace_copy = 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new base::debug::StackTrace(NULL, 0); 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *stack_trace_copy = stack_trace; 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stack_trace_.reset(stack_trace_copy); 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const base::debug::StackTrace* URLRequest::stack_trace() const { 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return stack_trace_.get(); 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 1245