| 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.h" | 5 #include "net/http/http_cache.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 #include "base/thread_task_runner_handle.h" | 27 #include "base/thread_task_runner_handle.h" |
| 28 #include "base/threading/worker_pool.h" | 28 #include "base/threading/worker_pool.h" |
| 29 #include "base/time/default_clock.h" | 29 #include "base/time/default_clock.h" |
| 30 #include "base/time/time.h" | 30 #include "base/time/time.h" |
| 31 #include "net/base/cache_type.h" | 31 #include "net/base/cache_type.h" |
| 32 #include "net/base/io_buffer.h" | 32 #include "net/base/io_buffer.h" |
| 33 #include "net/base/load_flags.h" | 33 #include "net/base/load_flags.h" |
| 34 #include "net/base/net_errors.h" | 34 #include "net/base/net_errors.h" |
| 35 #include "net/base/upload_data_stream.h" | 35 #include "net/base/upload_data_stream.h" |
| 36 #include "net/disk_cache/disk_cache.h" | 36 #include "net/disk_cache/disk_cache.h" |
| 37 #include "net/http/disk_based_cert_cache.h" | |
| 38 #include "net/http/disk_cache_based_quic_server_info.h" | 37 #include "net/http/disk_cache_based_quic_server_info.h" |
| 39 #include "net/http/http_cache_transaction.h" | 38 #include "net/http/http_cache_transaction.h" |
| 40 #include "net/http/http_network_layer.h" | 39 #include "net/http/http_network_layer.h" |
| 41 #include "net/http/http_network_session.h" | 40 #include "net/http/http_network_session.h" |
| 42 #include "net/http/http_request_info.h" | 41 #include "net/http/http_request_info.h" |
| 43 #include "net/http/http_response_headers.h" | 42 #include "net/http/http_response_headers.h" |
| 44 #include "net/http/http_response_info.h" | 43 #include "net/http/http_response_info.h" |
| 45 #include "net/http/http_util.h" | 44 #include "net/http/http_util.h" |
| 46 #include "net/quic/crypto/quic_server_info.h" | 45 #include "net/quic/crypto/quic_server_info.h" |
| 47 | 46 |
| 48 #if defined(OS_POSIX) | 47 #if defined(OS_POSIX) |
| 49 #include <unistd.h> | 48 #include <unistd.h> |
| 50 #endif | 49 #endif |
| 51 | 50 |
| 52 namespace { | |
| 53 | |
| 54 bool UseCertCache() { | |
| 55 return base::FieldTrialList::FindFullName("CertCacheTrial") == | |
| 56 "ExperimentGroup"; | |
| 57 } | |
| 58 | |
| 59 } // namespace | |
| 60 | |
| 61 namespace net { | 51 namespace net { |
| 62 | 52 |
| 63 HttpCache::DefaultBackend::DefaultBackend( | 53 HttpCache::DefaultBackend::DefaultBackend( |
| 64 CacheType type, | 54 CacheType type, |
| 65 BackendType backend_type, | 55 BackendType backend_type, |
| 66 const base::FilePath& path, | 56 const base::FilePath& path, |
| 67 int max_bytes, | 57 int max_bytes, |
| 68 const scoped_refptr<base::SingleThreadTaskRunner>& thread) | 58 const scoped_refptr<base::SingleThreadTaskRunner>& thread) |
| 69 : type_(type), | 59 : type_(type), |
| 70 backend_type_(backend_type), | 60 backend_type_(backend_type), |
| (...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 347 entry->pending_queue.clear(); | 337 entry->pending_queue.clear(); |
| 348 entry->readers.clear(); | 338 entry->readers.clear(); |
| 349 entry->writer = NULL; | 339 entry->writer = NULL; |
| 350 DeactivateEntry(entry); | 340 DeactivateEntry(entry); |
| 351 } | 341 } |
| 352 | 342 |
| 353 STLDeleteElements(&doomed_entries_); | 343 STLDeleteElements(&doomed_entries_); |
| 354 | 344 |
| 355 // Before deleting pending_ops_, we have to make sure that the disk cache is | 345 // Before deleting pending_ops_, we have to make sure that the disk cache is |
| 356 // done with said operations, or it will attempt to use deleted data. | 346 // done with said operations, or it will attempt to use deleted data. |
| 357 cert_cache_.reset(); | |
| 358 disk_cache_.reset(); | 347 disk_cache_.reset(); |
| 359 | 348 |
| 360 PendingOpsMap::iterator pending_it = pending_ops_.begin(); | 349 PendingOpsMap::iterator pending_it = pending_ops_.begin(); |
| 361 for (; pending_it != pending_ops_.end(); ++pending_it) { | 350 for (; pending_it != pending_ops_.end(); ++pending_it) { |
| 362 // We are not notifying the transactions about the cache going away, even | 351 // We are not notifying the transactions about the cache going away, even |
| 363 // though they are waiting for a callback that will never fire. | 352 // though they are waiting for a callback that will never fire. |
| 364 PendingOp* pending_op = pending_it->second; | 353 PendingOp* pending_op = pending_it->second; |
| 365 delete pending_op->writer; | 354 delete pending_op->writer; |
| 366 bool delete_pending_op = true; | 355 bool delete_pending_op = true; |
| 367 if (building_backend_) { | 356 if (building_backend_) { |
| (...skipping 769 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1137 // We don't need the callback anymore. | 1126 // We don't need the callback anymore. |
| 1138 pending_op->callback.Reset(); | 1127 pending_op->callback.Reset(); |
| 1139 | 1128 |
| 1140 if (backend_factory_.get()) { | 1129 if (backend_factory_.get()) { |
| 1141 // We may end up calling OnBackendCreated multiple times if we have pending | 1130 // We may end up calling OnBackendCreated multiple times if we have pending |
| 1142 // work items. The first call saves the backend and releases the factory, | 1131 // work items. The first call saves the backend and releases the factory, |
| 1143 // and the last call clears building_backend_. | 1132 // and the last call clears building_backend_. |
| 1144 backend_factory_.reset(); // Reclaim memory. | 1133 backend_factory_.reset(); // Reclaim memory. |
| 1145 if (result == OK) { | 1134 if (result == OK) { |
| 1146 disk_cache_ = std::move(pending_op->backend); | 1135 disk_cache_ = std::move(pending_op->backend); |
| 1147 if (UseCertCache()) | |
| 1148 cert_cache_.reset(new DiskBasedCertCache(disk_cache_.get())); | |
| 1149 } | 1136 } |
| 1150 } | 1137 } |
| 1151 | 1138 |
| 1152 if (!pending_op->pending_queue.empty()) { | 1139 if (!pending_op->pending_queue.empty()) { |
| 1153 WorkItem* pending_item = pending_op->pending_queue.front(); | 1140 WorkItem* pending_item = pending_op->pending_queue.front(); |
| 1154 pending_op->pending_queue.pop_front(); | 1141 pending_op->pending_queue.pop_front(); |
| 1155 DCHECK_EQ(WI_CREATE_BACKEND, pending_item->operation()); | 1142 DCHECK_EQ(WI_CREATE_BACKEND, pending_item->operation()); |
| 1156 | 1143 |
| 1157 // We want to process a single callback at a time, because the cache may | 1144 // We want to process a single callback at a time, because the cache may |
| 1158 // go away from the callback. | 1145 // go away from the callback. |
| 1159 pending_op->writer = pending_item; | 1146 pending_op->writer = pending_item; |
| 1160 | 1147 |
| 1161 base::ThreadTaskRunnerHandle::Get()->PostTask( | 1148 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 1162 FROM_HERE, base::Bind(&HttpCache::OnBackendCreated, GetWeakPtr(), | 1149 FROM_HERE, base::Bind(&HttpCache::OnBackendCreated, GetWeakPtr(), |
| 1163 result, pending_op)); | 1150 result, pending_op)); |
| 1164 } else { | 1151 } else { |
| 1165 building_backend_ = false; | 1152 building_backend_ = false; |
| 1166 DeletePendingOp(pending_op); | 1153 DeletePendingOp(pending_op); |
| 1167 } | 1154 } |
| 1168 | 1155 |
| 1169 // The cache may be gone when we return from the callback. | 1156 // The cache may be gone when we return from the callback. |
| 1170 if (!item->DoCallback(result, disk_cache_.get())) | 1157 if (!item->DoCallback(result, disk_cache_.get())) |
| 1171 item->NotifyTransaction(result, NULL); | 1158 item->NotifyTransaction(result, NULL); |
| 1172 } | 1159 } |
| 1173 | 1160 |
| 1174 } // namespace net | 1161 } // namespace net |
| OLD | NEW |