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