1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker // This file declares HttpCache::Transaction, a private class of HttpCache so 6*6777b538SAndroid Build Coastguard Worker // it should only be included by http_cache.cc 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #ifndef NET_HTTP_HTTP_CACHE_TRANSACTION_H_ 9*6777b538SAndroid Build Coastguard Worker #define NET_HTTP_HTTP_CACHE_TRANSACTION_H_ 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker #include <stddef.h> 12*6777b538SAndroid Build Coastguard Worker #include <stdint.h> 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard Worker #include <memory> 15*6777b538SAndroid Build Coastguard Worker #include <string> 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback.h" 18*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h" 19*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr_exclusion.h" 20*6777b538SAndroid Build Coastguard Worker #include "base/memory/scoped_refptr.h" 21*6777b538SAndroid Build Coastguard Worker #include "base/memory/weak_ptr.h" 22*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h" 23*6777b538SAndroid Build Coastguard Worker #include "net/base/completion_once_callback.h" 24*6777b538SAndroid Build Coastguard Worker #include "net/base/completion_repeating_callback.h" 25*6777b538SAndroid Build Coastguard Worker #include "net/base/io_buffer.h" 26*6777b538SAndroid Build Coastguard Worker #include "net/base/ip_endpoint.h" 27*6777b538SAndroid Build Coastguard Worker #include "net/base/load_states.h" 28*6777b538SAndroid Build Coastguard Worker #include "net/base/net_error_details.h" 29*6777b538SAndroid Build Coastguard Worker #include "net/base/net_errors.h" 30*6777b538SAndroid Build Coastguard Worker #include "net/base/request_priority.h" 31*6777b538SAndroid Build Coastguard Worker #include "net/http/http_cache.h" 32*6777b538SAndroid Build Coastguard Worker #include "net/http/http_request_headers.h" 33*6777b538SAndroid Build Coastguard Worker #include "net/http/http_response_headers.h" 34*6777b538SAndroid Build Coastguard Worker #include "net/http/http_response_info.h" 35*6777b538SAndroid Build Coastguard Worker #include "net/http/http_transaction.h" 36*6777b538SAndroid Build Coastguard Worker #include "net/http/partial_data.h" 37*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log_with_source.h" 38*6777b538SAndroid Build Coastguard Worker #include "net/socket/connection_attempts.h" 39*6777b538SAndroid Build Coastguard Worker #include "net/websockets/websocket_handshake_stream_base.h" 40*6777b538SAndroid Build Coastguard Worker 41*6777b538SAndroid Build Coastguard Worker namespace net { 42*6777b538SAndroid Build Coastguard Worker 43*6777b538SAndroid Build Coastguard Worker class PartialData; 44*6777b538SAndroid Build Coastguard Worker struct HttpRequestInfo; 45*6777b538SAndroid Build Coastguard Worker struct LoadTimingInfo; 46*6777b538SAndroid Build Coastguard Worker class SSLPrivateKey; 47*6777b538SAndroid Build Coastguard Worker 48*6777b538SAndroid Build Coastguard Worker // This is the transaction that is returned by the HttpCache transaction 49*6777b538SAndroid Build Coastguard Worker // factory. 50*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE HttpCache::Transaction : public HttpTransaction { 51*6777b538SAndroid Build Coastguard Worker public: 52*6777b538SAndroid Build Coastguard Worker // The transaction has the following modes, which apply to how it may access 53*6777b538SAndroid Build Coastguard Worker // its cache entry. 54*6777b538SAndroid Build Coastguard Worker // 55*6777b538SAndroid Build Coastguard Worker // o If the mode of the transaction is NONE, then it is in "pass through" 56*6777b538SAndroid Build Coastguard Worker // mode and all methods just forward to the inner network transaction. 57*6777b538SAndroid Build Coastguard Worker // 58*6777b538SAndroid Build Coastguard Worker // o If the mode of the transaction is only READ, then it may only read from 59*6777b538SAndroid Build Coastguard Worker // the cache entry. 60*6777b538SAndroid Build Coastguard Worker // 61*6777b538SAndroid Build Coastguard Worker // o If the mode of the transaction is only WRITE, then it may only write to 62*6777b538SAndroid Build Coastguard Worker // the cache entry. 63*6777b538SAndroid Build Coastguard Worker // 64*6777b538SAndroid Build Coastguard Worker // o If the mode of the transaction is READ_WRITE, then the transaction may 65*6777b538SAndroid Build Coastguard Worker // optionally modify the cache entry (e.g., possibly corresponding to 66*6777b538SAndroid Build Coastguard Worker // cache validation). 67*6777b538SAndroid Build Coastguard Worker // 68*6777b538SAndroid Build Coastguard Worker // o If the mode of the transaction is UPDATE, then the transaction may 69*6777b538SAndroid Build Coastguard Worker // update existing cache entries, but will never create a new entry or 70*6777b538SAndroid Build Coastguard Worker // respond using the entry read from the cache. 71*6777b538SAndroid Build Coastguard Worker enum Mode { 72*6777b538SAndroid Build Coastguard Worker NONE = 0, 73*6777b538SAndroid Build Coastguard Worker READ_META = 1 << 0, 74*6777b538SAndroid Build Coastguard Worker READ_DATA = 1 << 1, 75*6777b538SAndroid Build Coastguard Worker READ = READ_META | READ_DATA, 76*6777b538SAndroid Build Coastguard Worker WRITE = 1 << 2, 77*6777b538SAndroid Build Coastguard Worker READ_WRITE = READ | WRITE, 78*6777b538SAndroid Build Coastguard Worker UPDATE = READ_META | WRITE, // READ_WRITE & ~READ_DATA 79*6777b538SAndroid Build Coastguard Worker }; 80*6777b538SAndroid Build Coastguard Worker 81*6777b538SAndroid Build Coastguard Worker Transaction(RequestPriority priority, HttpCache* cache); 82*6777b538SAndroid Build Coastguard Worker 83*6777b538SAndroid Build Coastguard Worker Transaction(const Transaction&) = delete; 84*6777b538SAndroid Build Coastguard Worker Transaction& operator=(const Transaction&) = delete; 85*6777b538SAndroid Build Coastguard Worker 86*6777b538SAndroid Build Coastguard Worker ~Transaction() override; 87*6777b538SAndroid Build Coastguard Worker 88*6777b538SAndroid Build Coastguard Worker // Virtual so it can be extended for testing. 89*6777b538SAndroid Build Coastguard Worker virtual Mode mode() const; 90*6777b538SAndroid Build Coastguard Worker method()91*6777b538SAndroid Build Coastguard Worker const std::string& method() const { return method_; } 92*6777b538SAndroid Build Coastguard Worker key()93*6777b538SAndroid Build Coastguard Worker const std::string& key() const { return cache_key_; } 94*6777b538SAndroid Build Coastguard Worker 95*6777b538SAndroid Build Coastguard Worker // Returns the LoadState of the writer transaction of a given ActiveEntry. In 96*6777b538SAndroid Build Coastguard Worker // other words, returns the LoadState of this transaction without asking the 97*6777b538SAndroid Build Coastguard Worker // http cache, because this transaction should be the one currently writing 98*6777b538SAndroid Build Coastguard Worker // to the cache entry. 99*6777b538SAndroid Build Coastguard Worker LoadState GetWriterLoadState() const; 100*6777b538SAndroid Build Coastguard Worker SetIOCallBackForTest(CompletionRepeatingCallback cb)101*6777b538SAndroid Build Coastguard Worker void SetIOCallBackForTest(CompletionRepeatingCallback cb) { 102*6777b538SAndroid Build Coastguard Worker io_callback_ = cb; 103*6777b538SAndroid Build Coastguard Worker } 104*6777b538SAndroid Build Coastguard Worker 105*6777b538SAndroid Build Coastguard Worker // Returns the IO callback specific to HTTPCache callbacks. This is done 106*6777b538SAndroid Build Coastguard Worker // indirectly so the callbacks can be replaced when testing. 107*6777b538SAndroid Build Coastguard Worker // TODO(https://crbug.com/1454228/): Find a cleaner way to do this so the 108*6777b538SAndroid Build Coastguard Worker // callback can be called directly. cache_io_callback()109*6777b538SAndroid Build Coastguard Worker const CompletionRepeatingCallback& cache_io_callback() { 110*6777b538SAndroid Build Coastguard Worker return cache_io_callback_; 111*6777b538SAndroid Build Coastguard Worker } SetCacheIOCallBackForTest(CompletionRepeatingCallback cb)112*6777b538SAndroid Build Coastguard Worker void SetCacheIOCallBackForTest(CompletionRepeatingCallback cb) { 113*6777b538SAndroid Build Coastguard Worker cache_io_callback_ = cb; 114*6777b538SAndroid Build Coastguard Worker } 115*6777b538SAndroid Build Coastguard Worker 116*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& net_log() const; 117*6777b538SAndroid Build Coastguard Worker 118*6777b538SAndroid Build Coastguard Worker // Bypasses the cache lock whenever there is lock contention. BypassLockForTest()119*6777b538SAndroid Build Coastguard Worker void BypassLockForTest() { bypass_lock_for_test_ = true; } 120*6777b538SAndroid Build Coastguard Worker BypassLockAfterHeadersForTest()121*6777b538SAndroid Build Coastguard Worker void BypassLockAfterHeadersForTest() { 122*6777b538SAndroid Build Coastguard Worker bypass_lock_after_headers_for_test_ = true; 123*6777b538SAndroid Build Coastguard Worker } 124*6777b538SAndroid Build Coastguard Worker 125*6777b538SAndroid Build Coastguard Worker // Generates a failure when attempting to conditionalize a network request. FailConditionalizationForTest()126*6777b538SAndroid Build Coastguard Worker void FailConditionalizationForTest() { 127*6777b538SAndroid Build Coastguard Worker fail_conditionalization_for_test_ = true; 128*6777b538SAndroid Build Coastguard Worker } 129*6777b538SAndroid Build Coastguard Worker 130*6777b538SAndroid Build Coastguard Worker // HttpTransaction methods: 131*6777b538SAndroid Build Coastguard Worker int Start(const HttpRequestInfo* request_info, 132*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback, 133*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& net_log) override; 134*6777b538SAndroid Build Coastguard Worker int RestartIgnoringLastError(CompletionOnceCallback callback) override; 135*6777b538SAndroid Build Coastguard Worker int RestartWithCertificate(scoped_refptr<X509Certificate> client_cert, 136*6777b538SAndroid Build Coastguard Worker scoped_refptr<SSLPrivateKey> client_private_key, 137*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback) override; 138*6777b538SAndroid Build Coastguard Worker int RestartWithAuth(const AuthCredentials& credentials, 139*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback) override; 140*6777b538SAndroid Build Coastguard Worker bool IsReadyToRestartForAuth() override; 141*6777b538SAndroid Build Coastguard Worker int Read(IOBuffer* buf, 142*6777b538SAndroid Build Coastguard Worker int buf_len, 143*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback) override; 144*6777b538SAndroid Build Coastguard Worker void StopCaching() override; 145*6777b538SAndroid Build Coastguard Worker int64_t GetTotalReceivedBytes() const override; 146*6777b538SAndroid Build Coastguard Worker int64_t GetTotalSentBytes() const override; 147*6777b538SAndroid Build Coastguard Worker void DoneReading() override; 148*6777b538SAndroid Build Coastguard Worker const HttpResponseInfo* GetResponseInfo() const override; 149*6777b538SAndroid Build Coastguard Worker LoadState GetLoadState() const override; 150*6777b538SAndroid Build Coastguard Worker void SetQuicServerInfo(QuicServerInfo* quic_server_info) override; 151*6777b538SAndroid Build Coastguard Worker bool GetLoadTimingInfo(LoadTimingInfo* load_timing_info) const override; 152*6777b538SAndroid Build Coastguard Worker bool GetRemoteEndpoint(IPEndPoint* endpoint) const override; 153*6777b538SAndroid Build Coastguard Worker void PopulateNetErrorDetails(NetErrorDetails* details) const override; 154*6777b538SAndroid Build Coastguard Worker void SetPriority(RequestPriority priority) override; 155*6777b538SAndroid Build Coastguard Worker void SetWebSocketHandshakeStreamCreateHelper( 156*6777b538SAndroid Build Coastguard Worker WebSocketHandshakeStreamBase::CreateHelper* create_helper) override; 157*6777b538SAndroid Build Coastguard Worker void SetBeforeNetworkStartCallback( 158*6777b538SAndroid Build Coastguard Worker BeforeNetworkStartCallback callback) override; 159*6777b538SAndroid Build Coastguard Worker void SetConnectedCallback(const ConnectedCallback& callback) override; 160*6777b538SAndroid Build Coastguard Worker void SetRequestHeadersCallback(RequestHeadersCallback callback) override; 161*6777b538SAndroid Build Coastguard Worker void SetResponseHeadersCallback(ResponseHeadersCallback callback) override; 162*6777b538SAndroid Build Coastguard Worker void SetEarlyResponseHeadersCallback( 163*6777b538SAndroid Build Coastguard Worker ResponseHeadersCallback callback) override; 164*6777b538SAndroid Build Coastguard Worker void SetModifyRequestHeadersCallback( 165*6777b538SAndroid Build Coastguard Worker base::RepeatingCallback<void(net::HttpRequestHeaders*)> callback) 166*6777b538SAndroid Build Coastguard Worker override; 167*6777b538SAndroid Build Coastguard Worker void SetIsSharedDictionaryReadAllowedCallback( 168*6777b538SAndroid Build Coastguard Worker base::RepeatingCallback<bool()> callback) override; 169*6777b538SAndroid Build Coastguard Worker int ResumeNetworkStart() override; 170*6777b538SAndroid Build Coastguard Worker ConnectionAttempts GetConnectionAttempts() const override; 171*6777b538SAndroid Build Coastguard Worker void CloseConnectionOnDestruction() override; 172*6777b538SAndroid Build Coastguard Worker bool IsMdlMatchForMetrics() const override; 173*6777b538SAndroid Build Coastguard Worker 174*6777b538SAndroid Build Coastguard Worker // Invoked when parallel validation cannot proceed due to response failure 175*6777b538SAndroid Build Coastguard Worker // and this transaction needs to be restarted. 176*6777b538SAndroid Build Coastguard Worker void SetValidatingCannotProceed(); 177*6777b538SAndroid Build Coastguard Worker 178*6777b538SAndroid Build Coastguard Worker // Invoked to remove the association between a transaction waiting to be 179*6777b538SAndroid Build Coastguard Worker // added to an entry and the entry. ResetCachePendingState()180*6777b538SAndroid Build Coastguard Worker void ResetCachePendingState() { cache_pending_ = false; } 181*6777b538SAndroid Build Coastguard Worker priority()182*6777b538SAndroid Build Coastguard Worker RequestPriority priority() const { return priority_; } partial()183*6777b538SAndroid Build Coastguard Worker PartialData* partial() { return partial_.get(); } is_truncated()184*6777b538SAndroid Build Coastguard Worker bool is_truncated() { return truncated_; } 185*6777b538SAndroid Build Coastguard Worker 186*6777b538SAndroid Build Coastguard Worker // Invoked when this writer transaction is about to be removed from entry. 187*6777b538SAndroid Build Coastguard Worker // If result is an error code, a future Read should fail with |result|. 188*6777b538SAndroid Build Coastguard Worker void WriterAboutToBeRemovedFromEntry(int result); 189*6777b538SAndroid Build Coastguard Worker 190*6777b538SAndroid Build Coastguard Worker // Invoked when this transaction is about to become a reader because the cache 191*6777b538SAndroid Build Coastguard Worker // entry has finished writing. 192*6777b538SAndroid Build Coastguard Worker void WriteModeTransactionAboutToBecomeReader(); 193*6777b538SAndroid Build Coastguard Worker 194*6777b538SAndroid Build Coastguard Worker // Add time spent writing data in the disk cache. Used for histograms. 195*6777b538SAndroid Build Coastguard Worker void AddDiskCacheWriteTime(base::TimeDelta elapsed); 196*6777b538SAndroid Build Coastguard Worker 197*6777b538SAndroid Build Coastguard Worker private: 198*6777b538SAndroid Build Coastguard Worker static const size_t kNumValidationHeaders = 2; 199*6777b538SAndroid Build Coastguard Worker // Helper struct to pair a header name with its value, for 200*6777b538SAndroid Build Coastguard Worker // headers used to validate cache entries. 201*6777b538SAndroid Build Coastguard Worker struct ValidationHeaders { 202*6777b538SAndroid Build Coastguard Worker ValidationHeaders() = default; 203*6777b538SAndroid Build Coastguard Worker 204*6777b538SAndroid Build Coastguard Worker std::string values[kNumValidationHeaders]; ResetValidationHeaders205*6777b538SAndroid Build Coastguard Worker void Reset() { 206*6777b538SAndroid Build Coastguard Worker initialized = false; 207*6777b538SAndroid Build Coastguard Worker for (auto& value : values) { 208*6777b538SAndroid Build Coastguard Worker value.clear(); 209*6777b538SAndroid Build Coastguard Worker } 210*6777b538SAndroid Build Coastguard Worker } 211*6777b538SAndroid Build Coastguard Worker bool initialized = false; 212*6777b538SAndroid Build Coastguard Worker }; 213*6777b538SAndroid Build Coastguard Worker 214*6777b538SAndroid Build Coastguard Worker struct NetworkTransactionInfo { 215*6777b538SAndroid Build Coastguard Worker NetworkTransactionInfo(); 216*6777b538SAndroid Build Coastguard Worker 217*6777b538SAndroid Build Coastguard Worker NetworkTransactionInfo(const NetworkTransactionInfo&) = delete; 218*6777b538SAndroid Build Coastguard Worker NetworkTransactionInfo& operator=(const NetworkTransactionInfo&) = delete; 219*6777b538SAndroid Build Coastguard Worker 220*6777b538SAndroid Build Coastguard Worker ~NetworkTransactionInfo(); 221*6777b538SAndroid Build Coastguard Worker 222*6777b538SAndroid Build Coastguard Worker // Load timing information for the last network request, if any. Set in the 223*6777b538SAndroid Build Coastguard Worker // 304 and 206 response cases, as the network transaction may be destroyed 224*6777b538SAndroid Build Coastguard Worker // before the caller requests load timing information. 225*6777b538SAndroid Build Coastguard Worker std::unique_ptr<LoadTimingInfo> old_network_trans_load_timing; 226*6777b538SAndroid Build Coastguard Worker int64_t total_received_bytes = 0; 227*6777b538SAndroid Build Coastguard Worker int64_t total_sent_bytes = 0; 228*6777b538SAndroid Build Coastguard Worker ConnectionAttempts old_connection_attempts; 229*6777b538SAndroid Build Coastguard Worker IPEndPoint old_remote_endpoint; 230*6777b538SAndroid Build Coastguard Worker // For metrics. Can be removed when associated histograms are removed. 231*6777b538SAndroid Build Coastguard Worker // Records whether any destroyed network transactions' ProxyInfo determined 232*6777b538SAndroid Build Coastguard Worker // the request was to a Masked Domain List-covered domain. 233*6777b538SAndroid Build Coastguard Worker bool previous_mdl_match_for_metrics = false; 234*6777b538SAndroid Build Coastguard Worker }; 235*6777b538SAndroid Build Coastguard Worker 236*6777b538SAndroid Build Coastguard Worker enum State { 237*6777b538SAndroid Build Coastguard Worker STATE_UNSET, 238*6777b538SAndroid Build Coastguard Worker 239*6777b538SAndroid Build Coastguard Worker // Normally, states are traversed in approximately this order. 240*6777b538SAndroid Build Coastguard Worker STATE_NONE, 241*6777b538SAndroid Build Coastguard Worker STATE_GET_BACKEND, 242*6777b538SAndroid Build Coastguard Worker STATE_GET_BACKEND_COMPLETE, 243*6777b538SAndroid Build Coastguard Worker STATE_INIT_ENTRY, 244*6777b538SAndroid Build Coastguard Worker STATE_OPEN_OR_CREATE_ENTRY, 245*6777b538SAndroid Build Coastguard Worker STATE_OPEN_OR_CREATE_ENTRY_COMPLETE, 246*6777b538SAndroid Build Coastguard Worker STATE_DOOM_ENTRY, 247*6777b538SAndroid Build Coastguard Worker STATE_DOOM_ENTRY_COMPLETE, 248*6777b538SAndroid Build Coastguard Worker STATE_CREATE_ENTRY, 249*6777b538SAndroid Build Coastguard Worker STATE_CREATE_ENTRY_COMPLETE, 250*6777b538SAndroid Build Coastguard Worker STATE_ADD_TO_ENTRY, 251*6777b538SAndroid Build Coastguard Worker STATE_ADD_TO_ENTRY_COMPLETE, 252*6777b538SAndroid Build Coastguard Worker STATE_DONE_HEADERS_ADD_TO_ENTRY_COMPLETE, 253*6777b538SAndroid Build Coastguard Worker STATE_CACHE_READ_RESPONSE, 254*6777b538SAndroid Build Coastguard Worker STATE_CACHE_READ_RESPONSE_COMPLETE, 255*6777b538SAndroid Build Coastguard Worker STATE_WRITE_UPDATED_PREFETCH_RESPONSE, 256*6777b538SAndroid Build Coastguard Worker STATE_WRITE_UPDATED_PREFETCH_RESPONSE_COMPLETE, 257*6777b538SAndroid Build Coastguard Worker STATE_CACHE_DISPATCH_VALIDATION, 258*6777b538SAndroid Build Coastguard Worker STATE_CACHE_QUERY_DATA, 259*6777b538SAndroid Build Coastguard Worker STATE_CACHE_QUERY_DATA_COMPLETE, 260*6777b538SAndroid Build Coastguard Worker STATE_START_PARTIAL_CACHE_VALIDATION, 261*6777b538SAndroid Build Coastguard Worker STATE_COMPLETE_PARTIAL_CACHE_VALIDATION, 262*6777b538SAndroid Build Coastguard Worker STATE_CACHE_UPDATE_STALE_WHILE_REVALIDATE_TIMEOUT, 263*6777b538SAndroid Build Coastguard Worker STATE_CACHE_UPDATE_STALE_WHILE_REVALIDATE_TIMEOUT_COMPLETE, 264*6777b538SAndroid Build Coastguard Worker STATE_CONNECTED_CALLBACK, 265*6777b538SAndroid Build Coastguard Worker STATE_CONNECTED_CALLBACK_COMPLETE, 266*6777b538SAndroid Build Coastguard Worker STATE_SETUP_ENTRY_FOR_READ, 267*6777b538SAndroid Build Coastguard Worker STATE_SEND_REQUEST, 268*6777b538SAndroid Build Coastguard Worker STATE_SEND_REQUEST_COMPLETE, 269*6777b538SAndroid Build Coastguard Worker STATE_SUCCESSFUL_SEND_REQUEST, 270*6777b538SAndroid Build Coastguard Worker STATE_UPDATE_CACHED_RESPONSE, 271*6777b538SAndroid Build Coastguard Worker STATE_CACHE_WRITE_UPDATED_RESPONSE, 272*6777b538SAndroid Build Coastguard Worker STATE_CACHE_WRITE_UPDATED_RESPONSE_COMPLETE, 273*6777b538SAndroid Build Coastguard Worker STATE_UPDATE_CACHED_RESPONSE_COMPLETE, 274*6777b538SAndroid Build Coastguard Worker STATE_OVERWRITE_CACHED_RESPONSE, 275*6777b538SAndroid Build Coastguard Worker STATE_CACHE_WRITE_RESPONSE, 276*6777b538SAndroid Build Coastguard Worker STATE_CACHE_WRITE_RESPONSE_COMPLETE, 277*6777b538SAndroid Build Coastguard Worker STATE_TRUNCATE_CACHED_DATA, 278*6777b538SAndroid Build Coastguard Worker STATE_TRUNCATE_CACHED_DATA_COMPLETE, 279*6777b538SAndroid Build Coastguard Worker STATE_TRUNCATE_CACHED_METADATA, 280*6777b538SAndroid Build Coastguard Worker STATE_TRUNCATE_CACHED_METADATA_COMPLETE, 281*6777b538SAndroid Build Coastguard Worker STATE_PARTIAL_HEADERS_RECEIVED, 282*6777b538SAndroid Build Coastguard Worker STATE_HEADERS_PHASE_CANNOT_PROCEED, 283*6777b538SAndroid Build Coastguard Worker STATE_FINISH_HEADERS, 284*6777b538SAndroid Build Coastguard Worker STATE_FINISH_HEADERS_COMPLETE, 285*6777b538SAndroid Build Coastguard Worker 286*6777b538SAndroid Build Coastguard Worker // These states are entered from Read. 287*6777b538SAndroid Build Coastguard Worker STATE_NETWORK_READ_CACHE_WRITE, 288*6777b538SAndroid Build Coastguard Worker STATE_NETWORK_READ_CACHE_WRITE_COMPLETE, 289*6777b538SAndroid Build Coastguard Worker STATE_CACHE_READ_DATA, 290*6777b538SAndroid Build Coastguard Worker STATE_CACHE_READ_DATA_COMPLETE, 291*6777b538SAndroid Build Coastguard Worker // These states are entered if the request should be handled exclusively 292*6777b538SAndroid Build Coastguard Worker // by the network layer (skipping the cache entirely). 293*6777b538SAndroid Build Coastguard Worker STATE_NETWORK_READ, 294*6777b538SAndroid Build Coastguard Worker STATE_NETWORK_READ_COMPLETE, 295*6777b538SAndroid Build Coastguard Worker }; 296*6777b538SAndroid Build Coastguard Worker 297*6777b538SAndroid Build Coastguard Worker // Used for categorizing validation triggers in histograms. 298*6777b538SAndroid Build Coastguard Worker // NOTE: This enumeration is used in histograms, so please do not add entries 299*6777b538SAndroid Build Coastguard Worker // in the middle. 300*6777b538SAndroid Build Coastguard Worker enum ValidationCause { 301*6777b538SAndroid Build Coastguard Worker VALIDATION_CAUSE_UNDEFINED, 302*6777b538SAndroid Build Coastguard Worker VALIDATION_CAUSE_VARY_MISMATCH, 303*6777b538SAndroid Build Coastguard Worker VALIDATION_CAUSE_VALIDATE_FLAG, 304*6777b538SAndroid Build Coastguard Worker VALIDATION_CAUSE_STALE, 305*6777b538SAndroid Build Coastguard Worker VALIDATION_CAUSE_ZERO_FRESHNESS, 306*6777b538SAndroid Build Coastguard Worker VALIDATION_CAUSE_MAX 307*6777b538SAndroid Build Coastguard Worker }; 308*6777b538SAndroid Build Coastguard Worker 309*6777b538SAndroid Build Coastguard Worker enum MemoryEntryDataHints { 310*6777b538SAndroid Build Coastguard Worker // If this hint is set, the caching headers indicate we can't do anything 311*6777b538SAndroid Build Coastguard Worker // with this entry (unless we are ignoring them thanks to a loadflag), 312*6777b538SAndroid Build Coastguard Worker // i.e. it's expired and has nothing that permits validations. 313*6777b538SAndroid Build Coastguard Worker HINT_UNUSABLE_PER_CACHING_HEADERS = (1 << 0), 314*6777b538SAndroid Build Coastguard Worker }; 315*6777b538SAndroid Build Coastguard Worker 316*6777b538SAndroid Build Coastguard Worker // Runs the state transition loop. Resets and calls |callback_| on exit, 317*6777b538SAndroid Build Coastguard Worker // unless the return value is ERR_IO_PENDING. 318*6777b538SAndroid Build Coastguard Worker int DoLoop(int result); 319*6777b538SAndroid Build Coastguard Worker 320*6777b538SAndroid Build Coastguard Worker // Each of these methods corresponds to a State value. If there is an 321*6777b538SAndroid Build Coastguard Worker // argument, the value corresponds to the return of the previous state or 322*6777b538SAndroid Build Coastguard Worker // corresponding callback. 323*6777b538SAndroid Build Coastguard Worker int DoGetBackend(); 324*6777b538SAndroid Build Coastguard Worker int DoGetBackendComplete(int result); 325*6777b538SAndroid Build Coastguard Worker int DoInitEntry(); 326*6777b538SAndroid Build Coastguard Worker int DoOpenOrCreateEntry(); 327*6777b538SAndroid Build Coastguard Worker int DoOpenOrCreateEntryComplete(int result); 328*6777b538SAndroid Build Coastguard Worker int DoDoomEntry(); 329*6777b538SAndroid Build Coastguard Worker int DoDoomEntryComplete(int result); 330*6777b538SAndroid Build Coastguard Worker int DoCreateEntry(); 331*6777b538SAndroid Build Coastguard Worker int DoCreateEntryComplete(int result); 332*6777b538SAndroid Build Coastguard Worker int DoAddToEntry(); 333*6777b538SAndroid Build Coastguard Worker int DoAddToEntryComplete(int result); 334*6777b538SAndroid Build Coastguard Worker int DoDoneHeadersAddToEntryComplete(int result); 335*6777b538SAndroid Build Coastguard Worker int DoCacheReadResponse(); 336*6777b538SAndroid Build Coastguard Worker int DoCacheReadResponseComplete(int result); 337*6777b538SAndroid Build Coastguard Worker int DoCacheWriteUpdatedPrefetchResponse(int result); 338*6777b538SAndroid Build Coastguard Worker int DoCacheWriteUpdatedPrefetchResponseComplete(int result); 339*6777b538SAndroid Build Coastguard Worker int DoCacheDispatchValidation(); 340*6777b538SAndroid Build Coastguard Worker int DoCacheQueryData(); 341*6777b538SAndroid Build Coastguard Worker int DoCacheQueryDataComplete(int result); 342*6777b538SAndroid Build Coastguard Worker int DoCacheUpdateStaleWhileRevalidateTimeout(); 343*6777b538SAndroid Build Coastguard Worker int DoCacheUpdateStaleWhileRevalidateTimeoutComplete(int result); 344*6777b538SAndroid Build Coastguard Worker int DoConnectedCallback(); 345*6777b538SAndroid Build Coastguard Worker int DoConnectedCallbackComplete(int result); 346*6777b538SAndroid Build Coastguard Worker int DoSetupEntryForRead(); 347*6777b538SAndroid Build Coastguard Worker int DoStartPartialCacheValidation(); 348*6777b538SAndroid Build Coastguard Worker int DoCompletePartialCacheValidation(int result); 349*6777b538SAndroid Build Coastguard Worker int DoSendRequest(); 350*6777b538SAndroid Build Coastguard Worker int DoSendRequestComplete(int result); 351*6777b538SAndroid Build Coastguard Worker int DoSuccessfulSendRequest(); 352*6777b538SAndroid Build Coastguard Worker int DoUpdateCachedResponse(); 353*6777b538SAndroid Build Coastguard Worker int DoCacheWriteUpdatedResponse(); 354*6777b538SAndroid Build Coastguard Worker int DoCacheWriteUpdatedResponseComplete(int result); 355*6777b538SAndroid Build Coastguard Worker int DoUpdateCachedResponseComplete(int result); 356*6777b538SAndroid Build Coastguard Worker int DoOverwriteCachedResponse(); 357*6777b538SAndroid Build Coastguard Worker int DoCacheWriteResponse(); 358*6777b538SAndroid Build Coastguard Worker int DoCacheWriteResponseComplete(int result); 359*6777b538SAndroid Build Coastguard Worker int DoTruncateCachedData(); 360*6777b538SAndroid Build Coastguard Worker int DoTruncateCachedDataComplete(int result); 361*6777b538SAndroid Build Coastguard Worker int DoTruncateCachedMetadata(); 362*6777b538SAndroid Build Coastguard Worker int DoTruncateCachedMetadataComplete(int result); 363*6777b538SAndroid Build Coastguard Worker int DoPartialHeadersReceived(); 364*6777b538SAndroid Build Coastguard Worker int DoHeadersPhaseCannotProceed(int result); 365*6777b538SAndroid Build Coastguard Worker int DoFinishHeaders(int result); 366*6777b538SAndroid Build Coastguard Worker int DoFinishHeadersComplete(int result); 367*6777b538SAndroid Build Coastguard Worker int DoNetworkReadCacheWrite(); 368*6777b538SAndroid Build Coastguard Worker int DoNetworkReadCacheWriteComplete(int result); 369*6777b538SAndroid Build Coastguard Worker int DoCacheReadData(); 370*6777b538SAndroid Build Coastguard Worker int DoCacheReadDataComplete(int result); 371*6777b538SAndroid Build Coastguard Worker int DoNetworkRead(); 372*6777b538SAndroid Build Coastguard Worker int DoNetworkReadComplete(int result); 373*6777b538SAndroid Build Coastguard Worker 374*6777b538SAndroid Build Coastguard Worker // Adds time out handling while waiting to be added to entry or after headers 375*6777b538SAndroid Build Coastguard Worker // phase is complete. 376*6777b538SAndroid Build Coastguard Worker void AddCacheLockTimeoutHandler(ActiveEntry* entry); 377*6777b538SAndroid Build Coastguard Worker 378*6777b538SAndroid Build Coastguard Worker // Sets request_ and fields derived from it. 379*6777b538SAndroid Build Coastguard Worker void SetRequest(const NetLogWithSource& net_log); 380*6777b538SAndroid Build Coastguard Worker 381*6777b538SAndroid Build Coastguard Worker // Returns true if the request should be handled exclusively by the network 382*6777b538SAndroid Build Coastguard Worker // layer (skipping the cache entirely). 383*6777b538SAndroid Build Coastguard Worker bool ShouldPassThrough(); 384*6777b538SAndroid Build Coastguard Worker 385*6777b538SAndroid Build Coastguard Worker // Called to begin reading from the cache. Returns network error code. 386*6777b538SAndroid Build Coastguard Worker int BeginCacheRead(); 387*6777b538SAndroid Build Coastguard Worker 388*6777b538SAndroid Build Coastguard Worker // Called to begin validating the cache entry. Returns network error code. 389*6777b538SAndroid Build Coastguard Worker int BeginCacheValidation(); 390*6777b538SAndroid Build Coastguard Worker 391*6777b538SAndroid Build Coastguard Worker // Called to begin validating an entry that stores partial content. Returns 392*6777b538SAndroid Build Coastguard Worker // a network error code. 393*6777b538SAndroid Build Coastguard Worker int BeginPartialCacheValidation(); 394*6777b538SAndroid Build Coastguard Worker 395*6777b538SAndroid Build Coastguard Worker // Validates the entry headers against the requested range and continues with 396*6777b538SAndroid Build Coastguard Worker // the validation of the rest of the entry. Returns a network error code. 397*6777b538SAndroid Build Coastguard Worker int ValidateEntryHeadersAndContinue(); 398*6777b538SAndroid Build Coastguard Worker 399*6777b538SAndroid Build Coastguard Worker // Returns whether the current externally conditionalized request's validation 400*6777b538SAndroid Build Coastguard Worker // headers match the current cache entry's headers. 401*6777b538SAndroid Build Coastguard Worker bool ExternallyConditionalizedValidationHeadersMatchEntry() const; 402*6777b538SAndroid Build Coastguard Worker 403*6777b538SAndroid Build Coastguard Worker // Called to start requests which were given an "if-modified-since" or 404*6777b538SAndroid Build Coastguard Worker // "if-none-match" validation header by the caller (NOT when the request was 405*6777b538SAndroid Build Coastguard Worker // conditionalized internally in response to LOAD_VALIDATE_CACHE). 406*6777b538SAndroid Build Coastguard Worker // Returns a network error code. 407*6777b538SAndroid Build Coastguard Worker int BeginExternallyConditionalizedRequest(); 408*6777b538SAndroid Build Coastguard Worker 409*6777b538SAndroid Build Coastguard Worker // Called to restart a network transaction after an error. Returns network 410*6777b538SAndroid Build Coastguard Worker // error code. 411*6777b538SAndroid Build Coastguard Worker int RestartNetworkRequest(); 412*6777b538SAndroid Build Coastguard Worker 413*6777b538SAndroid Build Coastguard Worker // Called to restart a network transaction with a client certificate. 414*6777b538SAndroid Build Coastguard Worker // Returns network error code. 415*6777b538SAndroid Build Coastguard Worker int RestartNetworkRequestWithCertificate( 416*6777b538SAndroid Build Coastguard Worker scoped_refptr<X509Certificate> client_cert, 417*6777b538SAndroid Build Coastguard Worker scoped_refptr<SSLPrivateKey> client_private_key); 418*6777b538SAndroid Build Coastguard Worker 419*6777b538SAndroid Build Coastguard Worker // Called to restart a network transaction with authentication credentials. 420*6777b538SAndroid Build Coastguard Worker // Returns network error code. 421*6777b538SAndroid Build Coastguard Worker int RestartNetworkRequestWithAuth(const AuthCredentials& credentials); 422*6777b538SAndroid Build Coastguard Worker 423*6777b538SAndroid Build Coastguard Worker // Called to determine if we need to validate the cache entry before using it, 424*6777b538SAndroid Build Coastguard Worker // and whether the validation should be synchronous or asynchronous. 425*6777b538SAndroid Build Coastguard Worker ValidationType RequiresValidation(); 426*6777b538SAndroid Build Coastguard Worker 427*6777b538SAndroid Build Coastguard Worker // Called to make the request conditional (to ask the server if the cached 428*6777b538SAndroid Build Coastguard Worker // copy is valid). Returns true if able to make the request conditional. 429*6777b538SAndroid Build Coastguard Worker bool ConditionalizeRequest(); 430*6777b538SAndroid Build Coastguard Worker 431*6777b538SAndroid Build Coastguard Worker // Determines if saved response permits conditionalization, and extracts 432*6777b538SAndroid Build Coastguard Worker // etag/last-modified values. Only depends on |response_.headers|. 433*6777b538SAndroid Build Coastguard Worker // |*etag_value| and |*last_modified_value| will be set if true is returned, 434*6777b538SAndroid Build Coastguard Worker // but may also be modified in other cases. 435*6777b538SAndroid Build Coastguard Worker bool IsResponseConditionalizable(std::string* etag_value, 436*6777b538SAndroid Build Coastguard Worker std::string* last_modified_value) const; 437*6777b538SAndroid Build Coastguard Worker 438*6777b538SAndroid Build Coastguard Worker // Returns true if |method_| indicates that we should only try to open an 439*6777b538SAndroid Build Coastguard Worker // entry and not attempt to create. 440*6777b538SAndroid Build Coastguard Worker bool ShouldOpenOnlyMethods() const; 441*6777b538SAndroid Build Coastguard Worker 442*6777b538SAndroid Build Coastguard Worker // Returns true if the resource info MemoryEntryDataHints bit flags in 443*6777b538SAndroid Build Coastguard Worker // |in_memory_info| and the current request & load flags suggest that 444*6777b538SAndroid Build Coastguard Worker // the cache entry in question is not actually usable for HTTP 445*6777b538SAndroid Build Coastguard Worker // (i.e. already expired, and nothing is forcing us to disregard that). 446*6777b538SAndroid Build Coastguard Worker bool MaybeRejectBasedOnEntryInMemoryData(uint8_t in_memory_info); 447*6777b538SAndroid Build Coastguard Worker 448*6777b538SAndroid Build Coastguard Worker // Returns true if response_ is such that, if saved to cache, it would only 449*6777b538SAndroid Build Coastguard Worker // be usable if load flags asked us to ignore caching headers. 450*6777b538SAndroid Build Coastguard Worker // (return value of false makes no statement as to suitability of the entry). 451*6777b538SAndroid Build Coastguard Worker bool ComputeUnusablePerCachingHeaders(); 452*6777b538SAndroid Build Coastguard Worker 453*6777b538SAndroid Build Coastguard Worker // Makes sure that a 206 response is expected. Returns true on success. 454*6777b538SAndroid Build Coastguard Worker // On success, handling_206_ will be set to true if we are processing a 455*6777b538SAndroid Build Coastguard Worker // partial entry. 456*6777b538SAndroid Build Coastguard Worker bool ValidatePartialResponse(); 457*6777b538SAndroid Build Coastguard Worker 458*6777b538SAndroid Build Coastguard Worker // Handles a response validation error by bypassing the cache. 459*6777b538SAndroid Build Coastguard Worker void IgnoreRangeRequest(); 460*6777b538SAndroid Build Coastguard Worker 461*6777b538SAndroid Build Coastguard Worker // Fixes the response headers to match expectations for a HEAD request. 462*6777b538SAndroid Build Coastguard Worker void FixHeadersForHead(); 463*6777b538SAndroid Build Coastguard Worker 464*6777b538SAndroid Build Coastguard Worker // Called to write a response to the cache entry. |truncated| indicates if the 465*6777b538SAndroid Build Coastguard Worker // entry should be marked as incomplete. 466*6777b538SAndroid Build Coastguard Worker int WriteResponseInfoToEntry(const HttpResponseInfo& response, 467*6777b538SAndroid Build Coastguard Worker bool truncated); 468*6777b538SAndroid Build Coastguard Worker 469*6777b538SAndroid Build Coastguard Worker // Helper function, should be called with result of WriteResponseInfoToEntry 470*6777b538SAndroid Build Coastguard Worker // (or the result of the callback, when WriteResponseInfoToEntry returns 471*6777b538SAndroid Build Coastguard Worker // ERR_IO_PENDING). Calls DoneWithEntry if |result| is not the right 472*6777b538SAndroid Build Coastguard Worker // number of bytes. It is expected that the state that calls this will 473*6777b538SAndroid Build Coastguard Worker // return whatever net error code this function returns, which currently 474*6777b538SAndroid Build Coastguard Worker // is always "OK". 475*6777b538SAndroid Build Coastguard Worker int OnWriteResponseInfoToEntryComplete(int result); 476*6777b538SAndroid Build Coastguard Worker 477*6777b538SAndroid Build Coastguard Worker // Configures the transaction to read from the network and stop writing to the 478*6777b538SAndroid Build Coastguard Worker // entry. It will release the entry if possible. Returns true if caching could 479*6777b538SAndroid Build Coastguard Worker // be stopped successfully. It will not be stopped if there are multiple 480*6777b538SAndroid Build Coastguard Worker // transactions writing to the cache simultaneously. 481*6777b538SAndroid Build Coastguard Worker bool StopCachingImpl(bool success); 482*6777b538SAndroid Build Coastguard Worker 483*6777b538SAndroid Build Coastguard Worker // Informs the HttpCache that this transaction is done with the entry and 484*6777b538SAndroid Build Coastguard Worker // changes the mode to NONE. Set |entry_is_complete| to false if the 485*6777b538SAndroid Build Coastguard Worker // transaction has not yet finished fully writing or reading the request 486*6777b538SAndroid Build Coastguard Worker // to/from the entry. If |entry_is_complete| is false the result may be either 487*6777b538SAndroid Build Coastguard Worker // a truncated or a doomed entry based on whether the stored response can be 488*6777b538SAndroid Build Coastguard Worker // resumed or not. 489*6777b538SAndroid Build Coastguard Worker void DoneWithEntry(bool entry_is_complete); 490*6777b538SAndroid Build Coastguard Worker 491*6777b538SAndroid Build Coastguard Worker // Dooms the given entry so that it will not be re-used for other requests, 492*6777b538SAndroid Build Coastguard Worker // then calls `DoneWithEntry()`. 493*6777b538SAndroid Build Coastguard Worker // 494*6777b538SAndroid Build Coastguard Worker // This happens when network conditions have changed since the entry was 495*6777b538SAndroid Build Coastguard Worker // cached, which results in deterministic failures when trying to use the 496*6777b538SAndroid Build Coastguard Worker // cache entry. In order to let future requests succeed, the cache entry 497*6777b538SAndroid Build Coastguard Worker // should be doomed. 498*6777b538SAndroid Build Coastguard Worker void DoomInconsistentEntry(); 499*6777b538SAndroid Build Coastguard Worker 500*6777b538SAndroid Build Coastguard Worker // Returns an error to signal the caller that the current read failed. The 501*6777b538SAndroid Build Coastguard Worker // current operation |result| is also logged. If |restart| is true, the 502*6777b538SAndroid Build Coastguard Worker // transaction should be restarted. 503*6777b538SAndroid Build Coastguard Worker int OnCacheReadError(int result, bool restart); 504*6777b538SAndroid Build Coastguard Worker 505*6777b538SAndroid Build Coastguard Worker // Called when the cache lock timeout fires. 506*6777b538SAndroid Build Coastguard Worker void OnCacheLockTimeout(base::TimeTicks start_time); 507*6777b538SAndroid Build Coastguard Worker 508*6777b538SAndroid Build Coastguard Worker // Deletes the current partial cache entry (sparse), and optionally removes 509*6777b538SAndroid Build Coastguard Worker // the control object (partial_). 510*6777b538SAndroid Build Coastguard Worker void DoomPartialEntry(bool delete_object); 511*6777b538SAndroid Build Coastguard Worker 512*6777b538SAndroid Build Coastguard Worker // Performs the needed work after receiving data from the network, when 513*6777b538SAndroid Build Coastguard Worker // working with range requests. 514*6777b538SAndroid Build Coastguard Worker int DoPartialNetworkReadCompleted(int result); 515*6777b538SAndroid Build Coastguard Worker 516*6777b538SAndroid Build Coastguard Worker // Performs the needed work after receiving data from the cache, when 517*6777b538SAndroid Build Coastguard Worker // working with range requests. 518*6777b538SAndroid Build Coastguard Worker int DoPartialCacheReadCompleted(int result); 519*6777b538SAndroid Build Coastguard Worker 520*6777b538SAndroid Build Coastguard Worker // Restarts this transaction after deleting the cached data. It is meant to 521*6777b538SAndroid Build Coastguard Worker // be used when the current request cannot be fulfilled due to conflicts 522*6777b538SAndroid Build Coastguard Worker // between the byte range request and the cached entry. 523*6777b538SAndroid Build Coastguard Worker int DoRestartPartialRequest(); 524*6777b538SAndroid Build Coastguard Worker 525*6777b538SAndroid Build Coastguard Worker // Resets the relavant internal state to remove traces of internal processing 526*6777b538SAndroid Build Coastguard Worker // related to range requests. Deletes |partial_| if |delete_object| is true. 527*6777b538SAndroid Build Coastguard Worker void ResetPartialState(bool delete_object); 528*6777b538SAndroid Build Coastguard Worker 529*6777b538SAndroid Build Coastguard Worker // Resets |network_trans_|, which must be non-NULL. Also updates 530*6777b538SAndroid Build Coastguard Worker // |old_network_trans_load_timing_|, which must be NULL when this is called. 531*6777b538SAndroid Build Coastguard Worker void ResetNetworkTransaction(); 532*6777b538SAndroid Build Coastguard Worker 533*6777b538SAndroid Build Coastguard Worker // Returns the currently active network transaction. 534*6777b538SAndroid Build Coastguard Worker const HttpTransaction* network_transaction() const; 535*6777b538SAndroid Build Coastguard Worker HttpTransaction* network_transaction(); 536*6777b538SAndroid Build Coastguard Worker 537*6777b538SAndroid Build Coastguard Worker // Returns the network transaction from |this| or from writers only if it was 538*6777b538SAndroid Build Coastguard Worker // moved from |this| to writers. This is so that statistics of the network 539*6777b538SAndroid Build Coastguard Worker // transaction are not attributed to any other writer member. 540*6777b538SAndroid Build Coastguard Worker const HttpTransaction* GetOwnedOrMovedNetworkTransaction() const; 541*6777b538SAndroid Build Coastguard Worker 542*6777b538SAndroid Build Coastguard Worker // Returns true if we should bother attempting to resume this request if it is 543*6777b538SAndroid Build Coastguard Worker // aborted while in progress. If |has_data| is true, the size of the stored 544*6777b538SAndroid Build Coastguard Worker // data is considered for the result. 545*6777b538SAndroid Build Coastguard Worker bool CanResume(bool has_data); 546*6777b538SAndroid Build Coastguard Worker 547*6777b538SAndroid Build Coastguard Worker // Setter for response_ and auth_response_. It updates its cache entry status, 548*6777b538SAndroid Build Coastguard Worker // if needed. 549*6777b538SAndroid Build Coastguard Worker void SetResponse(const HttpResponseInfo& new_response); 550*6777b538SAndroid Build Coastguard Worker void SetAuthResponse(const HttpResponseInfo& new_response); 551*6777b538SAndroid Build Coastguard Worker 552*6777b538SAndroid Build Coastguard Worker void UpdateCacheEntryStatus( 553*6777b538SAndroid Build Coastguard Worker HttpResponseInfo::CacheEntryStatus new_cache_entry_status); 554*6777b538SAndroid Build Coastguard Worker 555*6777b538SAndroid Build Coastguard Worker // Sets the response.cache_entry_status to the current cache_entry_status_. 556*6777b538SAndroid Build Coastguard Worker void SyncCacheEntryStatusToResponse(); 557*6777b538SAndroid Build Coastguard Worker 558*6777b538SAndroid Build Coastguard Worker // Logs histograms for this transaction. It is invoked when the transaction is 559*6777b538SAndroid Build Coastguard Worker // either complete or is done writing to entry and will continue in 560*6777b538SAndroid Build Coastguard Worker // network-only mode. 561*6777b538SAndroid Build Coastguard Worker void RecordHistograms(); 562*6777b538SAndroid Build Coastguard Worker 563*6777b538SAndroid Build Coastguard Worker // Returns true if this transaction is a member of entry_->writers. 564*6777b538SAndroid Build Coastguard Worker bool InWriters() const; 565*6777b538SAndroid Build Coastguard Worker 566*6777b538SAndroid Build Coastguard Worker // Called to signal completion of asynchronous IO. Note that this callback is 567*6777b538SAndroid Build Coastguard Worker // used in the conventional sense where one layer calls the callback of the 568*6777b538SAndroid Build Coastguard Worker // layer above it e.g. this callback gets called from the network transaction 569*6777b538SAndroid Build Coastguard Worker // layer. In addition, it is also used for HttpCache layer to let this 570*6777b538SAndroid Build Coastguard Worker // transaction know when it is out of a queued state in ActiveEntry and can 571*6777b538SAndroid Build Coastguard Worker // continue its processing. 572*6777b538SAndroid Build Coastguard Worker void OnIOComplete(int result); 573*6777b538SAndroid Build Coastguard Worker 574*6777b538SAndroid Build Coastguard Worker // Called to signal completion of an asynchronous HTTPCache operation. It 575*6777b538SAndroid Build Coastguard Worker // uses a separate callback from OnIoComplete so that cache transaction 576*6777b538SAndroid Build Coastguard Worker // operations and network IO can be run in parallel. 577*6777b538SAndroid Build Coastguard Worker void OnCacheIOComplete(int result); 578*6777b538SAndroid Build Coastguard Worker 579*6777b538SAndroid Build Coastguard Worker // When in a DoLoop, use this to set the next state as it verifies that the 580*6777b538SAndroid Build Coastguard Worker // state isn't set twice. 581*6777b538SAndroid Build Coastguard Worker void TransitionToState(State state); 582*6777b538SAndroid Build Coastguard Worker 583*6777b538SAndroid Build Coastguard Worker // Helper function to decide the next reading state. 584*6777b538SAndroid Build Coastguard Worker int TransitionToReadingState(); 585*6777b538SAndroid Build Coastguard Worker 586*6777b538SAndroid Build Coastguard Worker // Saves network transaction info using |transaction|. 587*6777b538SAndroid Build Coastguard Worker void SaveNetworkTransactionInfo(const HttpTransaction& transaction); 588*6777b538SAndroid Build Coastguard Worker 589*6777b538SAndroid Build Coastguard Worker // Determines whether caching should be disabled for a response, given its 590*6777b538SAndroid Build Coastguard Worker // headers. 591*6777b538SAndroid Build Coastguard Worker bool ShouldDisableCaching(const HttpResponseHeaders& headers) const; 592*6777b538SAndroid Build Coastguard Worker 593*6777b538SAndroid Build Coastguard Worker // 304 revalidations of resources that set security headers and that get 594*6777b538SAndroid Build Coastguard Worker // forwarded might need to set these headers again to avoid being blocked. 595*6777b538SAndroid Build Coastguard Worker void UpdateSecurityHeadersBeforeForwarding(); 596*6777b538SAndroid Build Coastguard Worker 597*6777b538SAndroid Build Coastguard Worker enum class DiskCacheAccessType { 598*6777b538SAndroid Build Coastguard Worker kRead, 599*6777b538SAndroid Build Coastguard Worker kWrite, 600*6777b538SAndroid Build Coastguard Worker }; 601*6777b538SAndroid Build Coastguard Worker void BeginDiskCacheAccessTimeCount(); 602*6777b538SAndroid Build Coastguard Worker void EndDiskCacheAccessTimeCount(DiskCacheAccessType type); 603*6777b538SAndroid Build Coastguard Worker 604*6777b538SAndroid Build Coastguard Worker State next_state_{STATE_NONE}; 605*6777b538SAndroid Build Coastguard Worker 606*6777b538SAndroid Build Coastguard Worker // Set when a HTTPCache transaction is pending in parallel with other IO. 607*6777b538SAndroid Build Coastguard Worker bool waiting_for_cache_io_ = false; 608*6777b538SAndroid Build Coastguard Worker 609*6777b538SAndroid Build Coastguard Worker // If a pending async HTTPCache transaction takes longer than the parallel 610*6777b538SAndroid Build Coastguard Worker // Network IO, this will store the result of the Network IO operation until 611*6777b538SAndroid Build Coastguard Worker // the cache transaction completes (or times out). 612*6777b538SAndroid Build Coastguard Worker std::optional<int> pending_io_result_ = std::nullopt; 613*6777b538SAndroid Build Coastguard Worker 614*6777b538SAndroid Build Coastguard Worker // Used for tracing. 615*6777b538SAndroid Build Coastguard Worker const uint64_t trace_id_; 616*6777b538SAndroid Build Coastguard Worker 617*6777b538SAndroid Build Coastguard Worker // Initial request with which Start() was invoked. 618*6777b538SAndroid Build Coastguard Worker raw_ptr<const HttpRequestInfo> initial_request_ = nullptr; 619*6777b538SAndroid Build Coastguard Worker 620*6777b538SAndroid Build Coastguard Worker // `custom_request_` is assigned to `request_` after allocation. It must be 621*6777b538SAndroid Build Coastguard Worker // declared before `request_` so that it will be destroyed afterwards to 622*6777b538SAndroid Build Coastguard Worker // prevent that pointer from dangling. 623*6777b538SAndroid Build Coastguard Worker std::unique_ptr<HttpRequestInfo> custom_request_; 624*6777b538SAndroid Build Coastguard Worker 625*6777b538SAndroid Build Coastguard Worker raw_ptr<const HttpRequestInfo> request_ = nullptr; 626*6777b538SAndroid Build Coastguard Worker 627*6777b538SAndroid Build Coastguard Worker std::string method_; 628*6777b538SAndroid Build Coastguard Worker RequestPriority priority_; 629*6777b538SAndroid Build Coastguard Worker NetLogWithSource net_log_; 630*6777b538SAndroid Build Coastguard Worker HttpRequestHeaders request_headers_copy_; 631*6777b538SAndroid Build Coastguard Worker // If extra_headers specified a "if-modified-since" or "if-none-match", 632*6777b538SAndroid Build Coastguard Worker // |external_validation_| contains the value of those headers. 633*6777b538SAndroid Build Coastguard Worker ValidationHeaders external_validation_; 634*6777b538SAndroid Build Coastguard Worker base::WeakPtr<HttpCache> cache_; 635*6777b538SAndroid Build Coastguard Worker scoped_refptr<HttpCache::ActiveEntry> entry_; 636*6777b538SAndroid Build Coastguard Worker // This field is not a raw_ptr<> because it was filtered by the rewriter for: 637*6777b538SAndroid Build Coastguard Worker // #addr-of 638*6777b538SAndroid Build Coastguard Worker scoped_refptr<HttpCache::ActiveEntry> new_entry_; 639*6777b538SAndroid Build Coastguard Worker std::unique_ptr<HttpTransaction> network_trans_; 640*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback_; // Consumer's callback. 641*6777b538SAndroid Build Coastguard Worker HttpResponseInfo response_; 642*6777b538SAndroid Build Coastguard Worker HttpResponseInfo auth_response_; 643*6777b538SAndroid Build Coastguard Worker 644*6777b538SAndroid Build Coastguard Worker // This is only populated when we want to modify a prefetch request in some 645*6777b538SAndroid Build Coastguard Worker // way for future transactions, while leaving it untouched for the current 646*6777b538SAndroid Build Coastguard Worker // one. DoCacheReadResponseComplete() sets this to a copy of |response_|, 647*6777b538SAndroid Build Coastguard Worker // and modifies the members for future transactions. Then, 648*6777b538SAndroid Build Coastguard Worker // WriteResponseInfoToEntry() writes |updated_prefetch_response_| to the cache 649*6777b538SAndroid Build Coastguard Worker // entry if it is populated, or |response_| otherwise. Finally, 650*6777b538SAndroid Build Coastguard Worker // WriteResponseInfoToEntry() resets this to std::nullopt. 651*6777b538SAndroid Build Coastguard Worker std::unique_ptr<HttpResponseInfo> updated_prefetch_response_; 652*6777b538SAndroid Build Coastguard Worker 653*6777b538SAndroid Build Coastguard Worker raw_ptr<const HttpResponseInfo, AcrossTasksDanglingUntriaged> new_response_ = 654*6777b538SAndroid Build Coastguard Worker nullptr; 655*6777b538SAndroid Build Coastguard Worker std::string cache_key_; 656*6777b538SAndroid Build Coastguard Worker Mode mode_ = NONE; 657*6777b538SAndroid Build Coastguard Worker bool reading_ = false; // We are already reading. Never reverts to 658*6777b538SAndroid Build Coastguard Worker // false once set. 659*6777b538SAndroid Build Coastguard Worker bool invalid_range_ = false; // We may bypass the cache for this request. 660*6777b538SAndroid Build Coastguard Worker bool truncated_ = false; // We don't have all the response data. 661*6777b538SAndroid Build Coastguard Worker bool is_sparse_ = false; // The data is stored in sparse byte ranges. 662*6777b538SAndroid Build Coastguard Worker bool range_requested_ = false; // The user requested a byte range. 663*6777b538SAndroid Build Coastguard Worker bool handling_206_ = false; // We must deal with this 206 response. 664*6777b538SAndroid Build Coastguard Worker bool cache_pending_ = false; // We are waiting for the HttpCache. 665*6777b538SAndroid Build Coastguard Worker 666*6777b538SAndroid Build Coastguard Worker // Headers have been received from the network and it's not a match with the 667*6777b538SAndroid Build Coastguard Worker // existing entry. 668*6777b538SAndroid Build Coastguard Worker bool done_headers_create_new_entry_ = false; 669*6777b538SAndroid Build Coastguard Worker 670*6777b538SAndroid Build Coastguard Worker bool vary_mismatch_ = false; // The request doesn't match the stored vary 671*6777b538SAndroid Build Coastguard Worker // data. 672*6777b538SAndroid Build Coastguard Worker bool couldnt_conditionalize_request_ = false; 673*6777b538SAndroid Build Coastguard Worker bool bypass_lock_for_test_ = false; // A test is exercising the cache lock. 674*6777b538SAndroid Build Coastguard Worker bool bypass_lock_after_headers_for_test_ = false; // A test is exercising the 675*6777b538SAndroid Build Coastguard Worker // cache lock. 676*6777b538SAndroid Build Coastguard Worker bool fail_conditionalization_for_test_ = 677*6777b538SAndroid Build Coastguard Worker false; // Fail ConditionalizeRequest. 678*6777b538SAndroid Build Coastguard Worker 679*6777b538SAndroid Build Coastguard Worker scoped_refptr<IOBuffer> read_buf_; 680*6777b538SAndroid Build Coastguard Worker 681*6777b538SAndroid Build Coastguard Worker // Length of the buffer passed in Read(). 682*6777b538SAndroid Build Coastguard Worker int read_buf_len_ = 0; 683*6777b538SAndroid Build Coastguard Worker 684*6777b538SAndroid Build Coastguard Worker int io_buf_len_ = 0; 685*6777b538SAndroid Build Coastguard Worker int read_offset_ = 0; 686*6777b538SAndroid Build Coastguard Worker int effective_load_flags_ = 0; 687*6777b538SAndroid Build Coastguard Worker std::unique_ptr<PartialData> partial_; // We are dealing with range requests. 688*6777b538SAndroid Build Coastguard Worker CompletionRepeatingCallback io_callback_; 689*6777b538SAndroid Build Coastguard Worker CompletionRepeatingCallback cache_io_callback_; // cache-specific IO callback 690*6777b538SAndroid Build Coastguard Worker base::RepeatingCallback<bool()> is_shared_dictionary_read_allowed_callback_; 691*6777b538SAndroid Build Coastguard Worker 692*6777b538SAndroid Build Coastguard Worker // Error code to be returned from a subsequent Read call if shared writing 693*6777b538SAndroid Build Coastguard Worker // failed in a separate transaction. 694*6777b538SAndroid Build Coastguard Worker int shared_writing_error_ = OK; 695*6777b538SAndroid Build Coastguard Worker 696*6777b538SAndroid Build Coastguard Worker // Members used to track data for histograms. 697*6777b538SAndroid Build Coastguard Worker // This cache_entry_status_ takes precedence over 698*6777b538SAndroid Build Coastguard Worker // response_.cache_entry_status. In fact, response_.cache_entry_status must be 699*6777b538SAndroid Build Coastguard Worker // kept in sync with cache_entry_status_ (via SetResponse and 700*6777b538SAndroid Build Coastguard Worker // UpdateCacheEntryStatus). 701*6777b538SAndroid Build Coastguard Worker HttpResponseInfo::CacheEntryStatus cache_entry_status_ = 702*6777b538SAndroid Build Coastguard Worker HttpResponseInfo::CacheEntryStatus::ENTRY_UNDEFINED; 703*6777b538SAndroid Build Coastguard Worker ValidationCause validation_cause_ = VALIDATION_CAUSE_UNDEFINED; 704*6777b538SAndroid Build Coastguard Worker base::TimeTicks entry_lock_waiting_since_; 705*6777b538SAndroid Build Coastguard Worker base::TimeTicks first_cache_access_since_; 706*6777b538SAndroid Build Coastguard Worker base::TimeTicks send_request_since_; 707*6777b538SAndroid Build Coastguard Worker base::TimeTicks read_headers_since_; 708*6777b538SAndroid Build Coastguard Worker base::Time open_entry_last_used_; 709*6777b538SAndroid Build Coastguard Worker base::TimeTicks last_disk_cache_access_start_time_; 710*6777b538SAndroid Build Coastguard Worker base::TimeDelta total_disk_cache_read_time_; 711*6777b538SAndroid Build Coastguard Worker base::TimeDelta total_disk_cache_write_time_; 712*6777b538SAndroid Build Coastguard Worker bool recorded_histograms_ = false; 713*6777b538SAndroid Build Coastguard Worker bool has_opened_or_created_entry_ = false; 714*6777b538SAndroid Build Coastguard Worker bool record_entry_open_or_creation_time_ = false; 715*6777b538SAndroid Build Coastguard Worker 716*6777b538SAndroid Build Coastguard Worker NetworkTransactionInfo network_transaction_info_; 717*6777b538SAndroid Build Coastguard Worker 718*6777b538SAndroid Build Coastguard Worker // True if this transaction created the network transaction that is now being 719*6777b538SAndroid Build Coastguard Worker // used by writers. This is used to check that only this transaction should 720*6777b538SAndroid Build Coastguard Worker // account for the network bytes and other statistics of the network 721*6777b538SAndroid Build Coastguard Worker // transaction. 722*6777b538SAndroid Build Coastguard Worker // TODO(shivanisha) Note that if this transaction dies mid-way and there are 723*6777b538SAndroid Build Coastguard Worker // other writer transactions, no transaction then accounts for those 724*6777b538SAndroid Build Coastguard Worker // statistics. 725*6777b538SAndroid Build Coastguard Worker bool moved_network_transaction_to_writers_ = false; 726*6777b538SAndroid Build Coastguard Worker 727*6777b538SAndroid Build Coastguard Worker // The helper object to use to create WebSocketHandshakeStreamBase 728*6777b538SAndroid Build Coastguard Worker // objects. Only relevant when establishing a WebSocket connection. 729*6777b538SAndroid Build Coastguard Worker // This is passed to the underlying network transaction. It is stored here in 730*6777b538SAndroid Build Coastguard Worker // case the transaction does not exist yet. 731*6777b538SAndroid Build Coastguard Worker raw_ptr<WebSocketHandshakeStreamBase::CreateHelper> 732*6777b538SAndroid Build Coastguard Worker websocket_handshake_stream_base_create_helper_ = nullptr; 733*6777b538SAndroid Build Coastguard Worker 734*6777b538SAndroid Build Coastguard Worker BeforeNetworkStartCallback before_network_start_callback_; 735*6777b538SAndroid Build Coastguard Worker ConnectedCallback connected_callback_; 736*6777b538SAndroid Build Coastguard Worker RequestHeadersCallback request_headers_callback_; 737*6777b538SAndroid Build Coastguard Worker ResponseHeadersCallback early_response_headers_callback_; 738*6777b538SAndroid Build Coastguard Worker ResponseHeadersCallback response_headers_callback_; 739*6777b538SAndroid Build Coastguard Worker 740*6777b538SAndroid Build Coastguard Worker // True if the Transaction is currently processing the DoLoop. 741*6777b538SAndroid Build Coastguard Worker bool in_do_loop_ = false; 742*6777b538SAndroid Build Coastguard Worker 743*6777b538SAndroid Build Coastguard Worker base::WeakPtrFactory<Transaction> weak_factory_{this}; 744*6777b538SAndroid Build Coastguard Worker }; 745*6777b538SAndroid Build Coastguard Worker 746*6777b538SAndroid Build Coastguard Worker } // namespace net 747*6777b538SAndroid Build Coastguard Worker 748*6777b538SAndroid Build Coastguard Worker #endif // NET_HTTP_HTTP_CACHE_TRANSACTION_H_ 749