Home | History | Annotate | Download | only in url_request
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef NET_URL_REQUEST_URL_REQUEST_HTTP_JOB_H_
      6 #define NET_URL_REQUEST_URL_REQUEST_HTTP_JOB_H_
      7 
      8 #include <string>
      9 #include <vector>
     10 
     11 #include "base/compiler_specific.h"
     12 #include "base/memory/scoped_ptr.h"
     13 #include "base/memory/weak_ptr.h"
     14 #include "base/time/time.h"
     15 #include "net/base/auth.h"
     16 #include "net/base/completion_callback.h"
     17 #include "net/base/net_export.h"
     18 #include "net/cookies/cookie_store.h"
     19 #include "net/filter/filter.h"
     20 #include "net/http/http_request_info.h"
     21 #include "net/url_request/url_request_job.h"
     22 #include "net/url_request/url_request_throttler_entry_interface.h"
     23 
     24 namespace net {
     25 
     26 class HttpResponseHeaders;
     27 class HttpResponseInfo;
     28 class HttpTransaction;
     29 class HttpUserAgentSettings;
     30 class UploadDataStream;
     31 class URLRequestContext;
     32 
     33 // A URLRequestJob subclass that is built on top of HttpTransaction.  It
     34 // provides an implementation for both HTTP and HTTPS.
     35 class NET_EXPORT_PRIVATE URLRequestHttpJob : public URLRequestJob {
     36  public:
     37   static URLRequestJob* Factory(URLRequest* request,
     38                                 NetworkDelegate* network_delegate,
     39                                 const std::string& scheme);
     40 
     41  protected:
     42   URLRequestHttpJob(URLRequest* request,
     43                     NetworkDelegate* network_delegate,
     44                     const HttpUserAgentSettings* http_user_agent_settings);
     45 
     46   virtual ~URLRequestHttpJob();
     47 
     48   // Overridden from URLRequestJob:
     49   virtual void SetPriority(RequestPriority priority) OVERRIDE;
     50   virtual void Start() OVERRIDE;
     51   virtual void Kill() OVERRIDE;
     52 
     53   RequestPriority priority() const {
     54     return priority_;
     55   }
     56 
     57  private:
     58   enum CompletionCause {
     59     ABORTED,
     60     FINISHED
     61   };
     62 
     63   typedef base::RefCountedData<bool> SharedBoolean;
     64 
     65   class HttpFilterContext;
     66   class HttpTransactionDelegateImpl;
     67 
     68   // Shadows URLRequestJob's version of this method so we can grab cookies.
     69   void NotifyHeadersComplete();
     70 
     71   // Shadows URLRequestJob's method so we can record histograms.
     72   void NotifyDone(const URLRequestStatus& status);
     73 
     74   void DestroyTransaction();
     75 
     76   void AddExtraHeaders();
     77   void AddCookieHeaderAndStart();
     78   void SaveCookiesAndNotifyHeadersComplete(int result);
     79   void SaveNextCookie();
     80   void FetchResponseCookies(std::vector<std::string>* cookies);
     81 
     82   // Processes the Strict-Transport-Security header, if one exists.
     83   void ProcessStrictTransportSecurityHeader();
     84 
     85   // Processes the Public-Key-Pins header, if one exists.
     86   void ProcessPublicKeyPinsHeader();
     87 
     88   // |result| should be net::OK, or the request is canceled.
     89   void OnHeadersReceivedCallback(int result);
     90   void OnStartCompleted(int result);
     91   void OnReadCompleted(int result);
     92   void NotifyBeforeSendHeadersCallback(int result);
     93 
     94   void RestartTransactionWithAuth(const AuthCredentials& credentials);
     95 
     96   // Overridden from URLRequestJob:
     97   virtual void SetUpload(UploadDataStream* upload) OVERRIDE;
     98   virtual void SetExtraRequestHeaders(
     99       const HttpRequestHeaders& headers) OVERRIDE;
    100   virtual LoadState GetLoadState() const OVERRIDE;
    101   virtual UploadProgress GetUploadProgress() const OVERRIDE;
    102   virtual bool GetMimeType(std::string* mime_type) const OVERRIDE;
    103   virtual bool GetCharset(std::string* charset) OVERRIDE;
    104   virtual void GetResponseInfo(HttpResponseInfo* info) OVERRIDE;
    105   virtual void GetLoadTimingInfo(
    106       LoadTimingInfo* load_timing_info) const OVERRIDE;
    107   virtual bool GetResponseCookies(std::vector<std::string>* cookies) OVERRIDE;
    108   virtual int GetResponseCode() const OVERRIDE;
    109   virtual Filter* SetupFilter() const OVERRIDE;
    110   virtual bool CopyFragmentOnRedirect(const GURL& location) const OVERRIDE;
    111   virtual bool IsSafeRedirect(const GURL& location) OVERRIDE;
    112   virtual bool NeedsAuth() OVERRIDE;
    113   virtual void GetAuthChallengeInfo(scoped_refptr<AuthChallengeInfo>*) OVERRIDE;
    114   virtual void SetAuth(const AuthCredentials& credentials) OVERRIDE;
    115   virtual void CancelAuth() OVERRIDE;
    116   virtual void ContinueWithCertificate(X509Certificate* client_cert) OVERRIDE;
    117   virtual void ContinueDespiteLastError() OVERRIDE;
    118   virtual void ResumeNetworkStart() OVERRIDE;
    119   virtual bool ReadRawData(IOBuffer* buf, int buf_size,
    120                            int* bytes_read) OVERRIDE;
    121   virtual void StopCaching() OVERRIDE;
    122   virtual bool GetFullRequestHeaders(
    123       HttpRequestHeaders* headers) const OVERRIDE;
    124   virtual int64 GetTotalReceivedBytes() const OVERRIDE;
    125   virtual void DoneReading() OVERRIDE;
    126   virtual void DoneReadingRedirectResponse() OVERRIDE;
    127 
    128   virtual HostPortPair GetSocketAddress() const OVERRIDE;
    129   virtual void NotifyURLRequestDestroyed() OVERRIDE;
    130 
    131   void RecordTimer();
    132   void ResetTimer();
    133 
    134   virtual void UpdatePacketReadTimes() OVERRIDE;
    135   void RecordPacketStats(FilterContext::StatisticSelector statistic) const;
    136 
    137   void RecordCompressionHistograms();
    138   bool IsCompressibleContent() const;
    139 
    140   // Starts the transaction if extensions using the webrequest API do not
    141   // object.
    142   void StartTransaction();
    143   // If |result| is net::OK, calls StartTransactionInternal. Otherwise notifies
    144   // cancellation.
    145   void MaybeStartTransactionInternal(int result);
    146   void StartTransactionInternal();
    147 
    148   void RecordPerfHistograms(CompletionCause reason);
    149   void DoneWithRequest(CompletionCause reason);
    150 
    151   // Callback functions for Cookie Monster
    152   void DoLoadCookies();
    153   void CheckCookiePolicyAndLoad(const CookieList& cookie_list);
    154   void OnCookiesLoaded(const std::string& cookie_line);
    155   void DoStartTransaction();
    156 
    157   // See the implementation for a description of save_next_cookie_running and
    158   // callback_pending.
    159   void OnCookieSaved(scoped_refptr<SharedBoolean> save_next_cookie_running,
    160                      scoped_refptr<SharedBoolean> callback_pending,
    161                      bool cookie_status);
    162 
    163   // Some servers send the body compressed, but specify the content length as
    164   // the uncompressed size. If this is the case, we return true in order
    165   // to request to work around this non-adherence to the HTTP standard.
    166   // |rv| is the standard return value of a read function indicating the number
    167   // of bytes read or, if negative, an error code.
    168   bool ShouldFixMismatchedContentLength(int rv) const;
    169 
    170   // Returns the effective response headers, considering that they may be
    171   // overridden by |override_response_headers_|.
    172   HttpResponseHeaders* GetResponseHeaders() const;
    173 
    174   RequestPriority priority_;
    175 
    176   HttpRequestInfo request_info_;
    177   const HttpResponseInfo* response_info_;
    178 
    179   std::vector<std::string> response_cookies_;
    180   size_t response_cookies_save_index_;
    181   base::Time response_date_;
    182 
    183   // Auth states for proxy and origin server.
    184   AuthState proxy_auth_state_;
    185   AuthState server_auth_state_;
    186   AuthCredentials auth_credentials_;
    187 
    188   CompletionCallback start_callback_;
    189   CompletionCallback notify_before_headers_sent_callback_;
    190 
    191   bool read_in_progress_;
    192 
    193   scoped_ptr<HttpTransaction> transaction_;
    194 
    195   // This is used to supervise traffic and enforce exponential
    196   // back-off.  May be NULL.
    197   scoped_refptr<URLRequestThrottlerEntryInterface> throttling_entry_;
    198 
    199   // Indicated if an SDCH dictionary was advertised, and hence an SDCH
    200   // compressed response is expected.  We use this to help detect (accidental?)
    201   // proxy corruption of a response, which sometimes marks SDCH content as
    202   // having no content encoding <oops>.
    203   bool sdch_dictionary_advertised_;
    204 
    205   // For SDCH latency experiments, when we are able to do SDCH, we may enable
    206   // either an SDCH latency test xor a pass through test.  The following bools
    207   // indicate what we decided on for this instance.
    208   bool sdch_test_activated_;  // Advertising a dictionary for sdch.
    209   bool sdch_test_control_;    // Not even accepting-content sdch.
    210 
    211   // For recording of stats, we need to remember if this is cached content.
    212   bool is_cached_content_;
    213 
    214   base::Time request_creation_time_;
    215 
    216   // Data used for statistics gathering. This data is only used for histograms
    217   // and is not required. It is only gathered if packet_timing_enabled_ == true.
    218   //
    219   // TODO(jar): improve the quality of the gathered info by gathering most times
    220   // at a lower point in the network stack, assuring we have actual packet
    221   // boundaries, rather than approximations.  Also note that input byte count
    222   // as gathered here is post-SSL, and post-cache-fetch, and does not reflect
    223   // true packet arrival times in such cases.
    224 
    225   // Enable recording of packet arrival times for histogramming.
    226   bool packet_timing_enabled_;
    227   bool done_;  // True when we are done doing work.
    228 
    229   // The number of bytes that have been accounted for in packets (where some of
    230   // those packets may possibly have had their time of arrival recorded).
    231   int64 bytes_observed_in_packets_;
    232 
    233   // The request time may not be available when we are being destroyed, so we
    234   // snapshot it early on.
    235   base::Time request_time_snapshot_;
    236 
    237   // Since we don't save all packet times in packet_times_, we save the
    238   // last time for use in histograms.
    239   base::Time final_packet_time_;
    240 
    241   // The start time for the job, ignoring re-starts.
    242   base::TimeTicks start_time_;
    243 
    244   // When the transaction finished reading the request headers.
    245   base::TimeTicks receive_headers_end_;
    246 
    247   scoped_ptr<HttpFilterContext> filter_context_;
    248 
    249   CompletionCallback on_headers_received_callback_;
    250 
    251   // We allow the network delegate to modify a copy of the response headers.
    252   // This prevents modifications of headers that are shared with the underlying
    253   // layers of the network stack.
    254   scoped_refptr<HttpResponseHeaders> override_response_headers_;
    255 
    256   // The network delegate can mark a URL as safe for redirection.
    257   // The reference fragment of the original URL is not appended to the redirect
    258   // URL when the redirect URL is equal to |allowed_unsafe_redirect_url_|.
    259   GURL allowed_unsafe_redirect_url_;
    260 
    261   // Flag used to verify that |this| is not deleted while we are awaiting
    262   // a callback from the NetworkDelegate. Used as a fail-fast mechanism.
    263   // True if we are waiting a callback and
    264   // NetworkDelegate::NotifyURLRequestDestroyed has not been called, yet,
    265   // to inform the NetworkDelegate that it may not call back.
    266   bool awaiting_callback_;
    267 
    268   const HttpUserAgentSettings* http_user_agent_settings_;
    269 
    270   base::WeakPtrFactory<URLRequestHttpJob> weak_factory_;
    271 
    272   DISALLOW_COPY_AND_ASSIGN(URLRequestHttpJob);
    273 };
    274 
    275 }  // namespace net
    276 
    277 #endif  // NET_URL_REQUEST_URL_REQUEST_HTTP_JOB_H_
    278