xref: /aosp_15_r20/external/cronet/net/http/http_cache_transaction.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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