Index: net/http/http_cache_transaction.h |
diff --git a/net/http/http_cache_transaction.h b/net/http/http_cache_transaction.h |
index 2d249c1eda028c6329ed2edc603bfc2f4064a082..5d74ad2acb3925a0e3629d94f43da8c7091147d9 100644 |
--- a/net/http/http_cache_transaction.h |
+++ b/net/http/http_cache_transaction.h |
@@ -163,6 +163,7 @@ class HttpCache::Transaction : public HttpTransaction { |
const BeforeHeadersSentCallback& callback) override; |
int ResumeNetworkStart() override; |
void GetConnectionAttempts(ConnectionAttempts* out) const override; |
+ void SetValidatingCannotProceed(); |
// Returns the estimate of dynamically allocated memory in bytes. |
size_t EstimateMemoryUsage() const; |
@@ -218,6 +219,8 @@ class HttpCache::Transaction : public HttpTransaction { |
STATE_PARTIAL_HEADERS_RECEIVED, |
STATE_CACHE_READ_METADATA, |
STATE_CACHE_READ_METADATA_COMPLETE, |
+ STATE_WAIT_BEFORE_READ, |
+ STATE_WAIT_BEFORE_READ_COMPLETE, |
// These states are entered from Read/AddTruncatedFlag. |
STATE_NETWORK_READ, |
@@ -245,6 +248,7 @@ class HttpCache::Transaction : public HttpTransaction { |
// Runs the state transition loop. Resets and calls |callback_| on exit, |
// unless the return value is ERR_IO_PENDING. |
int DoLoop(int result); |
+ int DoLoopImpl(int result); |
// Each of these methods corresponds to a State value. If there is an |
// argument, the value corresponds to the return of the previous state or |
@@ -284,6 +288,8 @@ class HttpCache::Transaction : public HttpTransaction { |
int DoTruncateCachedMetadata(); |
int DoTruncateCachedMetadataComplete(int result); |
int DoPartialHeadersReceived(); |
+ int DoWaitBeforeRead(); |
+ int DoWaitBeforeReadComplete(int result); |
int DoCacheReadMetadata(); |
int DoCacheReadMetadataComplete(int result); |
int DoNetworkRead(); |
@@ -412,6 +418,13 @@ class HttpCache::Transaction : public HttpTransaction { |
// |old_network_trans_load_timing_|, which must be NULL when this is called. |
void ResetNetworkTransaction(); |
+ // Since a transaction could be doing validation of request headers in |
+ // parallel with another request writing response data to the entry, failure |
+ // to write the data might lead to restarting this request. This function |
+ // resets all the required variables to be able to restart the transaction's |
+ // state machine. |
+ void RestartAfterValidationStarted(); |
+ |
// Returns true if we should bother attempting to resume this request if it is |
// aborted while in progress. If |has_data| is true, the size of the stored |
// data is considered for the result. |
@@ -451,6 +464,7 @@ class HttpCache::Transaction : public HttpTransaction { |
const HttpResponseInfo* new_response_; |
std::string cache_key_; |
Mode mode_; |
+ Mode original_mode_; // Used when restarting the transaction. |
bool reading_; // We are already reading. Never reverts to false once set. |
bool invalid_range_; // We may bypass the cache for this request. |
bool truncated_; // We don't have all the response data. |
@@ -463,6 +477,7 @@ class HttpCache::Transaction : public HttpTransaction { |
bool couldnt_conditionalize_request_; |
bool bypass_lock_for_test_; // A test is exercising the cache lock. |
bool fail_conditionalization_for_test_; // Fail ConditionalizeRequest. |
+ bool validating_cannot_proceed_; |
scoped_refptr<IOBuffer> read_buf_; |
int io_buf_len_; |
int read_offset_; |