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)#ifndef NET_URL_REQUEST_URL_FETCHER_CORE_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_URL_REQUEST_URL_FETCHER_CORE_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/debug/stack_trace.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/lazy_instance.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/host_port_pair.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_request_headers.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_fetcher.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_status.h" 247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SingleThreadTaskRunner; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class DrainableIOBuffer; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpResponseHeaders; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IOBuffer; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLFetcherDelegate; 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class URLFetcherFileWriter; 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class URLFetcherResponseWriter; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRequestContextGetter; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRequestThrottlerEntryInterface; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLFetcherCore 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public base::RefCountedThreadSafe<URLFetcherCore>, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public URLRequest::Delegate { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLFetcherCore(URLFetcher* fetcher, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& original_url, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLFetcher::RequestType request_type, 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLFetcherDelegate* d); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Starts the load. It's important that this not happen in the constructor 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // because it causes the IO thread to begin AddRef()ing and Release()ing 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // us. If our caller hasn't had time to fully construct us and take a 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reference, the IO thread could interrupt things, run a task, Release() 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // us, and destroy us, leaving the caller with an already-destroyed object 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when construction finishes. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Start(); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stops any in-progress load and ensures no callback will happen. It is 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // safe to call this multiple times. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Stop(); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // URLFetcher-like functions. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For POST requests, set |content_type| to the MIME type of the 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // content and set |content| to the data to upload. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetUploadData(const std::string& upload_content_type, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& upload_content); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetUploadFilePath(const std::string& upload_content_type, 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& file_path, 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) uint64 range_offset, 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) uint64 range_length, 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<base::TaskRunner> file_task_runner); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetChunkedUpload(const std::string& upload_content_type); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds a block of data to be uploaded in a POST body. This can only be 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // called after Start(). 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AppendChunkToUpload(const std::string& data, bool is_last_chunk); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |flags| are flags to apply to the load operation--these should be 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // one or more of the LOAD_* flags defined in net/base/load_flags.h. 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetLoadFlags(int load_flags); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetLoadFlags() const; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetReferrer(const std::string& referrer); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetExtraRequestHeaders(const std::string& extra_request_headers); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddExtraRequestHeader(const std::string& header_line); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GetExtraRequestHeaders(HttpRequestHeaders* headers) const; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetRequestContext(URLRequestContextGetter* request_context_getter); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the URL that should be consulted for the third-party cookie 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // blocking policy. 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetFirstPartyForCookies(const GURL& first_party_for_cookies); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the key and data callback that is used when setting the user 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // data on any URLRequest objects this object creates. 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetURLRequestUserData( 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void* key, 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const URLFetcher::CreateDataCallback& create_data_callback); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetStopOnRedirect(bool stop_on_redirect); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetAutomaticallyRetryOn5xx(bool retry); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetMaxRetriesOn5xx(int max_retries); 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int GetMaxRetriesOn5xx() const; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta GetBackoffDelay() const; 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetAutomaticallyRetryOnNetworkChanges(int max_retries); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SaveResponseToFileAtPath( 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& file_path, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::TaskRunner> file_task_runner); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SaveResponseToTemporaryFile( 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::TaskRunner> file_task_runner); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpResponseHeaders* GetResponseHeaders() const; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostPortPair GetSocketAddress() const; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool WasFetchedViaProxy() const; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& GetOriginalURL() const; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& GetURL() const; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const URLRequestStatus& GetStatus() const; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetResponseCode() const; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ResponseCookies& GetCookies() const; 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool FileErrorOccurred(int* out_error_code) const; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reports that the received content was malformed (i.e. failed parsing 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // or validation). This makes the throttling logic that does exponential 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // back-off when servers are having problems treat the current request as 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a failure. Your call to this method will be ignored if your request is 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // already considered a failure based on the HTTP response code or response 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // headers. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReceivedContentWasMalformed(); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool GetResponseAsString(std::string* out_response_string) const; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool GetResponseAsFilePath(bool take_ownership, 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath* out_response_path); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from URLRequest::Delegate: 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnReceivedRedirect(URLRequest* request, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& new_url, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* defer_redirect) OVERRIDE; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnResponseStarted(URLRequest* request) OVERRIDE; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnReadCompleted(URLRequest* request, 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bytes_read) OVERRIDE; 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnCertificateRequested( 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequest* request, 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SSLCertRequestInfo* cert_request_info) OVERRIDE; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLFetcherDelegate* delegate() const { return delegate_; } 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void CancelAll(); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int GetNumFetcherCores(); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void SetEnableInterceptionForTests(bool enabled); 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static void SetIgnoreCertificateRequests(bool ignored); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCountedThreadSafe<URLFetcherCore>; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // How should the response be stored? 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum ResponseDestinationType { 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STRING, // Default: In a std::string 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PERMANENT_FILE, // Write to a permanent file. 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TEMP_FILE, // Write to a temporary file. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class Registry { 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Registry(); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~Registry(); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddURLFetcherCore(URLFetcherCore* core); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemoveURLFetcherCore(URLFetcherCore* core); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CancelAll(); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int size() const { 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return fetchers_.size(); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<URLFetcherCore*> fetchers_; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Registry); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~URLFetcherCore(); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wrapper functions that allow us to ensure actions happen on the right 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // thread. 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartOnIOThread(); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartURLRequest(); 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void DidInitializeWriter(int result); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartURLRequestWhenAppropriate(); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CancelURLRequest(); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnCompletedURLRequest(base::TimeDelta backoff_delay); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void InformDelegateFetchIsComplete(); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NotifyMalformedContent(); 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void DidFinishWriting(int result); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RetryOrCompleteUrlFetch(); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Deletes the request, removes it from the registry, and removes the 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // destruction observer. 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReleaseRequest(); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the max value of exponential back-off release time for 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |original_url_| and |url_|. 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks GetBackoffReleaseTime(); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CompleteAddingUploadDataChunk(const std::string& data, 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_last_chunk); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Writes all bytes stored in |data| with |response_writer_|. 19890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Returns OK if all bytes in |data| get written synchronously. Otherwise, 19990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // returns ERR_IO_PENDING or a network error code. 20090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int WriteBuffer(scoped_refptr<DrainableIOBuffer> data); 20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 20290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Used to implement WriteBuffer(). 20390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void DidWriteBuffer(scoped_refptr<DrainableIOBuffer> data, int result); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Read response bytes from the request. 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReadResponse(); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify Delegate about the progress of upload/download. 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void InformDelegateUploadProgress(); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void InformDelegateUploadProgressInDelegateThread(int64 current, int64 total); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void InformDelegateDownloadProgress(); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void InformDelegateDownloadProgressInDelegateThread(int64 current, 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 total); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void InformDelegateDownloadDataIfNecessary(int bytes_read); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void InformDelegateDownloadDataInDelegateThread( 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<std::string> download_data); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLFetcher* fetcher_; // Corresponding fetcher object 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL original_url_; // The URL we were asked to fetch 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url_; // The URL we eventually wound up at 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLFetcher::RequestType request_type_; // What type of request is this? 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestStatus status_; // Status of the request 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLFetcherDelegate* delegate_; // Object to notify on completion 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> delegate_task_runner_; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Task runner for the creating thread. 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> network_task_runner_; 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Task runner for download file access. 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::TaskRunner> file_task_runner_; 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Task runner for upload file access. 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<base::TaskRunner> upload_file_task_runner_; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<URLRequest> request_; // The actual request this wraps 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int load_flags_; // Flags for the load operation 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int response_code_; // HTTP status code for the request 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string data_; // Results of the request, when we are 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // storing the response as a string. 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<IOBuffer> buffer_; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Read buffer 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<URLRequestContextGetter> request_context_getter_; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cookie/cache info for the request 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL first_party_for_cookies_; // The first party URL for the request 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The user data to add to each newly-created URLRequest. 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void* url_request_data_key_; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLFetcher::CreateDataCallback url_request_create_data_callback_; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResponseCookies cookies_; // Response cookies 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders extra_request_headers_; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<HttpResponseHeaders> response_headers_; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool was_fetched_via_proxy_; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostPortPair socket_address_; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool upload_content_set_; // SetUploadData has been called 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string upload_content_; // HTTP POST payload 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath upload_file_path_; // Path to file containing POST payload 253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) uint64 upload_range_offset_; // Offset from the beginning of the file 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // to be uploaded. 255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) uint64 upload_range_length_; // The length of the part of file to be 256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // uploaded. 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string upload_content_type_; // MIME type of POST payload 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string referrer_; // HTTP Referer header value 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_chunked_upload_; // True if using chunked transfer encoding 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used to determine how long to wait before making a request or doing a 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // retry. 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Both of them can only be accessed on the IO thread. 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We need not only the throttler entry for |original_URL|, but also 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the one for |url|. For example, consider the case that URL A 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // redirects to URL B, for which the server returns a 500 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // response. In this case, the exponential back-off release time of 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // URL A won't increase. If we retry without considering the 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // back-off constraint of URL B, we may send out too many requests 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for URL A in a short period of time. 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Both of these will be NULL if 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // URLRequestContext::throttler_manager() is NULL. 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<URLRequestThrottlerEntryInterface> 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_url_throttler_entry_; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<URLRequestThrottlerEntryInterface> url_throttler_entry_; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if the URLFetcher has been cancelled. 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool was_cancelled_; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Writer object to write response to the destination like file and string. 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<URLFetcherResponseWriter> response_writer_; 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If writing results to a file, |file_writer_| will manage creation, 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // writing, and destruction of that file. 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |file_writer_| points to the same object as |response_writer_| when writing 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // response to a file, otherwise, |file_writer_| is NULL. 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLFetcherFileWriter* file_writer_; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Where should responses be saved? 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResponseDestinationType response_destination_; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Path to the file where the response is written. 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath response_destination_file_path_; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // By default any server-initiated redirects are automatically followed. If 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this flag is set to true, however, a redirect will halt the fetch and call 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // back to to the delegate immediately. 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool stop_on_redirect_; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True when we're actually stopped due to a redirect halted by the above. We 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // use this to ensure that |url_| is set to the redirect destination rather 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // than the originally-fetched URL. 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool stopped_on_redirect_; 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If |automatically_retry_on_5xx_| is false, 5xx responses will be 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // propagated to the observer, if it is true URLFetcher will automatically 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // re-execute the request, after the back-off delay has expired. 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // true by default. 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool automatically_retry_on_5xx_; 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |num_retries_on_5xx_| indicates how many times we've failed to successfully 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // fetch this URL due to 5xx responses. Once this value exceeds the maximum 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // number of retries specified by the owner URLFetcher instance, 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // we'll give up. 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int num_retries_on_5xx_; 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Maximum retries allowed when 5xx responses are received. 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int max_retries_on_5xx_; 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Back-off time delay. 0 by default. 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta backoff_delay_; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The number of retries that have been attempted due to ERR_NETWORK_CHANGED. 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int num_retries_on_network_changes_; 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Maximum retries allowed when the request fails with ERR_NETWORK_CHANGED. 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 0 by default. 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int max_retries_on_network_changes_; 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Timer to poll the progress of uploading for POST and PUT requests. 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When crbug.com/119629 is fixed, scoped_ptr is not necessary here. 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::RepeatingTimer<URLFetcherCore> > 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_progress_checker_timer_; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Number of bytes sent so far. 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 current_upload_bytes_; 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Number of bytes received so far. 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 current_response_bytes_; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Total expected bytes to receive (-1 if it cannot be determined). 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 total_response_bytes_; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(willchan): Get rid of this after debugging crbug.com/90971. 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::debug::StackTrace stack_trace_; 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static base::LazyInstance<Registry> g_registry; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(URLFetcherCore); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // NET_URL_REQUEST_URL_FETCHER_CORE_H_ 350