• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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 #pragma once
8 
9 #include <string>
10 #include <vector>
11 
12 #include "base/memory/scoped_ptr.h"
13 #include "base/string16.h"
14 #include "base/task.h"
15 #include "base/time.h"
16 #include "net/base/auth.h"
17 #include "net/base/completion_callback.h"
18 #include "net/http/http_request_info.h"
19 #include "net/url_request/url_request_job.h"
20 #include "net/url_request/url_request_throttler_entry_interface.h"
21 
22 namespace net {
23 
24 class HttpResponseInfo;
25 class HttpTransaction;
26 class URLRequestContext;
27 
28 // A URLRequestJob subclass that is built on top of HttpTransaction.  It
29 // provides an implementation for both HTTP and HTTPS.
30 class URLRequestHttpJob : public URLRequestJob {
31  public:
32   static URLRequestJob* Factory(URLRequest* request,
33                                 const std::string& scheme);
34 
35  protected:
36   explicit URLRequestHttpJob(URLRequest* request);
37 
38   // Shadows URLRequestJob's version of this method so we can grab cookies.
39   void NotifyHeadersComplete();
40 
41   // Shadows URLRequestJob's method so we can record histograms.
42   void NotifyDone(const URLRequestStatus& status);
43 
44   void DestroyTransaction();
45   void StartTransaction();
46   void AddExtraHeaders();
47   void AddCookieHeaderAndStart();
48   void SaveCookiesAndNotifyHeadersComplete();
49   void SaveNextCookie();
50   void FetchResponseCookies(const HttpResponseInfo* response_info,
51                             std::vector<std::string>* cookies);
52 
53   // Process the Strict-Transport-Security header, if one exists.
54   void ProcessStrictTransportSecurityHeader();
55 
56   void OnCanGetCookiesCompleted(int result);
57   void OnCanSetCookieCompleted(int result);
58   void OnStartCompleted(int result);
59   void OnReadCompleted(int result);
60 
61   bool ShouldTreatAsCertificateError(int result);
62 
63   void RestartTransactionWithAuth(const string16& username,
64                                   const string16& password);
65 
66   // Overridden from URLRequestJob:
67   virtual void SetUpload(UploadData* upload);
68   virtual void SetExtraRequestHeaders(const HttpRequestHeaders& headers);
69   virtual void Start();
70   virtual void Kill();
71   virtual LoadState GetLoadState() const;
72   virtual uint64 GetUploadProgress() const;
73   virtual bool GetMimeType(std::string* mime_type) const;
74   virtual bool GetCharset(std::string* charset);
75   virtual void GetResponseInfo(HttpResponseInfo* info);
76   virtual bool GetResponseCookies(std::vector<std::string>* cookies);
77   virtual int GetResponseCode() const;
78   virtual Filter* SetupFilter() const;
79   virtual bool IsSafeRedirect(const GURL& location);
80   virtual bool NeedsAuth();
81   virtual void GetAuthChallengeInfo(scoped_refptr<AuthChallengeInfo>*);
82   virtual void SetAuth(const string16& username,
83                        const string16& password);
84   virtual void CancelAuth();
85   virtual void ContinueWithCertificate(X509Certificate* client_cert);
86   virtual void ContinueDespiteLastError();
87   virtual bool ReadRawData(IOBuffer* buf, int buf_size, int *bytes_read);
88   virtual void StopCaching();
89   virtual HostPortPair GetSocketAddress() const;
90 
91   // Keep a reference to the url request context to be sure it's not deleted
92   // before us.
93   scoped_refptr<URLRequestContext> context_;
94 
95   HttpRequestInfo request_info_;
96   const HttpResponseInfo* response_info_;
97 
98   std::vector<std::string> response_cookies_;
99   size_t response_cookies_save_index_;
100 
101   // Auth states for proxy and origin server.
102   AuthState proxy_auth_state_;
103   AuthState server_auth_state_;
104 
105   string16 username_;
106   string16 password_;
107 
108   CompletionCallbackImpl<URLRequestHttpJob> start_callback_;
109   CompletionCallbackImpl<URLRequestHttpJob> read_callback_;
110 
111   bool read_in_progress_;
112 
113   // An URL for an SDCH dictionary as suggested in a Get-Dictionary HTTP header.
114   GURL sdch_dictionary_url_;
115 
116   scoped_ptr<HttpTransaction> transaction_;
117 
118   // This is used to supervise traffic and enforce exponential back-off.
119   scoped_refptr<URLRequestThrottlerEntryInterface> throttling_entry_;
120 
121   // Indicated if an SDCH dictionary was advertised, and hence an SDCH
122   // compressed response is expected.  We use this to help detect (accidental?)
123   // proxy corruption of a response, which sometimes marks SDCH content as
124   // having no content encoding <oops>.
125   bool sdch_dictionary_advertised_;
126 
127   // For SDCH latency experiments, when we are able to do SDCH, we may enable
128   // either an SDCH latency test xor a pass through test.  The following bools
129   // indicate what we decided on for this instance.
130   bool sdch_test_activated_;  // Advertising a dictionary for sdch.
131   bool sdch_test_control_;    // Not even accepting-content sdch.
132 
133   // For recording of stats, we need to remember if this is cached content.
134   bool is_cached_content_;
135 
136  private:
137   class HttpFilterContext;
138 
139   virtual ~URLRequestHttpJob();
140 
141   void RecordTimer();
142   void ResetTimer();
143 
144   virtual void UpdatePacketReadTimes();
145   void RecordPacketStats(FilterContext::StatisticSelector statistic) const;
146 
147   void RecordCompressionHistograms();
148   bool IsCompressibleContent() const;
149 
150   base::Time request_creation_time_;
151 
152   // Data used for statistics gathering. This data is only used for histograms
153   // and is not required. It is only gathered if packet_timing_enabled_ == true.
154   //
155   // TODO(jar): improve the quality of the gathered info by gathering most times
156   // at a lower point in the network stack, assuring we have actual packet
157   // boundaries, rather than approximations.  Also note that input byte count
158   // as gathered here is post-SSL, and post-cache-fetch, and does not reflect
159   // true packet arrival times in such cases.
160 
161   // Enable recording of packet arrival times for histogramming.
162   bool packet_timing_enabled_;
163 
164   // The number of bytes that have been accounted for in packets (where some of
165   // those packets may possibly have had their time of arrival recorded).
166   int64 bytes_observed_in_packets_;
167 
168   // Arrival times for some of the first few packets.
169   std::vector<base::Time> packet_times_;
170 
171   // The request time may not be available when we are being destroyed, so we
172   // snapshot it early on.
173   base::Time request_time_snapshot_;
174 
175   // Since we don't save all packet times in packet_times_, we save the
176   // last time for use in histograms.
177   base::Time final_packet_time_;
178 
179   // The count of the number of packets, some of which may not have been timed.
180   // We're ignoring overflow, as 1430 x 2^31 is a LOT of bytes.
181   int observed_packet_count_;
182 
183   scoped_ptr<HttpFilterContext> filter_context_;
184   ScopedRunnableMethodFactory<URLRequestHttpJob> method_factory_;
185 
186   DISALLOW_COPY_AND_ASSIGN(URLRequestHttpJob);
187 };
188 
189 }  // namespace net
190 
191 #endif  // NET_URL_REQUEST_URL_REQUEST_HTTP_JOB_H_
192