13f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef NET_URL_REQUEST_URL_REQUEST_HTTP_JOB_H_
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define NET_URL_REQUEST_URL_REQUEST_HTTP_JOB_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <string>
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <vector>
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string16.h"
1421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/task.h"
15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/time.h"
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/auth.h"
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/completion_callback.h"
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/http/http_request_info.h"
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/url_request/url_request_job.h"
20201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "net/url_request/url_request_throttler_entry_interface.h"
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace net {
2321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass HttpResponseInfo;
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass HttpTransaction;
263f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsenclass URLRequestContext;
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// A URLRequestJob subclass that is built on top of HttpTransaction.  It
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// provides an implementation for both HTTP and HTTPS.
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass URLRequestHttpJob : public URLRequestJob {
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public:
3221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  static URLRequestJob* Factory(URLRequest* request,
33201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                const std::string& scheme);
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott protected:
3621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  explicit URLRequestHttpJob(URLRequest* request);
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Shadows URLRequestJob's version of this method so we can grab cookies.
3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void NotifyHeadersComplete();
4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Shadows URLRequestJob's method so we can record histograms.
42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void NotifyDone(const URLRequestStatus& status);
43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void DestroyTransaction();
4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void StartTransaction();
4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void AddExtraHeaders();
4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void AddCookieHeaderAndStart();
4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void SaveCookiesAndNotifyHeadersComplete();
4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void SaveNextCookie();
5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void FetchResponseCookies(const HttpResponseInfo* response_info,
5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                            std::vector<std::string>* cookies);
5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Process the Strict-Transport-Security header, if one exists.
5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void ProcessStrictTransportSecurityHeader();
5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void OnCanGetCookiesCompleted(int result);
5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void OnCanSetCookieCompleted(int result);
5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void OnStartCompleted(int result);
5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void OnReadCompleted(int result);
6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool ShouldTreatAsCertificateError(int result);
6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void RestartTransactionWithAuth(const string16& username,
6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                  const string16& password);
6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
6621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Overridden from URLRequestJob:
6721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual void SetUpload(UploadData* upload);
6821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual void SetExtraRequestHeaders(const HttpRequestHeaders& headers);
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual void Start();
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual void Kill();
7121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual LoadState GetLoadState() const;
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual uint64 GetUploadProgress() const;
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual bool GetMimeType(std::string* mime_type) const;
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual bool GetCharset(std::string* charset);
7521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual void GetResponseInfo(HttpResponseInfo* info);
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual bool GetResponseCookies(std::vector<std::string>* cookies);
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual int GetResponseCode() const;
78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual Filter* SetupFilter() const;
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual bool IsSafeRedirect(const GURL& location);
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual bool NeedsAuth();
8121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual void GetAuthChallengeInfo(scoped_refptr<AuthChallengeInfo>*);
823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void SetAuth(const string16& username,
833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                       const string16& password);
84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual void CancelAuth();
8521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual void ContinueWithCertificate(X509Certificate* client_cert);
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual void ContinueDespiteLastError();
8721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual bool ReadRawData(IOBuffer* buf, int buf_size, int *bytes_read);
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void StopCaching();
89dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual HostPortPair GetSocketAddress() const;
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Keep a reference to the url request context to be sure it's not deleted
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // before us.
93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  scoped_refptr<URLRequestContext> context_;
94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
9521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  HttpRequestInfo request_info_;
9621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  const HttpResponseInfo* response_info_;
97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::vector<std::string> response_cookies_;
99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  size_t response_cookies_save_index_;
100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Auth states for proxy and origin server.
10221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  AuthState proxy_auth_state_;
10321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  AuthState server_auth_state_;
104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  string16 username_;
1063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  string16 password_;
107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
10821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  CompletionCallbackImpl<URLRequestHttpJob> start_callback_;
10921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  CompletionCallbackImpl<URLRequestHttpJob> read_callback_;
110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool read_in_progress_;
112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // An URL for an SDCH dictionary as suggested in a Get-Dictionary HTTP header.
114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  GURL sdch_dictionary_url_;
115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
11621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  scoped_ptr<HttpTransaction> transaction_;
117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
118201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // This is used to supervise traffic and enforce exponential back-off.
11921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  scoped_refptr<URLRequestThrottlerEntryInterface> throttling_entry_;
120201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Indicated if an SDCH dictionary was advertised, and hence an SDCH
122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // compressed response is expected.  We use this to help detect (accidental?)
123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // proxy corruption of a response, which sometimes marks SDCH content as
124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // having no content encoding <oops>.
125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool sdch_dictionary_advertised_;
126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // For SDCH latency experiments, when we are able to do SDCH, we may enable
128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // either an SDCH latency test xor a pass through test.  The following bools
129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // indicate what we decided on for this instance.
130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool sdch_test_activated_;  // Advertising a dictionary for sdch.
131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool sdch_test_control_;    // Not even accepting-content sdch.
132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // For recording of stats, we need to remember if this is cached content.
134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool is_cached_content_;
135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private:
137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  class HttpFilterContext;
138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual ~URLRequestHttpJob();
140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
141dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void RecordTimer();
142dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void ResetTimer();
143dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void UpdatePacketReadTimes();
145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void RecordPacketStats(FilterContext::StatisticSelector statistic) const;
146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void RecordCompressionHistograms();
148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool IsCompressibleContent() const;
149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
150dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  base::Time request_creation_time_;
151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Data used for statistics gathering. This data is only used for histograms
153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // and is not required. It is only gathered if packet_timing_enabled_ == true.
154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  //
155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // TODO(jar): improve the quality of the gathered info by gathering most times
156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // at a lower point in the network stack, assuring we have actual packet
157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // boundaries, rather than approximations.  Also note that input byte count
158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // as gathered here is post-SSL, and post-cache-fetch, and does not reflect
159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // true packet arrival times in such cases.
160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Enable recording of packet arrival times for histogramming.
162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool packet_timing_enabled_;
163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // The number of bytes that have been accounted for in packets (where some of
165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // those packets may possibly have had their time of arrival recorded).
166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  int64 bytes_observed_in_packets_;
167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Arrival times for some of the first few packets.
169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::vector<base::Time> packet_times_;
170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // The request time may not be available when we are being destroyed, so we
172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // snapshot it early on.
173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  base::Time request_time_snapshot_;
174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Since we don't save all packet times in packet_times_, we save the
176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // last time for use in histograms.
177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  base::Time final_packet_time_;
178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // The count of the number of packets, some of which may not have been timed.
180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // We're ignoring overflow, as 1430 x 2^31 is a LOT of bytes.
181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  int observed_packet_count_;
182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
183ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_ptr<HttpFilterContext> filter_context_;
18421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ScopedRunnableMethodFactory<URLRequestHttpJob> method_factory_;
18521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DISALLOW_COPY_AND_ASSIGN(URLRequestHttpJob);
187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
18921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}  // namespace net
19021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif  // NET_URL_REQUEST_URL_REQUEST_HTTP_JOB_H_
192