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_REQUEST_HTTP_JOB_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_URL_REQUEST_URL_REQUEST_HTTP_JOB_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/auth.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/completion_callback.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/net_export.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_store.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_request_info.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_job.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_throttler_entry_interface.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpResponseHeaders; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpResponseInfo; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpTransaction; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpUserAgentSettings; 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class UploadDataStream; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRequestContext; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A URLRequestJob subclass that is built on top of HttpTransaction. It 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// provides an implementation for both HTTP and HTTPS. 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NET_EXPORT_PRIVATE URLRequestHttpJob : public URLRequestJob { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static URLRequestJob* Factory(URLRequest* request, 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegate* network_delegate, 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& scheme); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestHttpJob(URLRequest* request, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegate* network_delegate, 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HttpUserAgentSettings* http_user_agent_settings); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~URLRequestHttpJob(); 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Overridden from URLRequestJob: 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetPriority(RequestPriority priority) OVERRIDE; 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Start() OVERRIDE; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Kill() OVERRIDE; 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RequestPriority priority() const { 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return priority_; 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum CompletionCause { 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ABORTED, 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FINISHED 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef base::RefCountedData<bool> SharedBoolean; 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class HttpFilterContext; 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class HttpTransactionDelegateImpl; 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shadows URLRequestJob's version of this method so we can grab cookies. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NotifyHeadersComplete(); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shadows URLRequestJob's method so we can record histograms. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NotifyDone(const URLRequestStatus& status); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DestroyTransaction(); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddExtraHeaders(); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddCookieHeaderAndStart(); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SaveCookiesAndNotifyHeadersComplete(int result); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SaveNextCookie(); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void FetchResponseCookies(std::vector<std::string>* cookies); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Processes the Strict-Transport-Security header, if one exists. 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ProcessStrictTransportSecurityHeader(); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Processes the Public-Key-Pins header, if one exists. 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ProcessPublicKeyPinsHeader(); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |result| should be net::OK, or the request is canceled. 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnHeadersReceivedCallback(int result); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnStartCompleted(int result); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnReadCompleted(int result); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NotifyBeforeSendHeadersCallback(int result); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RestartTransactionWithAuth(const AuthCredentials& credentials); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from URLRequestJob: 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetUpload(UploadDataStream* upload) OVERRIDE; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetExtraRequestHeaders( 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HttpRequestHeaders& headers) OVERRIDE; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual LoadState GetLoadState() const OVERRIDE; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual UploadProgress GetUploadProgress() const OVERRIDE; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool GetMimeType(std::string* mime_type) const OVERRIDE; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool GetCharset(std::string* charset) OVERRIDE; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void GetResponseInfo(HttpResponseInfo* info) OVERRIDE; 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void GetLoadTimingInfo( 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadTimingInfo* load_timing_info) const OVERRIDE; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool GetResponseCookies(std::vector<std::string>* cookies) OVERRIDE; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int GetResponseCode() const OVERRIDE; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual Filter* SetupFilter() const OVERRIDE; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsSafeRedirect(const GURL& location) OVERRIDE; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool NeedsAuth() OVERRIDE; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void GetAuthChallengeInfo(scoped_refptr<AuthChallengeInfo>*) OVERRIDE; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetAuth(const AuthCredentials& credentials) OVERRIDE; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void CancelAuth() OVERRIDE; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ContinueWithCertificate(X509Certificate* client_cert) OVERRIDE; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ContinueDespiteLastError() OVERRIDE; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool ReadRawData(IOBuffer* buf, int buf_size, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* bytes_read) OVERRIDE; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void StopCaching() OVERRIDE; 119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual bool GetFullRequestHeaders( 120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch HttpRequestHeaders* headers) const OVERRIDE; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DoneReading() OVERRIDE; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual HostPortPair GetSocketAddress() const OVERRIDE; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void NotifyURLRequestDestroyed() OVERRIDE; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RecordTimer(); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ResetTimer(); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void UpdatePacketReadTimes() OVERRIDE; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RecordPacketStats(FilterContext::StatisticSelector statistic) const; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RecordCompressionHistograms(); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsCompressibleContent() const; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Starts the transaction if extensions using the webrequest API do not 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // object. 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartTransaction(); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If |result| is net::OK, calls StartTransactionInternal. Otherwise notifies 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // cancellation. 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void MaybeStartTransactionInternal(int result); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartTransactionInternal(); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RecordPerfHistograms(CompletionCause reason); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DoneWithRequest(CompletionCause reason); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback functions for Cookie Monster 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DoLoadCookies(); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CheckCookiePolicyAndLoad(const CookieList& cookie_list); 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnCookiesLoaded(const std::string& cookie_line); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DoStartTransaction(); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See the implementation for a description of save_next_cookie_running and 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // callback_pending. 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnCookieSaved(scoped_refptr<SharedBoolean> save_next_cookie_running, 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<SharedBoolean> callback_pending, 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool cookie_status); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Some servers send the body compressed, but specify the content length as 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the uncompressed size. If this is the case, we return true in order 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to request to work around this non-adherence to the HTTP standard. 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |rv| is the standard return value of a read function indicating the number 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of bytes read or, if negative, an error code. 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ShouldFixMismatchedContentLength(int rv) const; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the effective response headers, considering that they may be 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // overridden by |override_response_headers_|. 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpResponseHeaders* GetResponseHeaders() const; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Override of the private interface of URLRequestJob. 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnDetachRequest() OVERRIDE; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RequestPriority priority_; 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HttpRequestInfo request_info_; 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const HttpResponseInfo* response_info_; 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<std::string> response_cookies_; 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t response_cookies_save_index_; 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time response_date_; 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Auth states for proxy and origin server. 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AuthState proxy_auth_state_; 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AuthState server_auth_state_; 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AuthCredentials auth_credentials_; 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompletionCallback start_callback_; 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompletionCallback notify_before_headers_sent_callback_; 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool read_in_progress_; 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // An URL for an SDCH dictionary as suggested in a Get-Dictionary HTTP header. 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL sdch_dictionary_url_; 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<HttpTransaction> transaction_; 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This is used to supervise traffic and enforce exponential 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // back-off. May be NULL. 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<URLRequestThrottlerEntryInterface> throttling_entry_; 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Indicated if an SDCH dictionary was advertised, and hence an SDCH 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // compressed response is expected. We use this to help detect (accidental?) 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // proxy corruption of a response, which sometimes marks SDCH content as 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // having no content encoding <oops>. 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool sdch_dictionary_advertised_; 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For SDCH latency experiments, when we are able to do SDCH, we may enable 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // either an SDCH latency test xor a pass through test. The following bools 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // indicate what we decided on for this instance. 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool sdch_test_activated_; // Advertising a dictionary for sdch. 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool sdch_test_control_; // Not even accepting-content sdch. 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For recording of stats, we need to remember if this is cached content. 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_cached_content_; 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time request_creation_time_; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Data used for statistics gathering. This data is only used for histograms 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and is not required. It is only gathered if packet_timing_enabled_ == true. 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(jar): improve the quality of the gathered info by gathering most times 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // at a lower point in the network stack, assuring we have actual packet 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // boundaries, rather than approximations. Also note that input byte count 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as gathered here is post-SSL, and post-cache-fetch, and does not reflect 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // true packet arrival times in such cases. 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Enable recording of packet arrival times for histogramming. 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool packet_timing_enabled_; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool done_; // True when we are done doing work. 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The number of bytes that have been accounted for in packets (where some of 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // those packets may possibly have had their time of arrival recorded). 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 bytes_observed_in_packets_; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The request time may not be available when we are being destroyed, so we 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // snapshot it early on. 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time request_time_snapshot_; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since we don't save all packet times in packet_times_, we save the 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // last time for use in histograms. 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time final_packet_time_; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The start time for the job, ignoring re-starts. 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks start_time_; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // When the transaction finished reading the request headers. 24590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::TimeTicks receive_headers_end_; 24690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<HttpFilterContext> filter_context_; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WeakPtrFactory<URLRequestHttpJob> weak_factory_; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompletionCallback on_headers_received_callback_; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We allow the network delegate to modify a copy of the response headers. 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This prevents modifications of headers that are shared with the underlying 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // layers of the network stack. 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<HttpResponseHeaders> override_response_headers_; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Flag used to verify that |this| is not deleted while we are awaiting 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a callback from the NetworkDelegate. Used as a fail-fast mechanism. 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if we are waiting a callback and 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NetworkDelegate::NotifyURLRequestDestroyed has not been called, yet, 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to inform the NetworkDelegate that it may not call back. 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool awaiting_callback_; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<HttpTransactionDelegateImpl> http_transaction_delegate_; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HttpUserAgentSettings* http_user_agent_settings_; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(URLRequestHttpJob); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // NET_URL_REQUEST_URL_REQUEST_HTTP_JOB_H_ 274