Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 #include "net/http/http_cache_transaction.h" | 5 #include "net/http/http_cache_transaction.h" |
| 6 | 6 |
| 7 #include "build/build_config.h" | 7 #include "build/build_config.h" |
| 8 | 8 |
| 9 #if defined(OS_POSIX) | 9 #if defined(OS_POSIX) |
| 10 #include <unistd.h> | 10 #include <unistd.h> |
| 11 #endif | 11 #endif |
| 12 | 12 |
| 13 #include <string> | 13 #include <string> |
| 14 | 14 |
| 15 #include "base/compiler_specific.h" | 15 #include "base/compiler_specific.h" |
| 16 #include "base/metrics/field_trial.h" | 16 #include "base/metrics/field_trial.h" |
| 17 #include "base/metrics/histogram.h" | 17 #include "base/metrics/histogram.h" |
| 18 #include "base/ref_counted.h" | 18 #include "base/ref_counted.h" |
| 19 #include "base/string_util.h" | 19 #include "base/string_util.h" |
| 20 #include "base/time.h" | 20 #include "base/time.h" |
| 21 #include "base/values.h" | |
| 21 #include "net/base/cert_status_flags.h" | 22 #include "net/base/cert_status_flags.h" |
| 22 #include "net/base/io_buffer.h" | 23 #include "net/base/io_buffer.h" |
| 23 #include "net/base/load_flags.h" | 24 #include "net/base/load_flags.h" |
| 24 #include "net/base/net_errors.h" | 25 #include "net/base/net_errors.h" |
| 25 #include "net/base/net_log.h" | 26 #include "net/base/net_log.h" |
| 26 #include "net/base/ssl_cert_request_info.h" | 27 #include "net/base/ssl_cert_request_info.h" |
| 27 #include "net/base/ssl_config_service.h" | 28 #include "net/base/ssl_config_service.h" |
| 28 #include "net/disk_cache/disk_cache.h" | 29 #include "net/disk_cache/disk_cache.h" |
| 29 #include "net/http/disk_cache_based_ssl_host_info.h" | 30 #include "net/http/disk_cache_based_ssl_host_info.h" |
| 30 #include "net/http/http_request_info.h" | 31 #include "net/http/http_request_info.h" |
| (...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 378 } | 379 } |
| 379 | 380 |
| 380 LoadState HttpCache::Transaction::GetWriterLoadState() const { | 381 LoadState HttpCache::Transaction::GetWriterLoadState() const { |
| 381 if (network_trans_.get()) | 382 if (network_trans_.get()) |
| 382 return network_trans_->GetLoadState(); | 383 return network_trans_->GetLoadState(); |
| 383 if (entry_ || !request_) | 384 if (entry_ || !request_) |
| 384 return LOAD_STATE_IDLE; | 385 return LOAD_STATE_IDLE; |
| 385 return LOAD_STATE_WAITING_FOR_CACHE; | 386 return LOAD_STATE_WAITING_FOR_CACHE; |
| 386 } | 387 } |
| 387 | 388 |
| 389 const BoundNetLog& HttpCache::Transaction::net_log() const { | |
| 390 return net_log_; | |
| 391 } | |
| 392 | |
| 388 //----------------------------------------------------------------------------- | 393 //----------------------------------------------------------------------------- |
| 389 | 394 |
| 390 void HttpCache::Transaction::DoCallback(int rv) { | 395 void HttpCache::Transaction::DoCallback(int rv) { |
| 391 DCHECK(rv != ERR_IO_PENDING); | 396 DCHECK(rv != ERR_IO_PENDING); |
| 392 DCHECK(callback_); | 397 DCHECK(callback_); |
| 393 | 398 |
| 394 // Since Run may result in Read being called, clear callback_ up front. | 399 // Since Run may result in Read being called, clear callback_ up front. |
| 395 CompletionCallback* c = callback_; | 400 CompletionCallback* c = callback_; |
| 396 callback_ = NULL; | 401 callback_ = NULL; |
| 397 c->Run(rv); | 402 c->Run(rv); |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 559 | 564 |
| 560 if (rv != ERR_IO_PENDING) | 565 if (rv != ERR_IO_PENDING) |
| 561 HandleResult(rv); | 566 HandleResult(rv); |
| 562 | 567 |
| 563 return rv; | 568 return rv; |
| 564 } | 569 } |
| 565 | 570 |
| 566 int HttpCache::Transaction::DoGetBackend() { | 571 int HttpCache::Transaction::DoGetBackend() { |
| 567 cache_pending_ = true; | 572 cache_pending_ = true; |
| 568 next_state_ = STATE_GET_BACKEND_COMPLETE; | 573 next_state_ = STATE_GET_BACKEND_COMPLETE; |
| 569 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_WAITING, NULL); | 574 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_GET_BACKEND, NULL); |
| 570 return cache_->GetBackendForTransaction(this); | 575 return cache_->GetBackendForTransaction(this); |
| 571 } | 576 } |
| 572 | 577 |
| 573 int HttpCache::Transaction::DoGetBackendComplete(int result) { | 578 int HttpCache::Transaction::DoGetBackendComplete(int result) { |
| 574 DCHECK(result == OK || result == ERR_FAILED); | 579 DCHECK(result == OK || result == ERR_FAILED); |
| 575 net_log_.EndEvent(NetLog::TYPE_HTTP_CACHE_WAITING, NULL); | 580 net_log_.EndEventWithErrorCode(NetLog::TYPE_HTTP_CACHE_GET_BACKEND, result); |
| 576 cache_pending_ = false; | 581 cache_pending_ = false; |
| 577 | 582 |
| 578 if (!ShouldPassThrough()) { | 583 if (!ShouldPassThrough()) { |
| 579 cache_key_ = cache_->GenerateCacheKey(request_); | 584 cache_key_ = cache_->GenerateCacheKey(request_); |
| 580 | 585 |
| 581 // Requested cache access mode. | 586 // Requested cache access mode. |
| 582 if (effective_load_flags_ & LOAD_ONLY_FROM_CACHE) { | 587 if (effective_load_flags_ & LOAD_ONLY_FROM_CACHE) { |
| 583 mode_ = READ; | 588 mode_ = READ; |
| 584 } else if (effective_load_flags_ & LOAD_BYPASS_CACHE) { | 589 } else if (effective_load_flags_ & LOAD_BYPASS_CACHE) { |
| 585 mode_ = WRITE; | 590 mode_ = WRITE; |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 739 next_state_ = STATE_OPEN_ENTRY_COMPLETE; | 744 next_state_ = STATE_OPEN_ENTRY_COMPLETE; |
| 740 cache_pending_ = true; | 745 cache_pending_ = true; |
| 741 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_OPEN_ENTRY, NULL); | 746 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_OPEN_ENTRY, NULL); |
| 742 return cache_->OpenEntry(cache_key_, &new_entry_, this); | 747 return cache_->OpenEntry(cache_key_, &new_entry_, this); |
| 743 } | 748 } |
| 744 | 749 |
| 745 int HttpCache::Transaction::DoOpenEntryComplete(int result) { | 750 int HttpCache::Transaction::DoOpenEntryComplete(int result) { |
| 746 // It is important that we go to STATE_ADD_TO_ENTRY whenever the result is | 751 // It is important that we go to STATE_ADD_TO_ENTRY whenever the result is |
| 747 // OK, otherwise the cache will end up with an active entry without any | 752 // OK, otherwise the cache will end up with an active entry without any |
| 748 // transaction attached. | 753 // transaction attached. |
| 749 net_log_.EndEvent(NetLog::TYPE_HTTP_CACHE_OPEN_ENTRY, NULL); | 754 net_log_.EndEventWithErrorCode(NetLog::TYPE_HTTP_CACHE_OPEN_ENTRY, result); |
| 750 cache_pending_ = false; | 755 cache_pending_ = false; |
| 751 if (result == OK) { | 756 if (result == OK) { |
| 752 next_state_ = STATE_ADD_TO_ENTRY; | 757 next_state_ = STATE_ADD_TO_ENTRY; |
| 753 return OK; | 758 return OK; |
| 754 } | 759 } |
| 755 | 760 |
| 756 if (result == ERR_CACHE_RACE) { | 761 if (result == ERR_CACHE_RACE) { |
| 757 next_state_ = STATE_INIT_ENTRY; | 762 next_state_ = STATE_INIT_ENTRY; |
| 758 return OK; | 763 return OK; |
| 759 } | 764 } |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 782 next_state_ = STATE_CREATE_ENTRY_COMPLETE; | 787 next_state_ = STATE_CREATE_ENTRY_COMPLETE; |
| 783 cache_pending_ = true; | 788 cache_pending_ = true; |
| 784 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_CREATE_ENTRY, NULL); | 789 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_CREATE_ENTRY, NULL); |
| 785 return cache_->CreateEntry(cache_key_, &new_entry_, this); | 790 return cache_->CreateEntry(cache_key_, &new_entry_, this); |
| 786 } | 791 } |
| 787 | 792 |
| 788 int HttpCache::Transaction::DoCreateEntryComplete(int result) { | 793 int HttpCache::Transaction::DoCreateEntryComplete(int result) { |
| 789 // It is important that we go to STATE_ADD_TO_ENTRY whenever the result is | 794 // It is important that we go to STATE_ADD_TO_ENTRY whenever the result is |
| 790 // OK, otherwise the cache will end up with an active entry without any | 795 // OK, otherwise the cache will end up with an active entry without any |
| 791 // transaction attached. | 796 // transaction attached. |
| 792 net_log_.EndEvent(NetLog::TYPE_HTTP_CACHE_CREATE_ENTRY, NULL); | 797 net_log_.EndEventWithErrorCode(NetLog::TYPE_HTTP_CACHE_CREATE_ENTRY, result); |
| 793 cache_pending_ = false; | 798 cache_pending_ = false; |
| 794 next_state_ = STATE_ADD_TO_ENTRY; | 799 next_state_ = STATE_ADD_TO_ENTRY; |
| 795 | 800 |
| 796 if (result == ERR_CACHE_RACE) { | 801 if (result == ERR_CACHE_RACE) { |
| 797 next_state_ = STATE_INIT_ENTRY; | 802 next_state_ = STATE_INIT_ENTRY; |
| 798 return OK; | 803 return OK; |
| 799 } | 804 } |
| 800 | 805 |
| 801 if (result != OK) { | 806 if (result != OK) { |
| 802 // We have a race here: Maybe we failed to open the entry and decided to | 807 // We have a race here: Maybe we failed to open the entry and decided to |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 813 } | 818 } |
| 814 | 819 |
| 815 int HttpCache::Transaction::DoDoomEntry() { | 820 int HttpCache::Transaction::DoDoomEntry() { |
| 816 next_state_ = STATE_DOOM_ENTRY_COMPLETE; | 821 next_state_ = STATE_DOOM_ENTRY_COMPLETE; |
| 817 cache_pending_ = true; | 822 cache_pending_ = true; |
| 818 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_DOOM_ENTRY, NULL); | 823 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_DOOM_ENTRY, NULL); |
| 819 return cache_->DoomEntry(cache_key_, this); | 824 return cache_->DoomEntry(cache_key_, this); |
| 820 } | 825 } |
| 821 | 826 |
| 822 int HttpCache::Transaction::DoDoomEntryComplete(int result) { | 827 int HttpCache::Transaction::DoDoomEntryComplete(int result) { |
| 823 net_log_.EndEvent(NetLog::TYPE_HTTP_CACHE_DOOM_ENTRY, NULL); | 828 net_log_.EndEventWithErrorCode(NetLog::TYPE_HTTP_CACHE_DOOM_ENTRY, result); |
| 824 next_state_ = STATE_CREATE_ENTRY; | 829 next_state_ = STATE_CREATE_ENTRY; |
| 825 cache_pending_ = false; | 830 cache_pending_ = false; |
| 826 if (result == ERR_CACHE_RACE) | 831 if (result == ERR_CACHE_RACE) |
| 827 next_state_ = STATE_INIT_ENTRY; | 832 next_state_ = STATE_INIT_ENTRY; |
| 828 | 833 |
| 829 return OK; | 834 return OK; |
| 830 } | 835 } |
| 831 | 836 |
| 832 int HttpCache::Transaction::DoAddToEntry() { | 837 int HttpCache::Transaction::DoAddToEntry() { |
| 833 DCHECK(new_entry_); | 838 DCHECK(new_entry_); |
| 834 cache_pending_ = true; | 839 cache_pending_ = true; |
| 835 next_state_ = STATE_ADD_TO_ENTRY_COMPLETE; | 840 next_state_ = STATE_ADD_TO_ENTRY_COMPLETE; |
| 836 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_WAITING, NULL); | 841 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_ADD_TO_ENTRY, |
| 842 new NetLogSourceParameter("source_dependency", | |
| 843 new_entry_->net_log.source())); | |
| 837 DCHECK(entry_lock_waiting_since_.is_null()); | 844 DCHECK(entry_lock_waiting_since_.is_null()); |
| 838 entry_lock_waiting_since_ = base::TimeTicks::Now(); | 845 entry_lock_waiting_since_ = base::TimeTicks::Now(); |
| 839 return cache_->AddTransactionToEntry(new_entry_, this); | 846 return cache_->AddTransactionToEntry(new_entry_, this); |
| 840 } | 847 } |
| 841 | 848 |
| 842 int HttpCache::Transaction::DoAddToEntryComplete(int result) { | 849 int HttpCache::Transaction::DoAddToEntryComplete(int result) { |
| 843 net_log_.EndEvent(NetLog::TYPE_HTTP_CACHE_WAITING, NULL); | 850 net_log_.EndEventWithErrorCode(NetLog::TYPE_HTTP_CACHE_ADD_TO_ENTRY, result); |
| 844 | |
| 845 const base::TimeDelta entry_lock_wait = | 851 const base::TimeDelta entry_lock_wait = |
| 846 base::TimeTicks::Now() - entry_lock_waiting_since_; | 852 base::TimeTicks::Now() - entry_lock_waiting_since_; |
| 847 UMA_HISTOGRAM_TIMES("HttpCache.EntryLockWait", entry_lock_wait); | 853 UMA_HISTOGRAM_TIMES("HttpCache.EntryLockWait", entry_lock_wait); |
| 848 static const bool prefetching_fieldtrial = | 854 static const bool prefetching_fieldtrial = |
| 849 base::FieldTrialList::Find("Prefetch") && | 855 base::FieldTrialList::Find("Prefetch") && |
| 850 !base::FieldTrialList::Find("Prefetch")->group_name().empty(); | 856 !base::FieldTrialList::Find("Prefetch")->group_name().empty(); |
| 851 if (prefetching_fieldtrial) { | 857 if (prefetching_fieldtrial) { |
| 852 UMA_HISTOGRAM_TIMES( | 858 UMA_HISTOGRAM_TIMES( |
| 853 base::FieldTrial::MakeName("HttpCache.EntryLockWait", "Prefetch"), | 859 base::FieldTrial::MakeName("HttpCache.EntryLockWait", "Prefetch"), |
| 854 entry_lock_wait); | 860 entry_lock_wait); |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 984 next_state_ = truncated_ ? STATE_CACHE_WRITE_TRUNCATED_RESPONSE : | 990 next_state_ = truncated_ ? STATE_CACHE_WRITE_TRUNCATED_RESPONSE : |
| 985 STATE_CACHE_WRITE_RESPONSE; | 991 STATE_CACHE_WRITE_RESPONSE; |
| 986 return OK; | 992 return OK; |
| 987 } | 993 } |
| 988 | 994 |
| 989 int HttpCache::Transaction::DoTruncateCachedData() { | 995 int HttpCache::Transaction::DoTruncateCachedData() { |
| 990 next_state_ = STATE_TRUNCATE_CACHED_DATA_COMPLETE; | 996 next_state_ = STATE_TRUNCATE_CACHED_DATA_COMPLETE; |
| 991 cache_callback_->AddRef(); // Balanced in DoTruncateCachedDataComplete. | 997 cache_callback_->AddRef(); // Balanced in DoTruncateCachedDataComplete. |
| 992 if (!entry_) | 998 if (!entry_) |
| 993 return OK; | 999 return OK; |
| 1000 if (net_log_.IsLoggingAllEvents()) | |
| 1001 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_WRITE_DATA, NULL); | |
| 994 | 1002 |
| 995 // Truncate the stream. | 1003 // Truncate the stream. |
| 996 return WriteToEntry(kResponseContentIndex, 0, NULL, 0, cache_callback_); | 1004 return WriteToEntry(kResponseContentIndex, 0, NULL, 0, cache_callback_); |
| 997 } | 1005 } |
| 998 | 1006 |
| 999 int HttpCache::Transaction::DoTruncateCachedDataComplete(int result) { | 1007 int HttpCache::Transaction::DoTruncateCachedDataComplete(int result) { |
| 1008 if (net_log_.IsLoggingAllEvents() && entry_) | |
| 1009 net_log_.EndEventWithErrorCode(NetLog::TYPE_HTTP_CACHE_WRITE_DATA, result); | |
| 1010 | |
| 1000 // Balance the AddRef from DoTruncateCachedData. | 1011 // Balance the AddRef from DoTruncateCachedData. |
| 1001 cache_callback_->Release(); | 1012 cache_callback_->Release(); |
| 1002 next_state_ = STATE_TRUNCATE_CACHED_METADATA; | 1013 next_state_ = STATE_TRUNCATE_CACHED_METADATA; |
| 1003 return OK; | 1014 return OK; |
| 1004 } | 1015 } |
| 1005 | 1016 |
| 1006 int HttpCache::Transaction::DoTruncateCachedMetadata() { | 1017 int HttpCache::Transaction::DoTruncateCachedMetadata() { |
| 1007 next_state_ = STATE_TRUNCATE_CACHED_METADATA_COMPLETE; | 1018 next_state_ = STATE_TRUNCATE_CACHED_METADATA_COMPLETE; |
| 1008 cache_callback_->AddRef(); // Balanced in DoTruncateCachedMetadataComplete. | 1019 cache_callback_->AddRef(); // Balanced in DoTruncateCachedMetadataComplete. |
| 1009 if (!entry_) | 1020 if (!entry_) |
| 1010 return OK; | 1021 return OK; |
| 1011 | 1022 |
| 1023 if (net_log_.IsLoggingAllEvents()) | |
| 1024 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_WRITE_INFO, NULL); | |
|
rvargas (doing something else)
2010/12/11 00:29:01
This one is most likely redundant.
| |
| 1012 return WriteToEntry(kMetadataIndex, 0, NULL, 0, cache_callback_); | 1025 return WriteToEntry(kMetadataIndex, 0, NULL, 0, cache_callback_); |
| 1013 } | 1026 } |
| 1014 | 1027 |
| 1015 int HttpCache::Transaction::DoTruncateCachedMetadataComplete(int result) { | 1028 int HttpCache::Transaction::DoTruncateCachedMetadataComplete(int result) { |
| 1029 if (net_log_.IsLoggingAllEvents() && entry_) | |
| 1030 net_log_.EndEventWithErrorCode(NetLog::TYPE_HTTP_CACHE_WRITE_INFO, result); | |
| 1031 | |
| 1016 // Balance the AddRef from DoTruncateCachedMetadata. | 1032 // Balance the AddRef from DoTruncateCachedMetadata. |
| 1017 cache_callback_->Release(); | 1033 cache_callback_->Release(); |
| 1018 | 1034 |
| 1019 // If this response is a redirect, then we can stop writing now. (We don't | 1035 // If this response is a redirect, then we can stop writing now. (We don't |
| 1020 // need to cache the response body of a redirect.) | 1036 // need to cache the response body of a redirect.) |
| 1021 if (response_.headers->IsRedirect(NULL)) | 1037 if (response_.headers->IsRedirect(NULL)) |
| 1022 DoneWritingToEntry(true); | 1038 DoneWritingToEntry(true); |
| 1023 next_state_ = STATE_PARTIAL_HEADERS_RECEIVED; | 1039 next_state_ = STATE_PARTIAL_HEADERS_RECEIVED; |
| 1024 return OK; | 1040 return OK; |
| 1025 } | 1041 } |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 1055 read_buf_ = new IOBuffer(io_buf_len_); | 1071 read_buf_ = new IOBuffer(io_buf_len_); |
| 1056 | 1072 |
| 1057 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_READ_INFO, NULL); | 1073 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_READ_INFO, NULL); |
| 1058 cache_callback_->AddRef(); // Balanced in DoCacheReadResponseComplete. | 1074 cache_callback_->AddRef(); // Balanced in DoCacheReadResponseComplete. |
| 1059 return entry_->disk_entry->ReadData(kResponseInfoIndex, 0, read_buf_, | 1075 return entry_->disk_entry->ReadData(kResponseInfoIndex, 0, read_buf_, |
| 1060 io_buf_len_, cache_callback_); | 1076 io_buf_len_, cache_callback_); |
| 1061 } | 1077 } |
| 1062 | 1078 |
| 1063 int HttpCache::Transaction::DoCacheReadResponseComplete(int result) { | 1079 int HttpCache::Transaction::DoCacheReadResponseComplete(int result) { |
| 1064 cache_callback_->Release(); // Balance the AddRef from DoCacheReadResponse. | 1080 cache_callback_->Release(); // Balance the AddRef from DoCacheReadResponse. |
| 1065 net_log_.EndEvent(NetLog::TYPE_HTTP_CACHE_READ_INFO, NULL); | 1081 net_log_.EndEventWithErrorCode(NetLog::TYPE_HTTP_CACHE_READ_INFO, result); |
| 1066 if (result != io_buf_len_ || | 1082 if (result != io_buf_len_ || |
| 1067 !HttpCache::ParseResponseInfo(read_buf_->data(), io_buf_len_, | 1083 !HttpCache::ParseResponseInfo(read_buf_->data(), io_buf_len_, |
| 1068 &response_, &truncated_)) { | 1084 &response_, &truncated_)) { |
| 1069 DLOG(ERROR) << "ReadData failed: " << result; | 1085 DLOG(ERROR) << "ReadData failed: " << result; |
| 1070 return ERR_CACHE_READ_FAILURE; | 1086 return ERR_CACHE_READ_FAILURE; |
| 1071 } | 1087 } |
| 1072 | 1088 |
| 1073 // We now have access to the cache entry. | 1089 // We now have access to the cache entry. |
| 1074 // | 1090 // |
| 1075 // o if we are a reader for the transaction, then we can start reading the | 1091 // o if we are a reader for the transaction, then we can start reading the |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 1095 break; | 1111 break; |
| 1096 case WRITE: | 1112 case WRITE: |
| 1097 default: | 1113 default: |
| 1098 NOTREACHED(); | 1114 NOTREACHED(); |
| 1099 result = ERR_FAILED; | 1115 result = ERR_FAILED; |
| 1100 } | 1116 } |
| 1101 return result; | 1117 return result; |
| 1102 } | 1118 } |
| 1103 | 1119 |
| 1104 int HttpCache::Transaction::DoCacheWriteResponse() { | 1120 int HttpCache::Transaction::DoCacheWriteResponse() { |
| 1121 if (net_log_.IsLoggingAllEvents() && entry_) | |
| 1122 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_WRITE_INFO, NULL); | |
| 1105 return WriteResponseInfoToEntry(false); | 1123 return WriteResponseInfoToEntry(false); |
| 1106 } | 1124 } |
| 1107 | 1125 |
| 1108 int HttpCache::Transaction::DoCacheWriteTruncatedResponse() { | 1126 int HttpCache::Transaction::DoCacheWriteTruncatedResponse() { |
| 1127 if (net_log_.IsLoggingAllEvents() && entry_) | |
| 1128 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_WRITE_INFO, NULL); | |
| 1109 return WriteResponseInfoToEntry(true); | 1129 return WriteResponseInfoToEntry(true); |
| 1110 } | 1130 } |
| 1111 | 1131 |
| 1112 int HttpCache::Transaction::DoCacheWriteResponseComplete(int result) { | 1132 int HttpCache::Transaction::DoCacheWriteResponseComplete(int result) { |
| 1113 next_state_ = target_state_; | 1133 next_state_ = target_state_; |
| 1114 target_state_ = STATE_NONE; | 1134 target_state_ = STATE_NONE; |
| 1115 if (!entry_) | 1135 if (!entry_) |
| 1116 return OK; | 1136 return OK; |
| 1137 if (net_log_.IsLoggingAllEvents()) | |
|
rvargas (doing something else)
2010/12/11 00:29:01
You should probably move this before the previous
mmenke
2010/12/11 01:51:05
Both write events check for entry_'s existence bef
rvargas (doing something else)
2010/12/13 23:34:38
DoCacheWriteResponse and DoCacheWriteTruncatedResp
mmenke
2010/12/14 00:04:43
Which is why in DoCacheWriteResponse and DoCacheWr
rvargas (doing something else)
2010/12/14 00:14:26
And that just shows how blind I am!
| |
| 1138 net_log_.EndEventWithErrorCode(NetLog::TYPE_HTTP_CACHE_WRITE_INFO, result); | |
| 1117 | 1139 |
| 1118 // Balance the AddRef from WriteResponseInfoToEntry. | 1140 // Balance the AddRef from WriteResponseInfoToEntry. |
| 1119 write_headers_callback_->Release(); | 1141 write_headers_callback_->Release(); |
| 1120 if (result != io_buf_len_) { | 1142 if (result != io_buf_len_) { |
| 1121 DLOG(ERROR) << "failed to write response info to cache"; | 1143 DLOG(ERROR) << "failed to write response info to cache"; |
| 1122 DoneWritingToEntry(false); | 1144 DoneWritingToEntry(false); |
| 1123 } | 1145 } |
| 1124 return OK; | 1146 return OK; |
| 1125 } | 1147 } |
| 1126 | 1148 |
| 1127 int HttpCache::Transaction::DoCacheReadMetadata() { | 1149 int HttpCache::Transaction::DoCacheReadMetadata() { |
| 1128 DCHECK(entry_); | 1150 DCHECK(entry_); |
| 1129 DCHECK(!response_.metadata); | 1151 DCHECK(!response_.metadata); |
| 1130 next_state_ = STATE_CACHE_READ_METADATA_COMPLETE; | 1152 next_state_ = STATE_CACHE_READ_METADATA_COMPLETE; |
| 1131 | 1153 |
| 1132 response_.metadata = | 1154 response_.metadata = |
| 1133 new IOBufferWithSize(entry_->disk_entry->GetDataSize(kMetadataIndex)); | 1155 new IOBufferWithSize(entry_->disk_entry->GetDataSize(kMetadataIndex)); |
| 1134 | 1156 |
| 1135 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_READ_INFO, NULL); | 1157 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_READ_INFO, NULL); |
| 1136 cache_callback_->AddRef(); // Balanced in DoCacheReadMetadataComplete. | 1158 cache_callback_->AddRef(); // Balanced in DoCacheReadMetadataComplete. |
| 1137 return entry_->disk_entry->ReadData(kMetadataIndex, 0, response_.metadata, | 1159 return entry_->disk_entry->ReadData(kMetadataIndex, 0, response_.metadata, |
| 1138 response_.metadata->size(), | 1160 response_.metadata->size(), |
| 1139 cache_callback_); | 1161 cache_callback_); |
| 1140 } | 1162 } |
| 1141 | 1163 |
| 1142 int HttpCache::Transaction::DoCacheReadMetadataComplete(int result) { | 1164 int HttpCache::Transaction::DoCacheReadMetadataComplete(int result) { |
| 1143 cache_callback_->Release(); // Balance the AddRef from DoCacheReadMetadata. | 1165 cache_callback_->Release(); // Balance the AddRef from DoCacheReadMetadata. |
| 1144 net_log_.EndEvent(NetLog::TYPE_HTTP_CACHE_READ_INFO, NULL); | 1166 net_log_.EndEventWithErrorCode(NetLog::TYPE_HTTP_CACHE_READ_INFO, result); |
| 1145 if (result != response_.metadata->size()) { | 1167 if (result != response_.metadata->size()) { |
| 1146 DLOG(ERROR) << "ReadData failed: " << result; | 1168 DLOG(ERROR) << "ReadData failed: " << result; |
| 1147 return ERR_CACHE_READ_FAILURE; | 1169 return ERR_CACHE_READ_FAILURE; |
| 1148 } | 1170 } |
| 1149 | 1171 |
| 1150 return OK; | 1172 return OK; |
| 1151 } | 1173 } |
| 1152 | 1174 |
| 1153 int HttpCache::Transaction::DoCacheQueryData() { | 1175 int HttpCache::Transaction::DoCacheQueryData() { |
| 1154 next_state_ = STATE_CACHE_QUERY_DATA_COMPLETE; | 1176 next_state_ = STATE_CACHE_QUERY_DATA_COMPLETE; |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 1165 if (!cache_) | 1187 if (!cache_) |
| 1166 return ERR_UNEXPECTED; | 1188 return ERR_UNEXPECTED; |
| 1167 | 1189 |
| 1168 return ValidateEntryHeadersAndContinue(true); | 1190 return ValidateEntryHeadersAndContinue(true); |
| 1169 } | 1191 } |
| 1170 | 1192 |
| 1171 int HttpCache::Transaction::DoCacheReadData() { | 1193 int HttpCache::Transaction::DoCacheReadData() { |
| 1172 DCHECK(entry_); | 1194 DCHECK(entry_); |
| 1173 next_state_ = STATE_CACHE_READ_DATA_COMPLETE; | 1195 next_state_ = STATE_CACHE_READ_DATA_COMPLETE; |
| 1174 cache_callback_->AddRef(); // Balanced in DoCacheReadDataComplete. | 1196 cache_callback_->AddRef(); // Balanced in DoCacheReadDataComplete. |
| 1197 | |
| 1198 if (net_log_.IsLoggingAllEvents()) | |
| 1199 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_READ_DATA, NULL); | |
|
rvargas (doing something else)
2010/12/11 00:29:01
Isn't this a little excessive? I'd expect a lot of
mmenke
2010/12/11 01:51:05
There is indeed a lot of noise, but it all ends up
rvargas (doing something else)
2010/12/13 23:34:38
OK, I didn't notice before that we log bytes recei
| |
| 1175 if (partial_.get()) { | 1200 if (partial_.get()) { |
| 1176 return partial_->CacheRead(entry_->disk_entry, read_buf_, io_buf_len_, | 1201 return partial_->CacheRead(entry_->disk_entry, read_buf_, io_buf_len_, |
| 1177 cache_callback_); | 1202 cache_callback_); |
| 1178 } | 1203 } |
| 1179 | 1204 |
| 1180 return entry_->disk_entry->ReadData(kResponseContentIndex, read_offset_, | 1205 return entry_->disk_entry->ReadData(kResponseContentIndex, read_offset_, |
| 1181 read_buf_, io_buf_len_, cache_callback_); | 1206 read_buf_, io_buf_len_, cache_callback_); |
| 1182 } | 1207 } |
| 1183 | 1208 |
| 1184 int HttpCache::Transaction::DoCacheReadDataComplete(int result) { | 1209 int HttpCache::Transaction::DoCacheReadDataComplete(int result) { |
| 1185 cache_callback_->Release(); // Balance the AddRef from DoCacheReadData. | 1210 cache_callback_->Release(); // Balance the AddRef from DoCacheReadData. |
| 1211 if (net_log_.IsLoggingAllEvents()) | |
| 1212 net_log_.EndEventWithErrorCode(NetLog::TYPE_HTTP_CACHE_READ_DATA, result); | |
| 1186 | 1213 |
| 1187 if (!cache_) | 1214 if (!cache_) |
| 1188 return ERR_UNEXPECTED; | 1215 return ERR_UNEXPECTED; |
| 1189 | 1216 |
| 1190 if (partial_.get()) | 1217 if (partial_.get()) |
| 1191 return DoPartialCacheReadCompleted(result); | 1218 return DoPartialCacheReadCompleted(result); |
| 1192 | 1219 |
| 1193 if (result > 0) { | 1220 if (result > 0) { |
| 1194 read_offset_ += result; | 1221 read_offset_ += result; |
| 1195 } else if (result == 0) { // End of file. | 1222 } else if (result == 0) { // End of file. |
| 1196 cache_->DoneReadingFromEntry(entry_, this); | 1223 cache_->DoneReadingFromEntry(entry_, this); |
| 1197 entry_ = NULL; | 1224 entry_ = NULL; |
| 1198 } | 1225 } |
| 1199 return result; | 1226 return result; |
| 1200 } | 1227 } |
| 1201 | 1228 |
| 1202 int HttpCache::Transaction::DoCacheWriteData(int num_bytes) { | 1229 int HttpCache::Transaction::DoCacheWriteData(int num_bytes) { |
| 1203 next_state_ = STATE_CACHE_WRITE_DATA_COMPLETE; | 1230 next_state_ = STATE_CACHE_WRITE_DATA_COMPLETE; |
| 1204 write_len_ = num_bytes; | 1231 write_len_ = num_bytes; |
| 1232 if (net_log_.IsLoggingAllEvents()) | |
| 1233 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_WRITE_DATA, NULL); | |
|
rvargas (doing something else)
2010/12/11 00:29:01
same here.
| |
| 1205 cache_callback_->AddRef(); // Balanced in DoCacheWriteDataComplete. | 1234 cache_callback_->AddRef(); // Balanced in DoCacheWriteDataComplete. |
| 1206 | 1235 |
| 1207 return AppendResponseDataToEntry(read_buf_, num_bytes, cache_callback_); | 1236 return AppendResponseDataToEntry(read_buf_, num_bytes, cache_callback_); |
| 1208 } | 1237 } |
| 1209 | 1238 |
| 1210 int HttpCache::Transaction::DoCacheWriteDataComplete(int result) { | 1239 int HttpCache::Transaction::DoCacheWriteDataComplete(int result) { |
| 1240 if (net_log_.IsLoggingAllEvents() && entry_) | |
| 1241 net_log_.EndEventWithErrorCode(NetLog::TYPE_HTTP_CACHE_WRITE_DATA, result); | |
| 1211 // Balance the AddRef from DoCacheWriteData. | 1242 // Balance the AddRef from DoCacheWriteData. |
| 1212 cache_callback_->Release(); | 1243 cache_callback_->Release(); |
| 1213 if (!cache_) | 1244 if (!cache_) |
| 1214 return ERR_UNEXPECTED; | 1245 return ERR_UNEXPECTED; |
| 1215 | 1246 |
| 1216 if (result != write_len_) { | 1247 if (result != write_len_) { |
| 1217 DLOG(ERROR) << "failed to write response data to cache"; | 1248 DLOG(ERROR) << "failed to write response data to cache"; |
| 1218 DoneWritingToEntry(false); | 1249 DoneWritingToEntry(false); |
| 1219 | 1250 |
| 1220 // We want to ignore errors writing to disk and just keep reading from | 1251 // We want to ignore errors writing to disk and just keep reading from |
| (...skipping 675 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1896 // |value| goes from 0 to 63. Actually, the max value should be 47 (0x2f) | 1927 // |value| goes from 0 to 63. Actually, the max value should be 47 (0x2f) |
| 1897 // but we'll see. | 1928 // but we'll see. |
| 1898 UMA_HISTOGRAM_ENUMERATION("HttpCache.ResponseHeaders", value, 65); | 1929 UMA_HISTOGRAM_ENUMERATION("HttpCache.ResponseHeaders", value, 65); |
| 1899 } | 1930 } |
| 1900 | 1931 |
| 1901 void HttpCache::Transaction::OnIOComplete(int result) { | 1932 void HttpCache::Transaction::OnIOComplete(int result) { |
| 1902 DoLoop(result); | 1933 DoLoop(result); |
| 1903 } | 1934 } |
| 1904 | 1935 |
| 1905 } // namespace net | 1936 } // namespace net |
| OLD | NEW |