| 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> |
| (...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 391 } | 391 } |
| 392 | 392 |
| 393 LoadState HttpCache::Transaction::GetWriterLoadState() const { | 393 LoadState HttpCache::Transaction::GetWriterLoadState() const { |
| 394 if (network_trans_.get()) | 394 if (network_trans_.get()) |
| 395 return network_trans_->GetLoadState(); | 395 return network_trans_->GetLoadState(); |
| 396 if (entry_ || !request_) | 396 if (entry_ || !request_) |
| 397 return LOAD_STATE_IDLE; | 397 return LOAD_STATE_IDLE; |
| 398 return LOAD_STATE_WAITING_FOR_CACHE; | 398 return LOAD_STATE_WAITING_FOR_CACHE; |
| 399 } | 399 } |
| 400 | 400 |
| 401 const BoundNetLog& HttpCache::Transaction::net_log() const { |
| 402 return net_log_; |
| 403 } |
| 404 |
| 401 //----------------------------------------------------------------------------- | 405 //----------------------------------------------------------------------------- |
| 402 | 406 |
| 403 void HttpCache::Transaction::DoCallback(int rv) { | 407 void HttpCache::Transaction::DoCallback(int rv) { |
| 404 DCHECK(rv != ERR_IO_PENDING); | 408 DCHECK(rv != ERR_IO_PENDING); |
| 405 DCHECK(callback_); | 409 DCHECK(callback_); |
| 406 | 410 |
| 407 // Since Run may result in Read being called, clear callback_ up front. | 411 // Since Run may result in Read being called, clear callback_ up front. |
| 408 CompletionCallback* c = callback_; | 412 CompletionCallback* c = callback_; |
| 409 callback_ = NULL; | 413 callback_ = NULL; |
| 410 c->Run(rv); | 414 c->Run(rv); |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 572 | 576 |
| 573 if (rv != ERR_IO_PENDING) | 577 if (rv != ERR_IO_PENDING) |
| 574 HandleResult(rv); | 578 HandleResult(rv); |
| 575 | 579 |
| 576 return rv; | 580 return rv; |
| 577 } | 581 } |
| 578 | 582 |
| 579 int HttpCache::Transaction::DoGetBackend() { | 583 int HttpCache::Transaction::DoGetBackend() { |
| 580 cache_pending_ = true; | 584 cache_pending_ = true; |
| 581 next_state_ = STATE_GET_BACKEND_COMPLETE; | 585 next_state_ = STATE_GET_BACKEND_COMPLETE; |
| 582 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_WAITING, NULL); | 586 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_GET_BACKEND, NULL); |
| 583 return cache_->GetBackendForTransaction(this); | 587 return cache_->GetBackendForTransaction(this); |
| 584 } | 588 } |
| 585 | 589 |
| 586 int HttpCache::Transaction::DoGetBackendComplete(int result) { | 590 int HttpCache::Transaction::DoGetBackendComplete(int result) { |
| 587 DCHECK(result == OK || result == ERR_FAILED); | 591 DCHECK(result == OK || result == ERR_FAILED); |
| 588 net_log_.EndEvent(NetLog::TYPE_HTTP_CACHE_WAITING, NULL); | 592 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_GET_BACKEND, |
| 593 result); |
| 589 cache_pending_ = false; | 594 cache_pending_ = false; |
| 590 | 595 |
| 591 if (!ShouldPassThrough()) { | 596 if (!ShouldPassThrough()) { |
| 592 cache_key_ = cache_->GenerateCacheKey(request_); | 597 cache_key_ = cache_->GenerateCacheKey(request_); |
| 593 | 598 |
| 594 // Requested cache access mode. | 599 // Requested cache access mode. |
| 595 if (effective_load_flags_ & LOAD_ONLY_FROM_CACHE) { | 600 if (effective_load_flags_ & LOAD_ONLY_FROM_CACHE) { |
| 596 mode_ = READ; | 601 mode_ = READ; |
| 597 } else if (effective_load_flags_ & LOAD_BYPASS_CACHE) { | 602 } else if (effective_load_flags_ & LOAD_BYPASS_CACHE) { |
| 598 mode_ = WRITE; | 603 mode_ = WRITE; |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 750 next_state_ = STATE_OPEN_ENTRY_COMPLETE; | 755 next_state_ = STATE_OPEN_ENTRY_COMPLETE; |
| 751 cache_pending_ = true; | 756 cache_pending_ = true; |
| 752 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_OPEN_ENTRY, NULL); | 757 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_OPEN_ENTRY, NULL); |
| 753 return cache_->OpenEntry(cache_key_, &new_entry_, this); | 758 return cache_->OpenEntry(cache_key_, &new_entry_, this); |
| 754 } | 759 } |
| 755 | 760 |
| 756 int HttpCache::Transaction::DoOpenEntryComplete(int result) { | 761 int HttpCache::Transaction::DoOpenEntryComplete(int result) { |
| 757 // It is important that we go to STATE_ADD_TO_ENTRY whenever the result is | 762 // It is important that we go to STATE_ADD_TO_ENTRY whenever the result is |
| 758 // OK, otherwise the cache will end up with an active entry without any | 763 // OK, otherwise the cache will end up with an active entry without any |
| 759 // transaction attached. | 764 // transaction attached. |
| 760 net_log_.EndEvent(NetLog::TYPE_HTTP_CACHE_OPEN_ENTRY, NULL); | 765 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_OPEN_ENTRY, result); |
| 761 cache_pending_ = false; | 766 cache_pending_ = false; |
| 762 if (result == OK) { | 767 if (result == OK) { |
| 763 next_state_ = STATE_ADD_TO_ENTRY; | 768 next_state_ = STATE_ADD_TO_ENTRY; |
| 764 return OK; | 769 return OK; |
| 765 } | 770 } |
| 766 | 771 |
| 767 if (result == ERR_CACHE_RACE) { | 772 if (result == ERR_CACHE_RACE) { |
| 768 next_state_ = STATE_INIT_ENTRY; | 773 next_state_ = STATE_INIT_ENTRY; |
| 769 return OK; | 774 return OK; |
| 770 } | 775 } |
| (...skipping 22 matching lines...) Expand all Loading... |
| 793 next_state_ = STATE_CREATE_ENTRY_COMPLETE; | 798 next_state_ = STATE_CREATE_ENTRY_COMPLETE; |
| 794 cache_pending_ = true; | 799 cache_pending_ = true; |
| 795 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_CREATE_ENTRY, NULL); | 800 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_CREATE_ENTRY, NULL); |
| 796 return cache_->CreateEntry(cache_key_, &new_entry_, this); | 801 return cache_->CreateEntry(cache_key_, &new_entry_, this); |
| 797 } | 802 } |
| 798 | 803 |
| 799 int HttpCache::Transaction::DoCreateEntryComplete(int result) { | 804 int HttpCache::Transaction::DoCreateEntryComplete(int result) { |
| 800 // It is important that we go to STATE_ADD_TO_ENTRY whenever the result is | 805 // It is important that we go to STATE_ADD_TO_ENTRY whenever the result is |
| 801 // OK, otherwise the cache will end up with an active entry without any | 806 // OK, otherwise the cache will end up with an active entry without any |
| 802 // transaction attached. | 807 // transaction attached. |
| 803 net_log_.EndEvent(NetLog::TYPE_HTTP_CACHE_CREATE_ENTRY, NULL); | 808 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_CREATE_ENTRY, |
| 809 result); |
| 804 cache_pending_ = false; | 810 cache_pending_ = false; |
| 805 next_state_ = STATE_ADD_TO_ENTRY; | 811 next_state_ = STATE_ADD_TO_ENTRY; |
| 806 | 812 |
| 807 if (result == ERR_CACHE_RACE) { | 813 if (result == ERR_CACHE_RACE) { |
| 808 next_state_ = STATE_INIT_ENTRY; | 814 next_state_ = STATE_INIT_ENTRY; |
| 809 return OK; | 815 return OK; |
| 810 } | 816 } |
| 811 | 817 |
| 812 if (result != OK) { | 818 if (result != OK) { |
| 813 // We have a race here: Maybe we failed to open the entry and decided to | 819 // We have a race here: Maybe we failed to open the entry and decided to |
| (...skipping 10 matching lines...) Expand all Loading... |
| 824 } | 830 } |
| 825 | 831 |
| 826 int HttpCache::Transaction::DoDoomEntry() { | 832 int HttpCache::Transaction::DoDoomEntry() { |
| 827 next_state_ = STATE_DOOM_ENTRY_COMPLETE; | 833 next_state_ = STATE_DOOM_ENTRY_COMPLETE; |
| 828 cache_pending_ = true; | 834 cache_pending_ = true; |
| 829 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_DOOM_ENTRY, NULL); | 835 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_DOOM_ENTRY, NULL); |
| 830 return cache_->DoomEntry(cache_key_, this); | 836 return cache_->DoomEntry(cache_key_, this); |
| 831 } | 837 } |
| 832 | 838 |
| 833 int HttpCache::Transaction::DoDoomEntryComplete(int result) { | 839 int HttpCache::Transaction::DoDoomEntryComplete(int result) { |
| 834 net_log_.EndEvent(NetLog::TYPE_HTTP_CACHE_DOOM_ENTRY, NULL); | 840 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_DOOM_ENTRY, result); |
| 835 next_state_ = STATE_CREATE_ENTRY; | 841 next_state_ = STATE_CREATE_ENTRY; |
| 836 cache_pending_ = false; | 842 cache_pending_ = false; |
| 837 if (result == ERR_CACHE_RACE) | 843 if (result == ERR_CACHE_RACE) |
| 838 next_state_ = STATE_INIT_ENTRY; | 844 next_state_ = STATE_INIT_ENTRY; |
| 839 | 845 |
| 840 return OK; | 846 return OK; |
| 841 } | 847 } |
| 842 | 848 |
| 843 int HttpCache::Transaction::DoAddToEntry() { | 849 int HttpCache::Transaction::DoAddToEntry() { |
| 844 DCHECK(new_entry_); | 850 DCHECK(new_entry_); |
| 845 cache_pending_ = true; | 851 cache_pending_ = true; |
| 846 next_state_ = STATE_ADD_TO_ENTRY_COMPLETE; | 852 next_state_ = STATE_ADD_TO_ENTRY_COMPLETE; |
| 847 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_WAITING, NULL); | 853 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_ADD_TO_ENTRY, NULL); |
| 848 DCHECK(entry_lock_waiting_since_.is_null()); | 854 DCHECK(entry_lock_waiting_since_.is_null()); |
| 849 entry_lock_waiting_since_ = base::TimeTicks::Now(); | 855 entry_lock_waiting_since_ = base::TimeTicks::Now(); |
| 850 return cache_->AddTransactionToEntry(new_entry_, this); | 856 return cache_->AddTransactionToEntry(new_entry_, this); |
| 851 } | 857 } |
| 852 | 858 |
| 853 int HttpCache::Transaction::DoAddToEntryComplete(int result) { | 859 int HttpCache::Transaction::DoAddToEntryComplete(int result) { |
| 854 net_log_.EndEvent(NetLog::TYPE_HTTP_CACHE_WAITING, NULL); | 860 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_ADD_TO_ENTRY, |
| 861 result); |
| 855 | 862 |
| 856 const base::TimeDelta entry_lock_wait = | 863 const base::TimeDelta entry_lock_wait = |
| 857 base::TimeTicks::Now() - entry_lock_waiting_since_; | 864 base::TimeTicks::Now() - entry_lock_waiting_since_; |
| 858 UMA_HISTOGRAM_TIMES("HttpCache.EntryLockWait", entry_lock_wait); | 865 UMA_HISTOGRAM_TIMES("HttpCache.EntryLockWait", entry_lock_wait); |
| 859 static const bool prefetching_fieldtrial = | 866 static const bool prefetching_fieldtrial = |
| 860 base::FieldTrialList::Find("Prefetch") && | 867 base::FieldTrialList::Find("Prefetch") && |
| 861 !base::FieldTrialList::Find("Prefetch")->group_name().empty(); | 868 !base::FieldTrialList::Find("Prefetch")->group_name().empty(); |
| 862 if (prefetching_fieldtrial) { | 869 if (prefetching_fieldtrial) { |
| 863 UMA_HISTOGRAM_TIMES( | 870 UMA_HISTOGRAM_TIMES( |
| 864 base::FieldTrial::MakeName("HttpCache.EntryLockWait", "Prefetch"), | 871 base::FieldTrial::MakeName("HttpCache.EntryLockWait", "Prefetch"), |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 995 next_state_ = truncated_ ? STATE_CACHE_WRITE_TRUNCATED_RESPONSE : | 1002 next_state_ = truncated_ ? STATE_CACHE_WRITE_TRUNCATED_RESPONSE : |
| 996 STATE_CACHE_WRITE_RESPONSE; | 1003 STATE_CACHE_WRITE_RESPONSE; |
| 997 return OK; | 1004 return OK; |
| 998 } | 1005 } |
| 999 | 1006 |
| 1000 int HttpCache::Transaction::DoTruncateCachedData() { | 1007 int HttpCache::Transaction::DoTruncateCachedData() { |
| 1001 next_state_ = STATE_TRUNCATE_CACHED_DATA_COMPLETE; | 1008 next_state_ = STATE_TRUNCATE_CACHED_DATA_COMPLETE; |
| 1002 cache_callback_->AddRef(); // Balanced in DoTruncateCachedDataComplete. | 1009 cache_callback_->AddRef(); // Balanced in DoTruncateCachedDataComplete. |
| 1003 if (!entry_) | 1010 if (!entry_) |
| 1004 return OK; | 1011 return OK; |
| 1012 if (net_log_.IsLoggingAllEvents()) |
| 1013 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_WRITE_DATA, NULL); |
| 1005 | 1014 |
| 1006 // Truncate the stream. | 1015 // Truncate the stream. |
| 1007 return WriteToEntry(kResponseContentIndex, 0, NULL, 0, cache_callback_); | 1016 return WriteToEntry(kResponseContentIndex, 0, NULL, 0, cache_callback_); |
| 1008 } | 1017 } |
| 1009 | 1018 |
| 1010 int HttpCache::Transaction::DoTruncateCachedDataComplete(int result) { | 1019 int HttpCache::Transaction::DoTruncateCachedDataComplete(int result) { |
| 1020 if (net_log_.IsLoggingAllEvents() && entry_) { |
| 1021 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_WRITE_DATA, |
| 1022 result); |
| 1023 } |
| 1024 |
| 1011 // Balance the AddRef from DoTruncateCachedData. | 1025 // Balance the AddRef from DoTruncateCachedData. |
| 1012 cache_callback_->Release(); | 1026 cache_callback_->Release(); |
| 1013 next_state_ = STATE_TRUNCATE_CACHED_METADATA; | 1027 next_state_ = STATE_TRUNCATE_CACHED_METADATA; |
| 1014 return OK; | 1028 return OK; |
| 1015 } | 1029 } |
| 1016 | 1030 |
| 1017 int HttpCache::Transaction::DoTruncateCachedMetadata() { | 1031 int HttpCache::Transaction::DoTruncateCachedMetadata() { |
| 1018 next_state_ = STATE_TRUNCATE_CACHED_METADATA_COMPLETE; | 1032 next_state_ = STATE_TRUNCATE_CACHED_METADATA_COMPLETE; |
| 1019 cache_callback_->AddRef(); // Balanced in DoTruncateCachedMetadataComplete. | 1033 cache_callback_->AddRef(); // Balanced in DoTruncateCachedMetadataComplete. |
| 1020 if (!entry_) | 1034 if (!entry_) |
| 1021 return OK; | 1035 return OK; |
| 1022 | 1036 |
| 1037 if (net_log_.IsLoggingAllEvents()) |
| 1038 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_WRITE_INFO, NULL); |
| 1023 return WriteToEntry(kMetadataIndex, 0, NULL, 0, cache_callback_); | 1039 return WriteToEntry(kMetadataIndex, 0, NULL, 0, cache_callback_); |
| 1024 } | 1040 } |
| 1025 | 1041 |
| 1026 int HttpCache::Transaction::DoTruncateCachedMetadataComplete(int result) { | 1042 int HttpCache::Transaction::DoTruncateCachedMetadataComplete(int result) { |
| 1043 if (net_log_.IsLoggingAllEvents() && entry_) { |
| 1044 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_WRITE_INFO, |
| 1045 result); |
| 1046 } |
| 1047 |
| 1027 // Balance the AddRef from DoTruncateCachedMetadata. | 1048 // Balance the AddRef from DoTruncateCachedMetadata. |
| 1028 cache_callback_->Release(); | 1049 cache_callback_->Release(); |
| 1029 | 1050 |
| 1030 // If this response is a redirect, then we can stop writing now. (We don't | 1051 // If this response is a redirect, then we can stop writing now. (We don't |
| 1031 // need to cache the response body of a redirect.) | 1052 // need to cache the response body of a redirect.) |
| 1032 if (response_.headers->IsRedirect(NULL)) | 1053 if (response_.headers->IsRedirect(NULL)) |
| 1033 DoneWritingToEntry(true); | 1054 DoneWritingToEntry(true); |
| 1034 next_state_ = STATE_PARTIAL_HEADERS_RECEIVED; | 1055 next_state_ = STATE_PARTIAL_HEADERS_RECEIVED; |
| 1035 return OK; | 1056 return OK; |
| 1036 } | 1057 } |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1066 read_buf_ = new IOBuffer(io_buf_len_); | 1087 read_buf_ = new IOBuffer(io_buf_len_); |
| 1067 | 1088 |
| 1068 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_READ_INFO, NULL); | 1089 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_READ_INFO, NULL); |
| 1069 cache_callback_->AddRef(); // Balanced in DoCacheReadResponseComplete. | 1090 cache_callback_->AddRef(); // Balanced in DoCacheReadResponseComplete. |
| 1070 return entry_->disk_entry->ReadData(kResponseInfoIndex, 0, read_buf_, | 1091 return entry_->disk_entry->ReadData(kResponseInfoIndex, 0, read_buf_, |
| 1071 io_buf_len_, cache_callback_); | 1092 io_buf_len_, cache_callback_); |
| 1072 } | 1093 } |
| 1073 | 1094 |
| 1074 int HttpCache::Transaction::DoCacheReadResponseComplete(int result) { | 1095 int HttpCache::Transaction::DoCacheReadResponseComplete(int result) { |
| 1075 cache_callback_->Release(); // Balance the AddRef from DoCacheReadResponse. | 1096 cache_callback_->Release(); // Balance the AddRef from DoCacheReadResponse. |
| 1076 net_log_.EndEvent(NetLog::TYPE_HTTP_CACHE_READ_INFO, NULL); | 1097 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_READ_INFO, result); |
| 1077 if (result != io_buf_len_ || | 1098 if (result != io_buf_len_ || |
| 1078 !HttpCache::ParseResponseInfo(read_buf_->data(), io_buf_len_, | 1099 !HttpCache::ParseResponseInfo(read_buf_->data(), io_buf_len_, |
| 1079 &response_, &truncated_)) { | 1100 &response_, &truncated_)) { |
| 1080 DLOG(ERROR) << "ReadData failed: " << result; | 1101 DLOG(ERROR) << "ReadData failed: " << result; |
| 1081 return ERR_CACHE_READ_FAILURE; | 1102 return ERR_CACHE_READ_FAILURE; |
| 1082 } | 1103 } |
| 1083 | 1104 |
| 1084 // We now have access to the cache entry. | 1105 // We now have access to the cache entry. |
| 1085 // | 1106 // |
| 1086 // o if we are a reader for the transaction, then we can start reading the | 1107 // o if we are a reader for the transaction, then we can start reading the |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1106 break; | 1127 break; |
| 1107 case WRITE: | 1128 case WRITE: |
| 1108 default: | 1129 default: |
| 1109 NOTREACHED(); | 1130 NOTREACHED(); |
| 1110 result = ERR_FAILED; | 1131 result = ERR_FAILED; |
| 1111 } | 1132 } |
| 1112 return result; | 1133 return result; |
| 1113 } | 1134 } |
| 1114 | 1135 |
| 1115 int HttpCache::Transaction::DoCacheWriteResponse() { | 1136 int HttpCache::Transaction::DoCacheWriteResponse() { |
| 1137 if (net_log_.IsLoggingAllEvents() && entry_) |
| 1138 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_WRITE_INFO, NULL); |
| 1116 return WriteResponseInfoToEntry(false); | 1139 return WriteResponseInfoToEntry(false); |
| 1117 } | 1140 } |
| 1118 | 1141 |
| 1119 int HttpCache::Transaction::DoCacheWriteTruncatedResponse() { | 1142 int HttpCache::Transaction::DoCacheWriteTruncatedResponse() { |
| 1143 if (net_log_.IsLoggingAllEvents() && entry_) |
| 1144 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_WRITE_INFO, NULL); |
| 1120 return WriteResponseInfoToEntry(true); | 1145 return WriteResponseInfoToEntry(true); |
| 1121 } | 1146 } |
| 1122 | 1147 |
| 1123 int HttpCache::Transaction::DoCacheWriteResponseComplete(int result) { | 1148 int HttpCache::Transaction::DoCacheWriteResponseComplete(int result) { |
| 1124 next_state_ = target_state_; | 1149 next_state_ = target_state_; |
| 1125 target_state_ = STATE_NONE; | 1150 target_state_ = STATE_NONE; |
| 1126 if (!entry_) | 1151 if (!entry_) |
| 1127 return OK; | 1152 return OK; |
| 1153 if (net_log_.IsLoggingAllEvents()) { |
| 1154 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_WRITE_INFO, |
| 1155 result); |
| 1156 } |
| 1128 | 1157 |
| 1129 // Balance the AddRef from WriteResponseInfoToEntry. | 1158 // Balance the AddRef from WriteResponseInfoToEntry. |
| 1130 write_headers_callback_->Release(); | 1159 write_headers_callback_->Release(); |
| 1131 if (result != io_buf_len_) { | 1160 if (result != io_buf_len_) { |
| 1132 DLOG(ERROR) << "failed to write response info to cache"; | 1161 DLOG(ERROR) << "failed to write response info to cache"; |
| 1133 DoneWritingToEntry(false); | 1162 DoneWritingToEntry(false); |
| 1134 } | 1163 } |
| 1135 return OK; | 1164 return OK; |
| 1136 } | 1165 } |
| 1137 | 1166 |
| 1138 int HttpCache::Transaction::DoCacheReadMetadata() { | 1167 int HttpCache::Transaction::DoCacheReadMetadata() { |
| 1139 DCHECK(entry_); | 1168 DCHECK(entry_); |
| 1140 DCHECK(!response_.metadata); | 1169 DCHECK(!response_.metadata); |
| 1141 next_state_ = STATE_CACHE_READ_METADATA_COMPLETE; | 1170 next_state_ = STATE_CACHE_READ_METADATA_COMPLETE; |
| 1142 | 1171 |
| 1143 response_.metadata = | 1172 response_.metadata = |
| 1144 new IOBufferWithSize(entry_->disk_entry->GetDataSize(kMetadataIndex)); | 1173 new IOBufferWithSize(entry_->disk_entry->GetDataSize(kMetadataIndex)); |
| 1145 | 1174 |
| 1146 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_READ_INFO, NULL); | 1175 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_READ_INFO, NULL); |
| 1147 cache_callback_->AddRef(); // Balanced in DoCacheReadMetadataComplete. | 1176 cache_callback_->AddRef(); // Balanced in DoCacheReadMetadataComplete. |
| 1148 return entry_->disk_entry->ReadData(kMetadataIndex, 0, response_.metadata, | 1177 return entry_->disk_entry->ReadData(kMetadataIndex, 0, response_.metadata, |
| 1149 response_.metadata->size(), | 1178 response_.metadata->size(), |
| 1150 cache_callback_); | 1179 cache_callback_); |
| 1151 } | 1180 } |
| 1152 | 1181 |
| 1153 int HttpCache::Transaction::DoCacheReadMetadataComplete(int result) { | 1182 int HttpCache::Transaction::DoCacheReadMetadataComplete(int result) { |
| 1154 cache_callback_->Release(); // Balance the AddRef from DoCacheReadMetadata. | 1183 cache_callback_->Release(); // Balance the AddRef from DoCacheReadMetadata. |
| 1155 net_log_.EndEvent(NetLog::TYPE_HTTP_CACHE_READ_INFO, NULL); | 1184 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_READ_INFO, result); |
| 1156 if (result != response_.metadata->size()) { | 1185 if (result != response_.metadata->size()) { |
| 1157 DLOG(ERROR) << "ReadData failed: " << result; | 1186 DLOG(ERROR) << "ReadData failed: " << result; |
| 1158 return ERR_CACHE_READ_FAILURE; | 1187 return ERR_CACHE_READ_FAILURE; |
| 1159 } | 1188 } |
| 1160 | 1189 |
| 1161 return OK; | 1190 return OK; |
| 1162 } | 1191 } |
| 1163 | 1192 |
| 1164 int HttpCache::Transaction::DoCacheQueryData() { | 1193 int HttpCache::Transaction::DoCacheQueryData() { |
| 1165 next_state_ = STATE_CACHE_QUERY_DATA_COMPLETE; | 1194 next_state_ = STATE_CACHE_QUERY_DATA_COMPLETE; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1176 if (!cache_) | 1205 if (!cache_) |
| 1177 return ERR_UNEXPECTED; | 1206 return ERR_UNEXPECTED; |
| 1178 | 1207 |
| 1179 return ValidateEntryHeadersAndContinue(true); | 1208 return ValidateEntryHeadersAndContinue(true); |
| 1180 } | 1209 } |
| 1181 | 1210 |
| 1182 int HttpCache::Transaction::DoCacheReadData() { | 1211 int HttpCache::Transaction::DoCacheReadData() { |
| 1183 DCHECK(entry_); | 1212 DCHECK(entry_); |
| 1184 next_state_ = STATE_CACHE_READ_DATA_COMPLETE; | 1213 next_state_ = STATE_CACHE_READ_DATA_COMPLETE; |
| 1185 cache_callback_->AddRef(); // Balanced in DoCacheReadDataComplete. | 1214 cache_callback_->AddRef(); // Balanced in DoCacheReadDataComplete. |
| 1215 |
| 1216 if (net_log_.IsLoggingAllEvents()) |
| 1217 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_READ_DATA, NULL); |
| 1186 if (partial_.get()) { | 1218 if (partial_.get()) { |
| 1187 return partial_->CacheRead(entry_->disk_entry, read_buf_, io_buf_len_, | 1219 return partial_->CacheRead(entry_->disk_entry, read_buf_, io_buf_len_, |
| 1188 cache_callback_); | 1220 cache_callback_); |
| 1189 } | 1221 } |
| 1190 | 1222 |
| 1191 return entry_->disk_entry->ReadData(kResponseContentIndex, read_offset_, | 1223 return entry_->disk_entry->ReadData(kResponseContentIndex, read_offset_, |
| 1192 read_buf_, io_buf_len_, cache_callback_); | 1224 read_buf_, io_buf_len_, cache_callback_); |
| 1193 } | 1225 } |
| 1194 | 1226 |
| 1195 int HttpCache::Transaction::DoCacheReadDataComplete(int result) { | 1227 int HttpCache::Transaction::DoCacheReadDataComplete(int result) { |
| 1196 cache_callback_->Release(); // Balance the AddRef from DoCacheReadData. | 1228 cache_callback_->Release(); // Balance the AddRef from DoCacheReadData. |
| 1229 if (net_log_.IsLoggingAllEvents()) { |
| 1230 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_READ_DATA, |
| 1231 result); |
| 1232 } |
| 1197 | 1233 |
| 1198 if (!cache_) | 1234 if (!cache_) |
| 1199 return ERR_UNEXPECTED; | 1235 return ERR_UNEXPECTED; |
| 1200 | 1236 |
| 1201 if (partial_.get()) | 1237 if (partial_.get()) |
| 1202 return DoPartialCacheReadCompleted(result); | 1238 return DoPartialCacheReadCompleted(result); |
| 1203 | 1239 |
| 1204 if (result > 0) { | 1240 if (result > 0) { |
| 1205 read_offset_ += result; | 1241 read_offset_ += result; |
| 1206 } else if (result == 0) { // End of file. | 1242 } else if (result == 0) { // End of file. |
| 1207 cache_->DoneReadingFromEntry(entry_, this); | 1243 cache_->DoneReadingFromEntry(entry_, this); |
| 1208 entry_ = NULL; | 1244 entry_ = NULL; |
| 1209 } | 1245 } |
| 1210 return result; | 1246 return result; |
| 1211 } | 1247 } |
| 1212 | 1248 |
| 1213 int HttpCache::Transaction::DoCacheWriteData(int num_bytes) { | 1249 int HttpCache::Transaction::DoCacheWriteData(int num_bytes) { |
| 1214 next_state_ = STATE_CACHE_WRITE_DATA_COMPLETE; | 1250 next_state_ = STATE_CACHE_WRITE_DATA_COMPLETE; |
| 1215 write_len_ = num_bytes; | 1251 write_len_ = num_bytes; |
| 1252 if (net_log_.IsLoggingAllEvents() && entry_) |
| 1253 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_WRITE_DATA, NULL); |
| 1216 cache_callback_->AddRef(); // Balanced in DoCacheWriteDataComplete. | 1254 cache_callback_->AddRef(); // Balanced in DoCacheWriteDataComplete. |
| 1217 | 1255 |
| 1218 return AppendResponseDataToEntry(read_buf_, num_bytes, cache_callback_); | 1256 return AppendResponseDataToEntry(read_buf_, num_bytes, cache_callback_); |
| 1219 } | 1257 } |
| 1220 | 1258 |
| 1221 int HttpCache::Transaction::DoCacheWriteDataComplete(int result) { | 1259 int HttpCache::Transaction::DoCacheWriteDataComplete(int result) { |
| 1260 if (net_log_.IsLoggingAllEvents() && entry_) { |
| 1261 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_WRITE_DATA, |
| 1262 result); |
| 1263 } |
| 1222 // Balance the AddRef from DoCacheWriteData. | 1264 // Balance the AddRef from DoCacheWriteData. |
| 1223 cache_callback_->Release(); | 1265 cache_callback_->Release(); |
| 1224 if (!cache_) | 1266 if (!cache_) |
| 1225 return ERR_UNEXPECTED; | 1267 return ERR_UNEXPECTED; |
| 1226 | 1268 |
| 1227 if (result != write_len_) { | 1269 if (result != write_len_) { |
| 1228 DLOG(ERROR) << "failed to write response data to cache"; | 1270 DLOG(ERROR) << "failed to write response data to cache"; |
| 1229 DoneWritingToEntry(false); | 1271 DoneWritingToEntry(false); |
| 1230 | 1272 |
| 1231 // We want to ignore errors writing to disk and just keep reading from | 1273 // We want to ignore errors writing to disk and just keep reading from |
| (...skipping 634 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1866 next_state_ = STATE_START_PARTIAL_CACHE_VALIDATION; | 1908 next_state_ = STATE_START_PARTIAL_CACHE_VALIDATION; |
| 1867 } | 1909 } |
| 1868 return result; | 1910 return result; |
| 1869 } | 1911 } |
| 1870 | 1912 |
| 1871 void HttpCache::Transaction::OnIOComplete(int result) { | 1913 void HttpCache::Transaction::OnIOComplete(int result) { |
| 1872 DoLoop(result); | 1914 DoLoop(result); |
| 1873 } | 1915 } |
| 1874 | 1916 |
| 1875 } // namespace net | 1917 } // namespace net |
| OLD | NEW |