OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // This file declares HttpCache::Transaction, a private class of HttpCache so | 5 // This file declares HttpCache::Transaction, a private class of HttpCache so |
6 // it should only be included by http_cache.cc | 6 // it should only be included by http_cache.cc |
7 | 7 |
8 #ifndef NET_HTTP_HTTP_CACHE_TRANSACTION_H_ | 8 #ifndef NET_HTTP_HTTP_CACHE_TRANSACTION_H_ |
9 #define NET_HTTP_HTTP_CACHE_TRANSACTION_H_ | 9 #define NET_HTTP_HTTP_CACHE_TRANSACTION_H_ |
10 | 10 |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
205 STATE_CACHE_WRITE_RESPONSE, | 205 STATE_CACHE_WRITE_RESPONSE, |
206 STATE_CACHE_WRITE_RESPONSE_COMPLETE, | 206 STATE_CACHE_WRITE_RESPONSE_COMPLETE, |
207 STATE_TRUNCATE_CACHED_DATA, | 207 STATE_TRUNCATE_CACHED_DATA, |
208 STATE_TRUNCATE_CACHED_DATA_COMPLETE, | 208 STATE_TRUNCATE_CACHED_DATA_COMPLETE, |
209 STATE_TRUNCATE_CACHED_METADATA, | 209 STATE_TRUNCATE_CACHED_METADATA, |
210 STATE_TRUNCATE_CACHED_METADATA_COMPLETE, | 210 STATE_TRUNCATE_CACHED_METADATA_COMPLETE, |
211 STATE_PARTIAL_HEADERS_RECEIVED, | 211 STATE_PARTIAL_HEADERS_RECEIVED, |
212 STATE_CACHE_READ_METADATA, | 212 STATE_CACHE_READ_METADATA, |
213 STATE_CACHE_READ_METADATA_COMPLETE, | 213 STATE_CACHE_READ_METADATA_COMPLETE, |
214 | 214 |
215 // These states are entered from Read/AddTruncatedFlag. | 215 // These states are entered from Read. |
| 216 STATE_SWITCH_TO_NETWORK, |
216 STATE_NETWORK_READ, | 217 STATE_NETWORK_READ, |
217 STATE_NETWORK_READ_COMPLETE, | 218 STATE_NETWORK_READ_COMPLETE, |
218 STATE_CACHE_READ_DATA, | 219 STATE_CACHE_READ_DATA, |
219 STATE_CACHE_READ_DATA_COMPLETE, | 220 STATE_CACHE_READ_DATA_COMPLETE, |
220 STATE_CACHE_WRITE_DATA, | 221 STATE_CACHE_WRITE_DATA, |
221 STATE_CACHE_WRITE_DATA_COMPLETE, | 222 STATE_CACHE_WRITE_DATA_COMPLETE, |
222 STATE_CACHE_WRITE_TRUNCATED_RESPONSE, | |
223 STATE_CACHE_WRITE_TRUNCATED_RESPONSE_COMPLETE | |
224 }; | 223 }; |
225 | 224 |
226 // Used for categorizing transactions for reporting in histograms. Patterns | 225 // Used for categorizing transactions for reporting in histograms. Patterns |
227 // cover relatively common use cases being measured and considered for | 226 // cover relatively common use cases being measured and considered for |
228 // optimization. Many use cases that are more complex or uncommon are binned | 227 // optimization. Many use cases that are more complex or uncommon are binned |
229 // as PATTERN_NOT_COVERED, and details are not reported. | 228 // as PATTERN_NOT_COVERED, and details are not reported. |
230 // NOTE: This enumeration is used in histograms, so please do not add entries | 229 // NOTE: This enumeration is used in histograms, so please do not add entries |
231 // in the middle. | 230 // in the middle. |
232 enum TransactionPattern { | 231 enum TransactionPattern { |
233 PATTERN_UNDEFINED, | 232 PATTERN_UNDEFINED, |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
277 int DoOverwriteCachedResponse(); | 276 int DoOverwriteCachedResponse(); |
278 int DoCacheWriteResponse(); | 277 int DoCacheWriteResponse(); |
279 int DoCacheWriteResponseComplete(int result); | 278 int DoCacheWriteResponseComplete(int result); |
280 int DoTruncateCachedData(); | 279 int DoTruncateCachedData(); |
281 int DoTruncateCachedDataComplete(int result); | 280 int DoTruncateCachedDataComplete(int result); |
282 int DoTruncateCachedMetadata(); | 281 int DoTruncateCachedMetadata(); |
283 int DoTruncateCachedMetadataComplete(int result); | 282 int DoTruncateCachedMetadataComplete(int result); |
284 int DoPartialHeadersReceived(); | 283 int DoPartialHeadersReceived(); |
285 int DoCacheReadMetadata(); | 284 int DoCacheReadMetadata(); |
286 int DoCacheReadMetadataComplete(int result); | 285 int DoCacheReadMetadataComplete(int result); |
| 286 int DoSwitchToNetwork(); |
287 int DoNetworkRead(); | 287 int DoNetworkRead(); |
288 int DoNetworkReadComplete(int result); | 288 int DoNetworkReadComplete(int result); |
289 int DoCacheReadData(); | 289 int DoCacheReadData(); |
290 int DoCacheReadDataComplete(int result); | 290 int DoCacheReadDataComplete(int result); |
291 int DoCacheWriteData(int num_bytes); | 291 int DoCacheWriteData(int num_bytes); |
292 int DoCacheWriteDataComplete(int result); | 292 int DoCacheWriteDataComplete(int result); |
293 int DoCacheWriteTruncatedResponse(); | |
294 int DoCacheWriteTruncatedResponseComplete(int result); | |
295 | 293 |
296 // These functions are involved in a field trial testing storing certificates | 294 // These functions are involved in a field trial testing storing certificates |
297 // in seperate entries from the HttpResponseInfo. | 295 // in seperate entries from the HttpResponseInfo. |
298 void ReadCertChain(); | 296 void ReadCertChain(); |
299 void WriteCertChain(); | 297 void WriteCertChain(); |
300 | 298 |
301 // Sets request_ and fields derived from it. | 299 // Sets request_ and fields derived from it. |
302 void SetRequest(const BoundNetLog& net_log, const HttpRequestInfo* request); | 300 void SetRequest(const BoundNetLog& net_log, const HttpRequestInfo* request); |
303 | 301 |
304 // Returns true if the request should be handled exclusively by the network | 302 // Returns true if the request should be handled exclusively by the network |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
359 // Setups the transaction for reading from the cache entry. | 357 // Setups the transaction for reading from the cache entry. |
360 int SetupEntryForRead(); | 358 int SetupEntryForRead(); |
361 | 359 |
362 // Called to write data to the cache entry. If the write fails, then the | 360 // Called to write data to the cache entry. If the write fails, then the |
363 // cache entry is destroyed. Future calls to this function will just do | 361 // cache entry is destroyed. Future calls to this function will just do |
364 // nothing without side-effect. Returns a network error code. | 362 // nothing without side-effect. Returns a network error code. |
365 int WriteToEntry(int index, int offset, IOBuffer* data, int data_len, | 363 int WriteToEntry(int index, int offset, IOBuffer* data, int data_len, |
366 const CompletionCallback& callback); | 364 const CompletionCallback& callback); |
367 | 365 |
368 // Called to write response_ to the cache entry. |truncated| indicates if the | 366 // Called to write response_ to the cache entry. |truncated| indicates if the |
369 // entry should be marked as incomplete. | 367 // entry should be marked as incomplete. Returns ERR_IO_PENDING if an |
370 int WriteResponseInfoToEntry(bool truncated); | 368 // operation is pending. Once |callback| is invoked, the caller should call |
| 369 // OnWriteResponseInfoToEntryComplete() with the result to complete the |
| 370 // write operation. |
| 371 int WriteResponseInfoToEntry(bool truncated, |
| 372 const CompletionCallback& callback); |
371 | 373 |
372 // Helper function, should be called with result of WriteResponseInfoToEntry | 374 // Helper function, should be called with result of WriteResponseInfoToEntry |
373 // (or the result of the callback, when WriteResponseInfoToEntry returns | 375 // (or the result of the callback, when WriteResponseInfoToEntry returns |
374 // ERR_IO_PENDING). Calls DoneWritingToEntry if |result| is not the right | 376 // ERR_IO_PENDING). Calls ReleaseCacheEntry() to doom the entry if the number |
375 // number of bytes. It is expected that the state that calls this will | 377 // of bytes written is less than expected. It is expected that the state that |
376 // return whatever net error code this function returns, which currently | 378 // calls this will return whatever net error code this function returns, which |
377 // is always "OK". | 379 // currently is always "OK". |
378 int OnWriteResponseInfoToEntryComplete(int result); | 380 int OnWriteResponseInfoToEntryComplete(int result); |
379 | 381 |
| 382 // Releases the cache entry. The |entry_state| parameter specifies the state |
| 383 // of the entry following the release. |
| 384 void ReleaseCacheEntry(EntryState entry_state); |
| 385 |
380 // Called when we are done writing to the cache entry. | 386 // Called when we are done writing to the cache entry. |
381 void DoneWritingToEntry(bool success); | 387 void DoneWritingToEntry(bool success); |
382 | 388 |
383 // Returns an error to signal the caller that the current read failed. The | 389 // Returns an error to signal the caller that the current read failed. The |
384 // current operation |result| is also logged. If |restart| is true, the | 390 // current operation |result| is also logged. If |restart| is true, the |
385 // transaction should be restarted. | 391 // transaction should be restarted. |
386 int OnCacheReadError(int result, bool restart); | 392 int OnCacheReadError(int result, bool restart); |
387 | 393 |
388 // Called when the cache lock timeout fires. | 394 // Called when the cache lock timeout fires. |
389 void OnAddToEntryTimeout(base::TimeTicks start_time); | 395 void OnAddToEntryTimeout(base::TimeTicks start_time); |
390 | 396 |
391 // Deletes the current partial cache entry (sparse), and optionally removes | 397 // Deletes the current partial cache entry (sparse), and optionally removes |
392 // the control object (partial_). | 398 // the control object (partial_). |
393 void DoomPartialEntry(bool delete_object); | 399 void DoomPartialEntry(bool delete_object); |
394 | 400 |
395 // Performs the needed work after receiving data from the network, when | 401 // Performs the needed work after receiving data from the network, when |
396 // working with range requests. | 402 // working with range requests. |
397 int DoPartialNetworkReadCompleted(int result); | 403 int DoPartialNetworkReadCompleted(int result); |
398 | 404 |
399 // Performs the needed work after receiving data from the cache, when | 405 // Performs the needed work after receiving data from the cache, when |
400 // working with range requests. | 406 // working with range requests. |
401 int DoPartialCacheReadCompleted(int result); | 407 int DoPartialCacheReadCompleted(int result); |
402 | 408 |
403 // Restarts this transaction after deleting the cached data. It is meant to | 409 // Restarts this transaction after deleting the cached data. It is meant to |
404 // be used when the current request cannot be fulfilled due to conflicts | 410 // be used when the current request cannot be fulfilled due to conflicts |
405 // between the byte range request and the cached entry. | 411 // between the byte range request and the cached entry. |
406 int DoRestartPartialRequest(); | 412 int DoRestartPartialRequest(); |
407 | 413 |
| 414 void OnCacheReleaseComplete(const base::Closure& closure, int result); |
| 415 |
408 // Resets the relavant internal state to remove traces of internal processing | 416 // Resets the relavant internal state to remove traces of internal processing |
409 // related to range requests. Deletes |partial_| if |delete_object| is true. | 417 // related to range requests. Deletes |partial_| if |delete_object| is true. |
410 void ResetPartialState(bool delete_object); | 418 void ResetPartialState(bool delete_object); |
411 | 419 |
412 // Resets |network_trans_|, which must be non-NULL. Also updates | 420 // Resets |network_trans_|, which must be non-NULL. Also updates |
413 // |old_network_trans_load_timing_|, which must be NULL when this is called. | 421 // |old_network_trans_load_timing_|, which must be NULL when this is called. |
414 void ResetNetworkTransaction(); | 422 void ResetNetworkTransaction(); |
415 | 423 |
416 // Returns true if we should bother attempting to resume this request if it | 424 // Returns true if we should bother attempting to resume this request if it |
417 // is aborted while in progress. If |has_data| is true, the size of the stored | 425 // is aborted while in progress. If |has_data| is true, the size of the stored |
418 // data is considered for the result. | 426 // data is considered for the result. |
419 bool CanResume(bool has_data); | 427 bool CanResume(bool has_data); |
420 | 428 |
421 void UpdateTransactionPattern(TransactionPattern new_transaction_pattern); | 429 void UpdateTransactionPattern(TransactionPattern new_transaction_pattern); |
422 void RecordHistograms(); | 430 void RecordHistograms(); |
423 | 431 |
424 // Called to signal completion of asynchronous IO. | 432 // Called to signal completion of asynchronous IO. |
425 void OnIOComplete(int result); | 433 void OnIOComplete(int result); |
426 | 434 |
| 435 // Abandons a cache entry. |
| 436 // |
| 437 // This should be called when the transaction abnormally terminates writing to |
| 438 // a cache entry. Once called, the cache entry could be either retained or |
| 439 // truncated or destroyed depending on whether the full response entity was |
| 440 // written to the cache or whether the partial cache entry can be fulfiled |
| 441 // later by resuming the network request. |
| 442 // |
| 443 // If any asynchronous operations are pending, returns ERR_IO_PENDING and |
| 444 // invokes |callback| when the opearations are complete. entry_ is always |
| 445 // released upon completion. |
| 446 // |
| 447 // If |callback| is empty, then releases the cache entry synchronously. It is |
| 448 // possible for the cache entry to be in an indeterminate state in this case. |
| 449 int AbandonCacheEntry(const CompletionCallback& callback); |
| 450 |
| 451 // Called to signal IO completion for AbandonCacheEntry(). |
| 452 void OnAbandonCacheEntryIOComplete(int result); |
| 453 |
427 State next_state_; | 454 State next_state_; |
428 const HttpRequestInfo* request_; | 455 const HttpRequestInfo* request_; |
429 RequestPriority priority_; | 456 RequestPriority priority_; |
430 BoundNetLog net_log_; | 457 BoundNetLog net_log_; |
431 scoped_ptr<HttpRequestInfo> custom_request_; | 458 scoped_ptr<HttpRequestInfo> custom_request_; |
432 HttpRequestHeaders request_headers_copy_; | 459 HttpRequestHeaders request_headers_copy_; |
433 // If extra_headers specified a "if-modified-since" or "if-none-match", | 460 // If extra_headers specified a "if-modified-since" or "if-none-match", |
434 // |external_validation_| contains the value of those headers. | 461 // |external_validation_| contains the value of those headers. |
435 ValidationHeaders external_validation_; | 462 ValidationHeaders external_validation_; |
436 base::WeakPtr<HttpCache> cache_; | 463 base::WeakPtr<HttpCache> cache_; |
437 HttpCache::ActiveEntry* entry_; | 464 HttpCache::ActiveEntry* entry_; |
438 HttpCache::ActiveEntry* new_entry_; | 465 HttpCache::ActiveEntry* new_entry_; |
439 scoped_ptr<HttpTransaction> network_trans_; | 466 scoped_ptr<HttpTransaction> network_trans_; |
440 CompletionCallback callback_; // Consumer's callback. | 467 CompletionCallback callback_; // Consumer's callback. |
441 HttpResponseInfo response_; | 468 HttpResponseInfo response_; |
442 HttpResponseInfo auth_response_; | 469 HttpResponseInfo auth_response_; |
443 const HttpResponseInfo* new_response_; | 470 const HttpResponseInfo* new_response_; |
444 std::string cache_key_; | 471 std::string cache_key_; |
445 Mode mode_; | 472 Mode mode_; |
446 bool reading_; // We are already reading. Never reverts to false once set. | 473 bool reading_; // We are already reading. Never reverts to false once set. |
447 bool invalid_range_; // We may bypass the cache for this request. | 474 bool invalid_range_; // We may bypass the cache for this request. |
448 bool truncated_; // We don't have all the response data. | 475 bool truncated_; // We don't have all the response data. |
449 bool is_sparse_; // The data is stored in sparse byte ranges. | 476 bool is_sparse_; // The data is stored in sparse byte ranges. |
450 bool range_requested_; // The user requested a byte range. | 477 bool range_requested_; // The user requested a byte range. |
451 bool handling_206_; // We must deal with this 206 response. | 478 bool handling_206_; // We must deal with this 206 response. |
452 bool cache_pending_; // We are waiting for the HttpCache. | 479 bool cache_pending_; // We are waiting for the HttpCache. |
453 bool done_reading_; // All available data was read. | 480 bool done_reading_; // All available data was written to the cache entry. |
454 bool vary_mismatch_; // The request doesn't match the stored vary data. | 481 bool vary_mismatch_; // The request doesn't match the stored vary data. |
455 bool couldnt_conditionalize_request_; | 482 bool couldnt_conditionalize_request_; |
| 483 bool stopped_caching_; // Avoid further writes to the cache. |
456 bool bypass_lock_for_test_; // A test is exercising the cache lock. | 484 bool bypass_lock_for_test_; // A test is exercising the cache lock. |
457 bool fail_conditionalization_for_test_; // Fail ConditionalizeRequest. | 485 bool fail_conditionalization_for_test_; // Fail ConditionalizeRequest. |
458 scoped_refptr<IOBuffer> read_buf_; | 486 scoped_refptr<IOBuffer> read_buf_; |
| 487 int read_buf_len_; |
459 int io_buf_len_; | 488 int io_buf_len_; |
460 int read_offset_; | 489 int read_offset_; |
461 int effective_load_flags_; | 490 int effective_load_flags_; |
462 int write_len_; | 491 int write_len_; |
463 scoped_ptr<PartialData> partial_; // We are dealing with range requests. | 492 scoped_ptr<PartialData> partial_; // We are dealing with range requests. |
464 UploadProgress final_upload_progress_; | 493 UploadProgress final_upload_progress_; |
465 CompletionCallback io_callback_; | 494 CompletionCallback io_callback_; |
466 | 495 |
| 496 // Completion callback for AbandonCacheEntry(). |
| 497 CompletionCallback abandon_cache_entry_callback_; |
| 498 |
467 // Members used to track data for histograms. | 499 // Members used to track data for histograms. |
468 TransactionPattern transaction_pattern_; | 500 TransactionPattern transaction_pattern_; |
469 base::TimeTicks entry_lock_waiting_since_; | 501 base::TimeTicks entry_lock_waiting_since_; |
470 base::TimeTicks first_cache_access_since_; | 502 base::TimeTicks first_cache_access_since_; |
471 base::TimeTicks send_request_since_; | 503 base::TimeTicks send_request_since_; |
472 | 504 |
473 int64 total_received_bytes_; | 505 int64 total_received_bytes_; |
474 int64_t total_sent_bytes_; | 506 int64_t total_sent_bytes_; |
475 | 507 |
476 // Load timing information for the last network request, if any. Set in the | 508 // Load timing information for the last network request, if any. Set in the |
(...skipping 14 matching lines...) Expand all Loading... |
491 BeforeProxyHeadersSentCallback before_proxy_headers_sent_callback_; | 523 BeforeProxyHeadersSentCallback before_proxy_headers_sent_callback_; |
492 | 524 |
493 base::WeakPtrFactory<Transaction> weak_factory_; | 525 base::WeakPtrFactory<Transaction> weak_factory_; |
494 | 526 |
495 DISALLOW_COPY_AND_ASSIGN(Transaction); | 527 DISALLOW_COPY_AND_ASSIGN(Transaction); |
496 }; | 528 }; |
497 | 529 |
498 } // namespace net | 530 } // namespace net |
499 | 531 |
500 #endif // NET_HTTP_HTTP_CACHE_TRANSACTION_H_ | 532 #endif // NET_HTTP_HTTP_CACHE_TRANSACTION_H_ |
OLD | NEW |