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 #include "net/http/http_cache_transaction.h" | 5 #include "net/http/http_cache_transaction.h" |
6 | 6 |
7 #include "build/build_config.h" // For OS_POSIX | 7 #include "build/build_config.h" // For OS_POSIX |
8 | 8 |
9 #if defined(OS_POSIX) | 9 #if defined(OS_POSIX) |
10 #include <unistd.h> | 10 #include <unistd.h> |
(...skipping 21 matching lines...) Expand all Loading... |
32 #include "net/base/auth.h" | 32 #include "net/base/auth.h" |
33 #include "net/base/load_flags.h" | 33 #include "net/base/load_flags.h" |
34 #include "net/base/load_timing_info.h" | 34 #include "net/base/load_timing_info.h" |
35 #include "net/base/upload_data_stream.h" | 35 #include "net/base/upload_data_stream.h" |
36 #include "net/cert/cert_status_flags.h" | 36 #include "net/cert/cert_status_flags.h" |
37 #include "net/cert/x509_certificate.h" | 37 #include "net/cert/x509_certificate.h" |
38 #include "net/disk_cache/disk_cache.h" | 38 #include "net/disk_cache/disk_cache.h" |
39 #include "net/http/http_network_session.h" | 39 #include "net/http/http_network_session.h" |
40 #include "net/http/http_request_info.h" | 40 #include "net/http/http_request_info.h" |
41 #include "net/http/http_util.h" | 41 #include "net/http/http_util.h" |
| 42 #include "net/log/net_log_event_type.h" |
42 #include "net/ssl/ssl_cert_request_info.h" | 43 #include "net/ssl/ssl_cert_request_info.h" |
43 #include "net/ssl/ssl_config_service.h" | 44 #include "net/ssl/ssl_config_service.h" |
44 | 45 |
45 using base::Time; | 46 using base::Time; |
46 using base::TimeDelta; | 47 using base::TimeDelta; |
47 using base::TimeTicks; | 48 using base::TimeTicks; |
48 | 49 |
49 namespace net { | 50 namespace net { |
50 | 51 |
51 using CacheEntryStatus = HttpResponseInfo::CacheEntryStatus; | 52 using CacheEntryStatus = HttpResponseInfo::CacheEntryStatus; |
(...skipping 818 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
870 read_buf_ = NULL; // Release the buffer before invoking the callback. | 871 read_buf_ = NULL; // Release the buffer before invoking the callback. |
871 base::ResetAndReturn(&callback_).Run(rv); | 872 base::ResetAndReturn(&callback_).Run(rv); |
872 } | 873 } |
873 | 874 |
874 return rv; | 875 return rv; |
875 } | 876 } |
876 | 877 |
877 int HttpCache::Transaction::DoGetBackend() { | 878 int HttpCache::Transaction::DoGetBackend() { |
878 cache_pending_ = true; | 879 cache_pending_ = true; |
879 next_state_ = STATE_GET_BACKEND_COMPLETE; | 880 next_state_ = STATE_GET_BACKEND_COMPLETE; |
880 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_GET_BACKEND); | 881 net_log_.BeginEvent(NetLogEventType::HTTP_CACHE_GET_BACKEND); |
881 return cache_->GetBackendForTransaction(this); | 882 return cache_->GetBackendForTransaction(this); |
882 } | 883 } |
883 | 884 |
884 int HttpCache::Transaction::DoGetBackendComplete(int result) { | 885 int HttpCache::Transaction::DoGetBackendComplete(int result) { |
885 DCHECK(result == OK || result == ERR_FAILED); | 886 DCHECK(result == OK || result == ERR_FAILED); |
886 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_GET_BACKEND, | 887 net_log_.EndEventWithNetErrorCode(NetLogEventType::HTTP_CACHE_GET_BACKEND, |
887 result); | 888 result); |
888 cache_pending_ = false; | 889 cache_pending_ = false; |
889 | 890 |
890 if (!ShouldPassThrough()) { | 891 if (!ShouldPassThrough()) { |
891 cache_key_ = cache_->GenerateCacheKey(request_); | 892 cache_key_ = cache_->GenerateCacheKey(request_); |
892 | 893 |
893 // Requested cache access mode. | 894 // Requested cache access mode. |
894 if (effective_load_flags_ & LOAD_ONLY_FROM_CACHE) { | 895 if (effective_load_flags_ & LOAD_ONLY_FROM_CACHE) { |
895 mode_ = READ; | 896 mode_ = READ; |
896 } else if (effective_load_flags_ & LOAD_BYPASS_CACHE) { | 897 } else if (effective_load_flags_ & LOAD_BYPASS_CACHE) { |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
958 } | 959 } |
959 | 960 |
960 next_state_ = STATE_OPEN_ENTRY; | 961 next_state_ = STATE_OPEN_ENTRY; |
961 return OK; | 962 return OK; |
962 } | 963 } |
963 | 964 |
964 int HttpCache::Transaction::DoOpenEntry() { | 965 int HttpCache::Transaction::DoOpenEntry() { |
965 DCHECK(!new_entry_); | 966 DCHECK(!new_entry_); |
966 next_state_ = STATE_OPEN_ENTRY_COMPLETE; | 967 next_state_ = STATE_OPEN_ENTRY_COMPLETE; |
967 cache_pending_ = true; | 968 cache_pending_ = true; |
968 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_OPEN_ENTRY); | 969 net_log_.BeginEvent(NetLogEventType::HTTP_CACHE_OPEN_ENTRY); |
969 first_cache_access_since_ = TimeTicks::Now(); | 970 first_cache_access_since_ = TimeTicks::Now(); |
970 return cache_->OpenEntry(cache_key_, &new_entry_, this); | 971 return cache_->OpenEntry(cache_key_, &new_entry_, this); |
971 } | 972 } |
972 | 973 |
973 int HttpCache::Transaction::DoOpenEntryComplete(int result) { | 974 int HttpCache::Transaction::DoOpenEntryComplete(int result) { |
974 // It is important that we go to STATE_ADD_TO_ENTRY whenever the result is | 975 // It is important that we go to STATE_ADD_TO_ENTRY whenever the result is |
975 // OK, otherwise the cache will end up with an active entry without any | 976 // OK, otherwise the cache will end up with an active entry without any |
976 // transaction attached. | 977 // transaction attached. |
977 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_OPEN_ENTRY, result); | 978 net_log_.EndEventWithNetErrorCode(NetLogEventType::HTTP_CACHE_OPEN_ENTRY, |
| 979 result); |
978 cache_pending_ = false; | 980 cache_pending_ = false; |
979 if (result == OK) { | 981 if (result == OK) { |
980 next_state_ = STATE_ADD_TO_ENTRY; | 982 next_state_ = STATE_ADD_TO_ENTRY; |
981 return OK; | 983 return OK; |
982 } | 984 } |
983 | 985 |
984 if (result == ERR_CACHE_RACE) { | 986 if (result == ERR_CACHE_RACE) { |
985 next_state_ = STATE_INIT_ENTRY; | 987 next_state_ = STATE_INIT_ENTRY; |
986 return OK; | 988 return OK; |
987 } | 989 } |
(...skipping 21 matching lines...) Expand all Loading... |
1009 // The entry does not exist, and we are not permitted to create a new entry, | 1011 // The entry does not exist, and we are not permitted to create a new entry, |
1010 // so we must fail. | 1012 // so we must fail. |
1011 return ERR_CACHE_MISS; | 1013 return ERR_CACHE_MISS; |
1012 } | 1014 } |
1013 | 1015 |
1014 int HttpCache::Transaction::DoDoomEntry() { | 1016 int HttpCache::Transaction::DoDoomEntry() { |
1015 next_state_ = STATE_DOOM_ENTRY_COMPLETE; | 1017 next_state_ = STATE_DOOM_ENTRY_COMPLETE; |
1016 cache_pending_ = true; | 1018 cache_pending_ = true; |
1017 if (first_cache_access_since_.is_null()) | 1019 if (first_cache_access_since_.is_null()) |
1018 first_cache_access_since_ = TimeTicks::Now(); | 1020 first_cache_access_since_ = TimeTicks::Now(); |
1019 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_DOOM_ENTRY); | 1021 net_log_.BeginEvent(NetLogEventType::HTTP_CACHE_DOOM_ENTRY); |
1020 return cache_->DoomEntry(cache_key_, this); | 1022 return cache_->DoomEntry(cache_key_, this); |
1021 } | 1023 } |
1022 | 1024 |
1023 int HttpCache::Transaction::DoDoomEntryComplete(int result) { | 1025 int HttpCache::Transaction::DoDoomEntryComplete(int result) { |
1024 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_DOOM_ENTRY, result); | 1026 net_log_.EndEventWithNetErrorCode(NetLogEventType::HTTP_CACHE_DOOM_ENTRY, |
| 1027 result); |
1025 next_state_ = STATE_CREATE_ENTRY; | 1028 next_state_ = STATE_CREATE_ENTRY; |
1026 cache_pending_ = false; | 1029 cache_pending_ = false; |
1027 if (result == ERR_CACHE_RACE) | 1030 if (result == ERR_CACHE_RACE) |
1028 next_state_ = STATE_INIT_ENTRY; | 1031 next_state_ = STATE_INIT_ENTRY; |
1029 return OK; | 1032 return OK; |
1030 } | 1033 } |
1031 | 1034 |
1032 int HttpCache::Transaction::DoCreateEntry() { | 1035 int HttpCache::Transaction::DoCreateEntry() { |
1033 DCHECK(!new_entry_); | 1036 DCHECK(!new_entry_); |
1034 next_state_ = STATE_CREATE_ENTRY_COMPLETE; | 1037 next_state_ = STATE_CREATE_ENTRY_COMPLETE; |
1035 cache_pending_ = true; | 1038 cache_pending_ = true; |
1036 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_CREATE_ENTRY); | 1039 net_log_.BeginEvent(NetLogEventType::HTTP_CACHE_CREATE_ENTRY); |
1037 return cache_->CreateEntry(cache_key_, &new_entry_, this); | 1040 return cache_->CreateEntry(cache_key_, &new_entry_, this); |
1038 } | 1041 } |
1039 | 1042 |
1040 int HttpCache::Transaction::DoCreateEntryComplete(int result) { | 1043 int HttpCache::Transaction::DoCreateEntryComplete(int result) { |
1041 // It is important that we go to STATE_ADD_TO_ENTRY whenever the result is | 1044 // It is important that we go to STATE_ADD_TO_ENTRY whenever the result is |
1042 // OK, otherwise the cache will end up with an active entry without any | 1045 // OK, otherwise the cache will end up with an active entry without any |
1043 // transaction attached. | 1046 // transaction attached. |
1044 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_CREATE_ENTRY, | 1047 net_log_.EndEventWithNetErrorCode(NetLogEventType::HTTP_CACHE_CREATE_ENTRY, |
1045 result); | 1048 result); |
1046 cache_pending_ = false; | 1049 cache_pending_ = false; |
1047 switch (result) { | 1050 switch (result) { |
1048 case OK: | 1051 case OK: |
1049 next_state_ = STATE_ADD_TO_ENTRY; | 1052 next_state_ = STATE_ADD_TO_ENTRY; |
1050 break; | 1053 break; |
1051 | 1054 |
1052 case ERR_CACHE_RACE: | 1055 case ERR_CACHE_RACE: |
1053 next_state_ = STATE_INIT_ENTRY; | 1056 next_state_ = STATE_INIT_ENTRY; |
1054 break; | 1057 break; |
1055 | 1058 |
1056 default: | 1059 default: |
1057 // We have a race here: Maybe we failed to open the entry and decided to | 1060 // We have a race here: Maybe we failed to open the entry and decided to |
1058 // create one, but by the time we called create, another transaction | 1061 // create one, but by the time we called create, another transaction |
1059 // already created the entry. If we want to eliminate this issue, we | 1062 // already created the entry. If we want to eliminate this issue, we |
1060 // need an atomic OpenOrCreate() method exposed by the disk cache. | 1063 // need an atomic OpenOrCreate() method exposed by the disk cache. |
1061 DLOG(WARNING) << "Unable to create cache entry"; | 1064 DLOG(WARNING) << "Unable to create cache entry"; |
1062 mode_ = NONE; | 1065 mode_ = NONE; |
1063 if (partial_) | 1066 if (partial_) |
1064 partial_->RestoreHeaders(&custom_request_->extra_headers); | 1067 partial_->RestoreHeaders(&custom_request_->extra_headers); |
1065 next_state_ = STATE_SEND_REQUEST; | 1068 next_state_ = STATE_SEND_REQUEST; |
1066 } | 1069 } |
1067 return OK; | 1070 return OK; |
1068 } | 1071 } |
1069 | 1072 |
1070 int HttpCache::Transaction::DoAddToEntry() { | 1073 int HttpCache::Transaction::DoAddToEntry() { |
1071 DCHECK(new_entry_); | 1074 DCHECK(new_entry_); |
1072 cache_pending_ = true; | 1075 cache_pending_ = true; |
1073 next_state_ = STATE_ADD_TO_ENTRY_COMPLETE; | 1076 next_state_ = STATE_ADD_TO_ENTRY_COMPLETE; |
1074 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_ADD_TO_ENTRY); | 1077 net_log_.BeginEvent(NetLogEventType::HTTP_CACHE_ADD_TO_ENTRY); |
1075 DCHECK(entry_lock_waiting_since_.is_null()); | 1078 DCHECK(entry_lock_waiting_since_.is_null()); |
1076 entry_lock_waiting_since_ = TimeTicks::Now(); | 1079 entry_lock_waiting_since_ = TimeTicks::Now(); |
1077 int rv = cache_->AddTransactionToEntry(new_entry_, this); | 1080 int rv = cache_->AddTransactionToEntry(new_entry_, this); |
1078 if (rv == ERR_IO_PENDING) { | 1081 if (rv == ERR_IO_PENDING) { |
1079 if (bypass_lock_for_test_) { | 1082 if (bypass_lock_for_test_) { |
1080 OnAddToEntryTimeout(entry_lock_waiting_since_); | 1083 OnAddToEntryTimeout(entry_lock_waiting_since_); |
1081 } else { | 1084 } else { |
1082 int timeout_milliseconds = 20 * 1000; | 1085 int timeout_milliseconds = 20 * 1000; |
1083 if (partial_ && new_entry_->writer && | 1086 if (partial_ && new_entry_->writer && |
1084 new_entry_->writer->range_requested_) { | 1087 new_entry_->writer->range_requested_) { |
(...skipping 17 matching lines...) Expand all Loading... |
1102 FROM_HERE, | 1105 FROM_HERE, |
1103 base::Bind(&HttpCache::Transaction::OnAddToEntryTimeout, | 1106 base::Bind(&HttpCache::Transaction::OnAddToEntryTimeout, |
1104 weak_factory_.GetWeakPtr(), entry_lock_waiting_since_), | 1107 weak_factory_.GetWeakPtr(), entry_lock_waiting_since_), |
1105 TimeDelta::FromMilliseconds(timeout_milliseconds)); | 1108 TimeDelta::FromMilliseconds(timeout_milliseconds)); |
1106 } | 1109 } |
1107 } | 1110 } |
1108 return rv; | 1111 return rv; |
1109 } | 1112 } |
1110 | 1113 |
1111 int HttpCache::Transaction::DoAddToEntryComplete(int result) { | 1114 int HttpCache::Transaction::DoAddToEntryComplete(int result) { |
1112 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_ADD_TO_ENTRY, | 1115 net_log_.EndEventWithNetErrorCode(NetLogEventType::HTTP_CACHE_ADD_TO_ENTRY, |
1113 result); | 1116 result); |
1114 const TimeDelta entry_lock_wait = | 1117 const TimeDelta entry_lock_wait = |
1115 TimeTicks::Now() - entry_lock_waiting_since_; | 1118 TimeTicks::Now() - entry_lock_waiting_since_; |
1116 UMA_HISTOGRAM_TIMES("HttpCache.EntryLockWait", entry_lock_wait); | 1119 UMA_HISTOGRAM_TIMES("HttpCache.EntryLockWait", entry_lock_wait); |
1117 | 1120 |
1118 entry_lock_waiting_since_ = TimeTicks(); | 1121 entry_lock_waiting_since_ = TimeTicks(); |
1119 DCHECK(new_entry_); | 1122 DCHECK(new_entry_); |
1120 cache_pending_ = false; | 1123 cache_pending_ = false; |
1121 | 1124 |
1122 if (result == OK) | 1125 if (result == OK) |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1160 return OK; | 1163 return OK; |
1161 } | 1164 } |
1162 | 1165 |
1163 int HttpCache::Transaction::DoCacheReadResponse() { | 1166 int HttpCache::Transaction::DoCacheReadResponse() { |
1164 DCHECK(entry_); | 1167 DCHECK(entry_); |
1165 next_state_ = STATE_CACHE_READ_RESPONSE_COMPLETE; | 1168 next_state_ = STATE_CACHE_READ_RESPONSE_COMPLETE; |
1166 | 1169 |
1167 io_buf_len_ = entry_->disk_entry->GetDataSize(kResponseInfoIndex); | 1170 io_buf_len_ = entry_->disk_entry->GetDataSize(kResponseInfoIndex); |
1168 read_buf_ = new IOBuffer(io_buf_len_); | 1171 read_buf_ = new IOBuffer(io_buf_len_); |
1169 | 1172 |
1170 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_READ_INFO); | 1173 net_log_.BeginEvent(NetLogEventType::HTTP_CACHE_READ_INFO); |
1171 return entry_->disk_entry->ReadData(kResponseInfoIndex, 0, read_buf_.get(), | 1174 return entry_->disk_entry->ReadData(kResponseInfoIndex, 0, read_buf_.get(), |
1172 io_buf_len_, io_callback_); | 1175 io_buf_len_, io_callback_); |
1173 } | 1176 } |
1174 | 1177 |
1175 int HttpCache::Transaction::DoCacheReadResponseComplete(int result) { | 1178 int HttpCache::Transaction::DoCacheReadResponseComplete(int result) { |
1176 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_READ_INFO, result); | 1179 net_log_.EndEventWithNetErrorCode(NetLogEventType::HTTP_CACHE_READ_INFO, |
| 1180 result); |
1177 if (result != io_buf_len_ || | 1181 if (result != io_buf_len_ || |
1178 !HttpCache::ParseResponseInfo(read_buf_->data(), io_buf_len_, &response_, | 1182 !HttpCache::ParseResponseInfo(read_buf_->data(), io_buf_len_, &response_, |
1179 &truncated_)) { | 1183 &truncated_)) { |
1180 return OnCacheReadError(result, true); | 1184 return OnCacheReadError(result, true); |
1181 } | 1185 } |
1182 | 1186 |
1183 int current_size = entry_->disk_entry->GetDataSize(kResponseContentIndex); | 1187 int current_size = entry_->disk_entry->GetDataSize(kResponseContentIndex); |
1184 int64_t full_response_length = response_.headers->GetContentLength(); | 1188 int64_t full_response_length = response_.headers->GetContentLength(); |
1185 | 1189 |
1186 // Some resources may have slipped in as truncated when they're not. | 1190 // Some resources may have slipped in as truncated when they're not. |
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1416 ResetNetworkTransaction(); | 1420 ResetNetworkTransaction(); |
1417 return ERR_CACHE_AUTH_FAILURE_AFTER_READ; | 1421 return ERR_CACHE_AUTH_FAILURE_AFTER_READ; |
1418 } | 1422 } |
1419 | 1423 |
1420 new_response_ = new_response; | 1424 new_response_ = new_response; |
1421 if (!ValidatePartialResponse() && !auth_response_.headers.get()) { | 1425 if (!ValidatePartialResponse() && !auth_response_.headers.get()) { |
1422 // Something went wrong with this request and we have to restart it. | 1426 // Something went wrong with this request and we have to restart it. |
1423 // If we have an authentication response, we are exposed to weird things | 1427 // If we have an authentication response, we are exposed to weird things |
1424 // hapenning if the user cancels the authentication before we receive | 1428 // hapenning if the user cancels the authentication before we receive |
1425 // the new response. | 1429 // the new response. |
1426 net_log_.AddEvent(NetLog::TYPE_HTTP_CACHE_RE_SEND_PARTIAL_REQUEST); | 1430 net_log_.AddEvent(NetLogEventType::HTTP_CACHE_RE_SEND_PARTIAL_REQUEST); |
1427 UpdateCacheEntryStatus(CacheEntryStatus::ENTRY_OTHER); | 1431 UpdateCacheEntryStatus(CacheEntryStatus::ENTRY_OTHER); |
1428 SetResponse(HttpResponseInfo()); | 1432 SetResponse(HttpResponseInfo()); |
1429 ResetNetworkTransaction(); | 1433 ResetNetworkTransaction(); |
1430 new_response_ = NULL; | 1434 new_response_ = NULL; |
1431 next_state_ = STATE_SEND_REQUEST; | 1435 next_state_ = STATE_SEND_REQUEST; |
1432 return OK; | 1436 return OK; |
1433 } | 1437 } |
1434 | 1438 |
1435 if (handling_206_ && mode_ == READ_WRITE && !truncated_ && !is_sparse_) { | 1439 if (handling_206_ && mode_ == READ_WRITE && !truncated_ && !is_sparse_) { |
1436 // We have stored the full entry, but it changed and the server is | 1440 // We have stored the full entry, but it changed and the server is |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1610 int HttpCache::Transaction::DoCacheWriteResponseComplete(int result) { | 1614 int HttpCache::Transaction::DoCacheWriteResponseComplete(int result) { |
1611 next_state_ = STATE_TRUNCATE_CACHED_DATA; | 1615 next_state_ = STATE_TRUNCATE_CACHED_DATA; |
1612 return OnWriteResponseInfoToEntryComplete(result); | 1616 return OnWriteResponseInfoToEntryComplete(result); |
1613 } | 1617 } |
1614 | 1618 |
1615 int HttpCache::Transaction::DoTruncateCachedData() { | 1619 int HttpCache::Transaction::DoTruncateCachedData() { |
1616 next_state_ = STATE_TRUNCATE_CACHED_DATA_COMPLETE; | 1620 next_state_ = STATE_TRUNCATE_CACHED_DATA_COMPLETE; |
1617 if (!entry_) | 1621 if (!entry_) |
1618 return OK; | 1622 return OK; |
1619 if (net_log_.IsCapturing()) | 1623 if (net_log_.IsCapturing()) |
1620 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_WRITE_DATA); | 1624 net_log_.BeginEvent(NetLogEventType::HTTP_CACHE_WRITE_DATA); |
1621 // Truncate the stream. | 1625 // Truncate the stream. |
1622 return WriteToEntry(kResponseContentIndex, 0, NULL, 0, io_callback_); | 1626 return WriteToEntry(kResponseContentIndex, 0, NULL, 0, io_callback_); |
1623 } | 1627 } |
1624 | 1628 |
1625 int HttpCache::Transaction::DoTruncateCachedDataComplete(int result) { | 1629 int HttpCache::Transaction::DoTruncateCachedDataComplete(int result) { |
1626 if (entry_) { | 1630 if (entry_) { |
1627 if (net_log_.IsCapturing()) { | 1631 if (net_log_.IsCapturing()) { |
1628 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_WRITE_DATA, | 1632 net_log_.EndEventWithNetErrorCode(NetLogEventType::HTTP_CACHE_WRITE_DATA, |
1629 result); | 1633 result); |
1630 } | 1634 } |
1631 } | 1635 } |
1632 | 1636 |
1633 next_state_ = STATE_TRUNCATE_CACHED_METADATA; | 1637 next_state_ = STATE_TRUNCATE_CACHED_METADATA; |
1634 return OK; | 1638 return OK; |
1635 } | 1639 } |
1636 | 1640 |
1637 int HttpCache::Transaction::DoTruncateCachedMetadata() { | 1641 int HttpCache::Transaction::DoTruncateCachedMetadata() { |
1638 next_state_ = STATE_TRUNCATE_CACHED_METADATA_COMPLETE; | 1642 next_state_ = STATE_TRUNCATE_CACHED_METADATA_COMPLETE; |
1639 if (!entry_) | 1643 if (!entry_) |
1640 return OK; | 1644 return OK; |
1641 | 1645 |
1642 if (net_log_.IsCapturing()) | 1646 if (net_log_.IsCapturing()) |
1643 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_WRITE_INFO); | 1647 net_log_.BeginEvent(NetLogEventType::HTTP_CACHE_WRITE_INFO); |
1644 return WriteToEntry(kMetadataIndex, 0, NULL, 0, io_callback_); | 1648 return WriteToEntry(kMetadataIndex, 0, NULL, 0, io_callback_); |
1645 } | 1649 } |
1646 | 1650 |
1647 int HttpCache::Transaction::DoTruncateCachedMetadataComplete(int result) { | 1651 int HttpCache::Transaction::DoTruncateCachedMetadataComplete(int result) { |
1648 if (entry_) { | 1652 if (entry_) { |
1649 if (net_log_.IsCapturing()) { | 1653 if (net_log_.IsCapturing()) { |
1650 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_WRITE_INFO, | 1654 net_log_.EndEventWithNetErrorCode(NetLogEventType::HTTP_CACHE_WRITE_INFO, |
1651 result); | 1655 result); |
1652 } | 1656 } |
1653 } | 1657 } |
1654 | 1658 |
1655 next_state_ = STATE_PARTIAL_HEADERS_RECEIVED; | 1659 next_state_ = STATE_PARTIAL_HEADERS_RECEIVED; |
1656 return OK; | 1660 return OK; |
1657 } | 1661 } |
1658 | 1662 |
1659 int HttpCache::Transaction::DoPartialHeadersReceived() { | 1663 int HttpCache::Transaction::DoPartialHeadersReceived() { |
1660 new_response_ = NULL; | 1664 new_response_ = NULL; |
(...skipping 18 matching lines...) Expand all Loading... |
1679 } | 1683 } |
1680 | 1684 |
1681 int HttpCache::Transaction::DoCacheReadMetadata() { | 1685 int HttpCache::Transaction::DoCacheReadMetadata() { |
1682 DCHECK(entry_); | 1686 DCHECK(entry_); |
1683 DCHECK(!response_.metadata.get()); | 1687 DCHECK(!response_.metadata.get()); |
1684 next_state_ = STATE_CACHE_READ_METADATA_COMPLETE; | 1688 next_state_ = STATE_CACHE_READ_METADATA_COMPLETE; |
1685 | 1689 |
1686 response_.metadata = | 1690 response_.metadata = |
1687 new IOBufferWithSize(entry_->disk_entry->GetDataSize(kMetadataIndex)); | 1691 new IOBufferWithSize(entry_->disk_entry->GetDataSize(kMetadataIndex)); |
1688 | 1692 |
1689 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_READ_INFO); | 1693 net_log_.BeginEvent(NetLogEventType::HTTP_CACHE_READ_INFO); |
1690 return entry_->disk_entry->ReadData(kMetadataIndex, 0, | 1694 return entry_->disk_entry->ReadData(kMetadataIndex, 0, |
1691 response_.metadata.get(), | 1695 response_.metadata.get(), |
1692 response_.metadata->size(), | 1696 response_.metadata->size(), |
1693 io_callback_); | 1697 io_callback_); |
1694 } | 1698 } |
1695 | 1699 |
1696 int HttpCache::Transaction::DoCacheReadMetadataComplete(int result) { | 1700 int HttpCache::Transaction::DoCacheReadMetadataComplete(int result) { |
1697 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_READ_INFO, result); | 1701 net_log_.EndEventWithNetErrorCode(NetLogEventType::HTTP_CACHE_READ_INFO, |
| 1702 result); |
1698 if (result != response_.metadata->size()) | 1703 if (result != response_.metadata->size()) |
1699 return OnCacheReadError(result, false); | 1704 return OnCacheReadError(result, false); |
1700 return OK; | 1705 return OK; |
1701 } | 1706 } |
1702 | 1707 |
1703 int HttpCache::Transaction::DoNetworkRead() { | 1708 int HttpCache::Transaction::DoNetworkRead() { |
1704 next_state_ = STATE_NETWORK_READ_COMPLETE; | 1709 next_state_ = STATE_NETWORK_READ_COMPLETE; |
1705 return network_trans_->Read(read_buf_.get(), io_buf_len_, io_callback_); | 1710 return network_trans_->Read(read_buf_.get(), io_buf_len_, io_callback_); |
1706 } | 1711 } |
1707 | 1712 |
(...skipping 13 matching lines...) Expand all Loading... |
1721 } | 1726 } |
1722 | 1727 |
1723 int HttpCache::Transaction::DoCacheReadData() { | 1728 int HttpCache::Transaction::DoCacheReadData() { |
1724 if (request_->method == "HEAD") | 1729 if (request_->method == "HEAD") |
1725 return 0; | 1730 return 0; |
1726 | 1731 |
1727 DCHECK(entry_); | 1732 DCHECK(entry_); |
1728 next_state_ = STATE_CACHE_READ_DATA_COMPLETE; | 1733 next_state_ = STATE_CACHE_READ_DATA_COMPLETE; |
1729 | 1734 |
1730 if (net_log_.IsCapturing()) | 1735 if (net_log_.IsCapturing()) |
1731 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_READ_DATA); | 1736 net_log_.BeginEvent(NetLogEventType::HTTP_CACHE_READ_DATA); |
1732 if (partial_) { | 1737 if (partial_) { |
1733 return partial_->CacheRead(entry_->disk_entry, read_buf_.get(), io_buf_len_, | 1738 return partial_->CacheRead(entry_->disk_entry, read_buf_.get(), io_buf_len_, |
1734 io_callback_); | 1739 io_callback_); |
1735 } | 1740 } |
1736 | 1741 |
1737 return entry_->disk_entry->ReadData(kResponseContentIndex, read_offset_, | 1742 return entry_->disk_entry->ReadData(kResponseContentIndex, read_offset_, |
1738 read_buf_.get(), io_buf_len_, | 1743 read_buf_.get(), io_buf_len_, |
1739 io_callback_); | 1744 io_callback_); |
1740 } | 1745 } |
1741 | 1746 |
1742 int HttpCache::Transaction::DoCacheReadDataComplete(int result) { | 1747 int HttpCache::Transaction::DoCacheReadDataComplete(int result) { |
1743 if (net_log_.IsCapturing()) { | 1748 if (net_log_.IsCapturing()) { |
1744 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_READ_DATA, | 1749 net_log_.EndEventWithNetErrorCode(NetLogEventType::HTTP_CACHE_READ_DATA, |
1745 result); | 1750 result); |
1746 } | 1751 } |
1747 | 1752 |
1748 if (!cache_.get()) | 1753 if (!cache_.get()) |
1749 return ERR_UNEXPECTED; | 1754 return ERR_UNEXPECTED; |
1750 | 1755 |
1751 if (partial_) { | 1756 if (partial_) { |
1752 // Partial requests are confusing to report in histograms because they may | 1757 // Partial requests are confusing to report in histograms because they may |
1753 // have multiple underlying requests. | 1758 // have multiple underlying requests. |
1754 UpdateCacheEntryStatus(CacheEntryStatus::ENTRY_OTHER); | 1759 UpdateCacheEntryStatus(CacheEntryStatus::ENTRY_OTHER); |
(...skipping 10 matching lines...) Expand all Loading... |
1765 return OnCacheReadError(result, false); | 1770 return OnCacheReadError(result, false); |
1766 } | 1771 } |
1767 return result; | 1772 return result; |
1768 } | 1773 } |
1769 | 1774 |
1770 int HttpCache::Transaction::DoCacheWriteData(int num_bytes) { | 1775 int HttpCache::Transaction::DoCacheWriteData(int num_bytes) { |
1771 next_state_ = STATE_CACHE_WRITE_DATA_COMPLETE; | 1776 next_state_ = STATE_CACHE_WRITE_DATA_COMPLETE; |
1772 write_len_ = num_bytes; | 1777 write_len_ = num_bytes; |
1773 if (entry_) { | 1778 if (entry_) { |
1774 if (net_log_.IsCapturing()) | 1779 if (net_log_.IsCapturing()) |
1775 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_WRITE_DATA); | 1780 net_log_.BeginEvent(NetLogEventType::HTTP_CACHE_WRITE_DATA); |
1776 } | 1781 } |
1777 | 1782 |
1778 if (!entry_ || !num_bytes) | 1783 if (!entry_ || !num_bytes) |
1779 return num_bytes; | 1784 return num_bytes; |
1780 | 1785 |
1781 int current_size = entry_->disk_entry->GetDataSize(kResponseContentIndex); | 1786 int current_size = entry_->disk_entry->GetDataSize(kResponseContentIndex); |
1782 return WriteToEntry(kResponseContentIndex, current_size, read_buf_.get(), | 1787 return WriteToEntry(kResponseContentIndex, current_size, read_buf_.get(), |
1783 num_bytes, io_callback_); | 1788 num_bytes, io_callback_); |
1784 } | 1789 } |
1785 | 1790 |
1786 int HttpCache::Transaction::DoCacheWriteDataComplete(int result) { | 1791 int HttpCache::Transaction::DoCacheWriteDataComplete(int result) { |
1787 if (entry_) { | 1792 if (entry_) { |
1788 if (net_log_.IsCapturing()) { | 1793 if (net_log_.IsCapturing()) { |
1789 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_WRITE_DATA, | 1794 net_log_.EndEventWithNetErrorCode(NetLogEventType::HTTP_CACHE_WRITE_DATA, |
1790 result); | 1795 result); |
1791 } | 1796 } |
1792 } | 1797 } |
1793 if (!cache_.get()) | 1798 if (!cache_.get()) |
1794 return ERR_UNEXPECTED; | 1799 return ERR_UNEXPECTED; |
1795 | 1800 |
1796 if (result != write_len_) { | 1801 if (result != write_len_) { |
1797 DLOG(ERROR) << "failed to write response data to cache"; | 1802 DLOG(ERROR) << "failed to write response data to cache"; |
1798 DoneWritingToEntry(false); | 1803 DoneWritingToEntry(false); |
1799 | 1804 |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1893 } | 1898 } |
1894 external_validation_.values[i] = validation_value; | 1899 external_validation_.values[i] = validation_value; |
1895 external_validation_.initialized = true; | 1900 external_validation_.initialized = true; |
1896 } | 1901 } |
1897 } | 1902 } |
1898 | 1903 |
1899 if (range_found || special_headers || external_validation_.initialized) { | 1904 if (range_found || special_headers || external_validation_.initialized) { |
1900 // Log the headers before request_ is modified. | 1905 // Log the headers before request_ is modified. |
1901 std::string empty; | 1906 std::string empty; |
1902 net_log_.AddEvent( | 1907 net_log_.AddEvent( |
1903 NetLog::TYPE_HTTP_CACHE_CALLER_REQUEST_HEADERS, | 1908 NetLogEventType::HTTP_CACHE_CALLER_REQUEST_HEADERS, |
1904 base::Bind(&HttpRequestHeaders::NetLogCallback, | 1909 base::Bind(&HttpRequestHeaders::NetLogCallback, |
1905 base::Unretained(&request_->extra_headers), &empty)); | 1910 base::Unretained(&request_->extra_headers), &empty)); |
1906 } | 1911 } |
1907 | 1912 |
1908 // We don't support ranges and validation headers. | 1913 // We don't support ranges and validation headers. |
1909 if (range_found && external_validation_.initialized) { | 1914 if (range_found && external_validation_.initialized) { |
1910 LOG(WARNING) << "Byte ranges AND validation headers found."; | 1915 LOG(WARNING) << "Byte ranges AND validation headers found."; |
1911 effective_load_flags_ |= LOAD_DISABLE_CACHE; | 1916 effective_load_flags_ |= LOAD_DISABLE_CACHE; |
1912 } | 1917 } |
1913 | 1918 |
(...skipping 602 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2516 rv = partial_->CacheWrite(entry_->disk_entry, data, data_len, callback); | 2521 rv = partial_->CacheWrite(entry_->disk_entry, data, data_len, callback); |
2517 } | 2522 } |
2518 return rv; | 2523 return rv; |
2519 } | 2524 } |
2520 | 2525 |
2521 int HttpCache::Transaction::WriteResponseInfoToEntry(bool truncated) { | 2526 int HttpCache::Transaction::WriteResponseInfoToEntry(bool truncated) { |
2522 if (!entry_) | 2527 if (!entry_) |
2523 return OK; | 2528 return OK; |
2524 | 2529 |
2525 if (net_log_.IsCapturing()) | 2530 if (net_log_.IsCapturing()) |
2526 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_WRITE_INFO); | 2531 net_log_.BeginEvent(NetLogEventType::HTTP_CACHE_WRITE_INFO); |
2527 | 2532 |
2528 // Do not cache no-store content. Do not cache content with cert errors | 2533 // Do not cache no-store content. Do not cache content with cert errors |
2529 // either. This is to prevent not reporting net errors when loading a | 2534 // either. This is to prevent not reporting net errors when loading a |
2530 // resource from the cache. When we load a page over HTTPS with a cert error | 2535 // resource from the cache. When we load a page over HTTPS with a cert error |
2531 // we show an SSL blocking page. If the user clicks proceed we reload the | 2536 // we show an SSL blocking page. If the user clicks proceed we reload the |
2532 // resource ignoring the errors. The loaded resource is then cached. If that | 2537 // resource ignoring the errors. The loaded resource is then cached. If that |
2533 // resource is subsequently loaded from the cache, no net error is reported | 2538 // resource is subsequently loaded from the cache, no net error is reported |
2534 // (even though the cert status contains the actual errors) and no SSL | 2539 // (even though the cert status contains the actual errors) and no SSL |
2535 // blocking page is shown. An alternative would be to reverse-map the cert | 2540 // blocking page is shown. An alternative would be to reverse-map the cert |
2536 // status to a net error and replay the net error. | 2541 // status to a net error and replay the net error. |
2537 if ((response_.headers->HasHeaderValue("cache-control", "no-store")) || | 2542 if ((response_.headers->HasHeaderValue("cache-control", "no-store")) || |
2538 IsCertStatusError(response_.ssl_info.cert_status)) { | 2543 IsCertStatusError(response_.ssl_info.cert_status)) { |
2539 DoneWritingToEntry(false); | 2544 DoneWritingToEntry(false); |
2540 if (net_log_.IsCapturing()) | 2545 if (net_log_.IsCapturing()) |
2541 net_log_.EndEvent(NetLog::TYPE_HTTP_CACHE_WRITE_INFO); | 2546 net_log_.EndEvent(NetLogEventType::HTTP_CACHE_WRITE_INFO); |
2542 return OK; | 2547 return OK; |
2543 } | 2548 } |
2544 | 2549 |
2545 if (truncated) | 2550 if (truncated) |
2546 DCHECK_EQ(200, response_.headers->response_code()); | 2551 DCHECK_EQ(200, response_.headers->response_code()); |
2547 | 2552 |
2548 // When writing headers, we normally only write the non-transient headers. | 2553 // When writing headers, we normally only write the non-transient headers. |
2549 bool skip_transient_headers = true; | 2554 bool skip_transient_headers = true; |
2550 scoped_refptr<PickledIOBuffer> data(new PickledIOBuffer()); | 2555 scoped_refptr<PickledIOBuffer> data(new PickledIOBuffer()); |
2551 response_.Persist(data->pickle(), skip_transient_headers, truncated); | 2556 response_.Persist(data->pickle(), skip_transient_headers, truncated); |
2552 data->Done(); | 2557 data->Done(); |
2553 | 2558 |
2554 io_buf_len_ = data->pickle()->size(); | 2559 io_buf_len_ = data->pickle()->size(); |
2555 return entry_->disk_entry->WriteData(kResponseInfoIndex, 0, data.get(), | 2560 return entry_->disk_entry->WriteData(kResponseInfoIndex, 0, data.get(), |
2556 io_buf_len_, io_callback_, true); | 2561 io_buf_len_, io_callback_, true); |
2557 } | 2562 } |
2558 | 2563 |
2559 int HttpCache::Transaction::OnWriteResponseInfoToEntryComplete(int result) { | 2564 int HttpCache::Transaction::OnWriteResponseInfoToEntryComplete(int result) { |
2560 if (!entry_) | 2565 if (!entry_) |
2561 return OK; | 2566 return OK; |
2562 if (net_log_.IsCapturing()) { | 2567 if (net_log_.IsCapturing()) { |
2563 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_HTTP_CACHE_WRITE_INFO, | 2568 net_log_.EndEventWithNetErrorCode(NetLogEventType::HTTP_CACHE_WRITE_INFO, |
2564 result); | 2569 result); |
2565 } | 2570 } |
2566 | 2571 |
2567 if (result != io_buf_len_) { | 2572 if (result != io_buf_len_) { |
2568 DLOG(ERROR) << "failed to write response info to cache"; | 2573 DLOG(ERROR) << "failed to write response info to cache"; |
2569 DoneWritingToEntry(false); | 2574 DoneWritingToEntry(false); |
2570 } | 2575 } |
2571 return OK; | 2576 return OK; |
2572 } | 2577 } |
2573 | 2578 |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2654 // We need to move on to the next range. | 2659 // We need to move on to the next range. |
2655 next_state_ = STATE_START_PARTIAL_CACHE_VALIDATION; | 2660 next_state_ = STATE_START_PARTIAL_CACHE_VALIDATION; |
2656 } else if (result < 0) { | 2661 } else if (result < 0) { |
2657 return OnCacheReadError(result, false); | 2662 return OnCacheReadError(result, false); |
2658 } | 2663 } |
2659 return result; | 2664 return result; |
2660 } | 2665 } |
2661 | 2666 |
2662 int HttpCache::Transaction::DoRestartPartialRequest() { | 2667 int HttpCache::Transaction::DoRestartPartialRequest() { |
2663 // The stored data cannot be used. Get rid of it and restart this request. | 2668 // The stored data cannot be used. Get rid of it and restart this request. |
2664 net_log_.AddEvent(NetLog::TYPE_HTTP_CACHE_RESTART_PARTIAL_REQUEST); | 2669 net_log_.AddEvent(NetLogEventType::HTTP_CACHE_RESTART_PARTIAL_REQUEST); |
2665 | 2670 |
2666 // WRITE + Doom + STATE_INIT_ENTRY == STATE_CREATE_ENTRY (without an attempt | 2671 // WRITE + Doom + STATE_INIT_ENTRY == STATE_CREATE_ENTRY (without an attempt |
2667 // to Doom the entry again). | 2672 // to Doom the entry again). |
2668 mode_ = WRITE; | 2673 mode_ = WRITE; |
2669 ResetPartialState(!range_requested_); | 2674 ResetPartialState(!range_requested_); |
2670 next_state_ = STATE_CREATE_ENTRY; | 2675 next_state_ = STATE_CREATE_ENTRY; |
2671 return OK; | 2676 return OK; |
2672 } | 2677 } |
2673 | 2678 |
2674 void HttpCache::Transaction::ResetPartialState(bool delete_object) { | 2679 void HttpCache::Transaction::ResetPartialState(bool delete_object) { |
(...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3015 default: | 3020 default: |
3016 NOTREACHED(); | 3021 NOTREACHED(); |
3017 } | 3022 } |
3018 } | 3023 } |
3019 | 3024 |
3020 void HttpCache::Transaction::OnIOComplete(int result) { | 3025 void HttpCache::Transaction::OnIOComplete(int result) { |
3021 DoLoop(result); | 3026 DoLoop(result); |
3022 } | 3027 } |
3023 | 3028 |
3024 } // namespace net | 3029 } // namespace net |
OLD | NEW |