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