| Index: net/http/http_cache_transaction.h
|
| diff --git a/net/http/http_cache_transaction.h b/net/http/http_cache_transaction.h
|
| index 51c0db70256cbd31505ca20ffba6486ab4c36aad..080d8b923bffea7c40e20dfaf7ddbe10c608f234 100644
|
| --- a/net/http/http_cache_transaction.h
|
| +++ b/net/http/http_cache_transaction.h
|
| @@ -80,6 +80,8 @@ class HttpCache::Transaction : public HttpTransaction {
|
|
|
| Mode mode() const { return mode_; }
|
|
|
| + std::string& method() { return method_; }
|
| +
|
| const std::string& key() const { return cache_key_; }
|
|
|
| // Writes |buf_len| bytes of meta-data from the provided buffer |buf|. to the
|
| @@ -104,8 +106,10 @@ class HttpCache::Transaction : public HttpTransaction {
|
| // This transaction is being deleted and we are not done writing to the cache.
|
| // We need to indicate that the response data was truncated. Returns true on
|
| // success. Keep in mind that this operation may have side effects, such as
|
| - // deleting the active entry.
|
| - bool AddTruncatedFlag();
|
| + // deleting the active entry. This also returns success if the response was
|
| + // completely written, |*did_truncate| will be set to true if it was actually
|
| + // truncated.
|
| + bool AddTruncatedFlag(bool* did_truncate);
|
|
|
| HttpCache::ActiveEntry* entry() { return entry_; }
|
|
|
| @@ -164,6 +168,10 @@ class HttpCache::Transaction : public HttpTransaction {
|
| int ResumeNetworkStart() override;
|
| void GetConnectionAttempts(ConnectionAttempts* out) const override;
|
|
|
| + // Invoked when parallel validation cannot proceed due to response failure
|
| + // and this transaction needs to be restarted.
|
| + void SetValidatingCannotProceed();
|
| +
|
| // Returns the estimate of dynamically allocated memory in bytes.
|
| size_t EstimateMemoryUsage() const;
|
|
|
| @@ -178,6 +186,14 @@ class HttpCache::Transaction : public HttpTransaction {
|
| bool initialized;
|
| };
|
|
|
| + // A snapshot of pieces of the transaction before entering the state machine
|
| + // so that the state can be restored when restarting the state machine.
|
| + struct RestartInfo {
|
| + Mode mode = NONE;
|
| + HttpResponseInfo::CacheEntryStatus cache_entry_status =
|
| + HttpResponseInfo::CacheEntryStatus::ENTRY_UNDEFINED;
|
| + };
|
| +
|
| enum State {
|
| STATE_UNSET,
|
|
|
| @@ -220,6 +236,9 @@ class HttpCache::Transaction : public HttpTransaction {
|
| STATE_PARTIAL_HEADERS_RECEIVED,
|
| STATE_CACHE_READ_METADATA,
|
| STATE_CACHE_READ_METADATA_COMPLETE,
|
| + STATE_HEADERS_PHASE_CANNOT_PROCEED,
|
| + STATE_FINISH_HEADERS,
|
| + STATE_FINISH_HEADERS_COMPLETE,
|
|
|
| // These states are entered from Read/AddTruncatedFlag.
|
| STATE_NETWORK_READ,
|
| @@ -288,6 +307,9 @@ class HttpCache::Transaction : public HttpTransaction {
|
| int DoPartialHeadersReceived();
|
| int DoCacheReadMetadata();
|
| int DoCacheReadMetadataComplete(int result);
|
| + int DoHeadersPhaseCannotProceed();
|
| + int DoFinishHeaders(int result);
|
| + int DoFinishHeadersComplete(int result);
|
| int DoNetworkRead();
|
| int DoNetworkReadComplete(int result);
|
| int DoCacheReadData();
|
| @@ -430,7 +452,12 @@ class HttpCache::Transaction : public HttpTransaction {
|
| void SyncCacheEntryStatusToResponse();
|
| void RecordHistograms();
|
|
|
| - // Called to signal completion of asynchronous IO.
|
| + // Called to signal completion of asynchronous IO. Note that this callback is
|
| + // used in the conventional sense where one layer calls the callback of the
|
| + // layer above it e.g. this callback gets called from the network transaction
|
| + // layer. In addition, it is also used for HttpCache layer to let this
|
| + // transaction know when it is out of a queued state in ActiveEntry and can
|
| + // continue its processing.
|
| void OnIOComplete(int result);
|
|
|
| // When in a DoLoop, use this to set the next state as it verifies that the
|
| @@ -439,6 +466,7 @@ class HttpCache::Transaction : public HttpTransaction {
|
|
|
| State next_state_;
|
| const HttpRequestInfo* request_;
|
| + std::string method_;
|
| RequestPriority priority_;
|
| NetLogWithSource net_log_;
|
| std::unique_ptr<HttpRequestInfo> custom_request_;
|
| @@ -514,6 +542,12 @@ class HttpCache::Transaction : public HttpTransaction {
|
| // True if the Transaction is currently processing the DoLoop.
|
| bool in_do_loop_;
|
|
|
| + // Used to restore some members when the state machine is restarted after it
|
| + // has already been added to an entry e.g after |this| has completed
|
| + // validation and the writer transaction fails to completely write the
|
| + // response to the cache.
|
| + RestartInfo restart_info_;
|
| +
|
| base::WeakPtrFactory<Transaction> weak_factory_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(Transaction);
|
|
|