Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(187)

Side by Side Diff: net/http/http_cache.cc

Issue 256090: Disk cache: Add a method to cancel pending sparse operations.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/disk_cache/sparse_control.cc ('k') | net/http/http_cache_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2009 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 <string> 8 #include <string>
9 9
10 #include "base/compiler_specific.h" 10 #include "base/compiler_specific.h"
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
183 truncated_(false), 183 truncated_(false),
184 read_offset_(0), 184 read_offset_(0),
185 effective_load_flags_(0), 185 effective_load_flags_(0),
186 final_upload_progress_(0), 186 final_upload_progress_(0),
187 ALLOW_THIS_IN_INITIALIZER_LIST( 187 ALLOW_THIS_IN_INITIALIZER_LIST(
188 network_info_callback_(this, &Transaction::OnNetworkInfoAvailable)), 188 network_info_callback_(this, &Transaction::OnNetworkInfoAvailable)),
189 ALLOW_THIS_IN_INITIALIZER_LIST( 189 ALLOW_THIS_IN_INITIALIZER_LIST(
190 network_read_callback_(this, &Transaction::OnNetworkReadCompleted)), 190 network_read_callback_(this, &Transaction::OnNetworkReadCompleted)),
191 ALLOW_THIS_IN_INITIALIZER_LIST( 191 ALLOW_THIS_IN_INITIALIZER_LIST(
192 cache_read_callback_(new CancelableCompletionCallback<Transaction>( 192 cache_read_callback_(new CancelableCompletionCallback<Transaction>(
193 this, &Transaction::OnCacheReadCompleted))) { 193 this, &Transaction::OnCacheReadCompleted))),
194 ALLOW_THIS_IN_INITIALIZER_LIST(
195 entry_ready_callback_(new CancelableCompletionCallback<Transaction>(
196 this, &Transaction::OnCacheEntryReady))) {
194 } 197 }
195 198
196 // Clean up the transaction. 199 // Clean up the transaction.
197 virtual ~Transaction(); 200 virtual ~Transaction();
198 201
199 // HttpTransaction methods: 202 // HttpTransaction methods:
200 virtual int Start(const HttpRequestInfo*, CompletionCallback*, LoadLog*); 203 virtual int Start(const HttpRequestInfo*, CompletionCallback*, LoadLog*);
201 virtual int RestartIgnoringLastError(CompletionCallback*); 204 virtual int RestartIgnoringLastError(CompletionCallback*);
202 virtual int RestartWithCertificate(X509Certificate* client_cert, 205 virtual int RestartWithCertificate(X509Certificate* client_cert,
203 CompletionCallback* callback); 206 CompletionCallback* callback);
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
273 // Called to begin reading from the cache. Returns network error code. 276 // Called to begin reading from the cache. Returns network error code.
274 int BeginCacheRead(); 277 int BeginCacheRead();
275 278
276 // Called to begin validating the cache entry. Returns network error code. 279 // Called to begin validating the cache entry. Returns network error code.
277 int BeginCacheValidation(); 280 int BeginCacheValidation();
278 281
279 // Called to begin validating an entry that stores partial content. Returns 282 // Called to begin validating an entry that stores partial content. Returns
280 // a network error code. 283 // a network error code.
281 int BeginPartialCacheValidation(); 284 int BeginPartialCacheValidation();
282 285
286 // Validates the entry headers against the requested range and continues with
287 // the validation of the rest of the entry. Returns a network error code.
288 int ValidateEntryHeadersAndContinue(bool byte_range_requested);
289
283 // Performs the cache validation for the next chunk of data stored by the 290 // Performs the cache validation for the next chunk of data stored by the
284 // cache. If this chunk is not currently stored, starts the network request 291 // cache. If this chunk is not currently stored, starts the network request
285 // to fetch it. Returns a network error code. 292 // to fetch it. Returns a network error code.
286 int ContinuePartialCacheValidation(); 293 int ContinuePartialCacheValidation();
287 294
288 // Called to start requests which were given an "if-modified-since" or 295 // Called to start requests which were given an "if-modified-since" or
289 // "if-none-match" validation header by the caller (NOT when the request was 296 // "if-none-match" validation header by the caller (NOT when the request was
290 // conditionalized internally in response to LOAD_VALIDATE_CACHE). 297 // conditionalized internally in response to LOAD_VALIDATE_CACHE).
291 // Returns a network error code. 298 // Returns a network error code.
292 int BeginExternallyConditionalizedRequest(); 299 int BeginExternallyConditionalizedRequest();
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
367 374
368 // Called to signal completion of the network transaction's Start method: 375 // Called to signal completion of the network transaction's Start method:
369 void OnNetworkInfoAvailable(int result); 376 void OnNetworkInfoAvailable(int result);
370 377
371 // Called to signal completion of the network transaction's Read method: 378 // Called to signal completion of the network transaction's Read method:
372 void OnNetworkReadCompleted(int result); 379 void OnNetworkReadCompleted(int result);
373 380
374 // Called to signal completion of the cache's ReadData method: 381 // Called to signal completion of the cache's ReadData method:
375 void OnCacheReadCompleted(int result); 382 void OnCacheReadCompleted(int result);
376 383
384 // Called to signal completion of the cache entry's ReadyForSparseIO method:
385 void OnCacheEntryReady(int result);
386
377 scoped_refptr<LoadLog> load_log_; 387 scoped_refptr<LoadLog> load_log_;
378 const HttpRequestInfo* request_; 388 const HttpRequestInfo* request_;
379 scoped_ptr<HttpRequestInfo> custom_request_; 389 scoped_ptr<HttpRequestInfo> custom_request_;
380 // If extra_headers specified a "if-modified-since" or "if-none-match", 390 // If extra_headers specified a "if-modified-since" or "if-none-match",
381 // |external_validation_| contains the value of that header. 391 // |external_validation_| contains the value of that header.
382 ValidationHeader external_validation_; 392 ValidationHeader external_validation_;
383 base::WeakPtr<HttpCache> cache_; 393 base::WeakPtr<HttpCache> cache_;
384 HttpCache::ActiveEntry* entry_; 394 HttpCache::ActiveEntry* entry_;
385 scoped_ptr<HttpTransaction> network_trans_; 395 scoped_ptr<HttpTransaction> network_trans_;
386 CompletionCallback* callback_; // Consumer's callback. 396 CompletionCallback* callback_; // Consumer's callback.
387 HttpResponseInfo response_; 397 HttpResponseInfo response_;
388 HttpResponseInfo auth_response_; 398 HttpResponseInfo auth_response_;
389 std::string cache_key_; 399 std::string cache_key_;
390 Mode mode_; 400 Mode mode_;
391 bool reading_; // We are already reading. 401 bool reading_; // We are already reading.
392 bool invalid_range_; // We may bypass the cache for this request. 402 bool invalid_range_; // We may bypass the cache for this request.
393 bool enable_range_support_; 403 bool enable_range_support_;
394 bool truncated_; // We don't have all the response data. 404 bool truncated_; // We don't have all the response data.
395 scoped_refptr<IOBuffer> read_buf_; 405 scoped_refptr<IOBuffer> read_buf_;
396 int read_buf_len_; 406 int read_buf_len_;
397 int read_offset_; 407 int read_offset_;
398 int effective_load_flags_; 408 int effective_load_flags_;
399 scoped_ptr<PartialData> partial_; // We are dealing with range requests. 409 scoped_ptr<PartialData> partial_; // We are dealing with range requests.
400 uint64 final_upload_progress_; 410 uint64 final_upload_progress_;
401 CompletionCallbackImpl<Transaction> network_info_callback_; 411 CompletionCallbackImpl<Transaction> network_info_callback_;
402 CompletionCallbackImpl<Transaction> network_read_callback_; 412 CompletionCallbackImpl<Transaction> network_read_callback_;
403 scoped_refptr<CancelableCompletionCallback<Transaction> > 413 scoped_refptr<CancelableCompletionCallback<Transaction> >
404 cache_read_callback_; 414 cache_read_callback_;
415 scoped_refptr<CancelableCompletionCallback<Transaction> >
416 entry_ready_callback_;
405 }; 417 };
406 418
407 HttpCache::Transaction::~Transaction() { 419 HttpCache::Transaction::~Transaction() {
408 if (cache_) { 420 if (cache_) {
409 if (entry_) { 421 if (entry_) {
410 bool cancel_request = reading_ && enable_range_support_; 422 bool cancel_request = reading_ && enable_range_support_;
411 if (cancel_request && !partial_.get()) 423 if (cancel_request) {
412 cancel_request &= (response_.headers->response_code() == 200); 424 if (partial_.get()) {
425 entry_->disk_entry->CancelSparseIO();
426 } else {
427 cancel_request &= (response_.headers->response_code() == 200);
428 }
429 }
413 430
414 cache_->DoneWithEntry(entry_, this, cancel_request); 431 cache_->DoneWithEntry(entry_, this, cancel_request);
415 } else { 432 } else {
416 cache_->RemovePendingTransaction(this); 433 cache_->RemovePendingTransaction(this);
417 } 434 }
418 } 435 }
419 436
420 // If there is an outstanding callback, mark it as cancelled so running it 437 // If there is an outstanding callback, mark it as cancelled so running it
421 // does nothing. 438 // does nothing.
422 cache_read_callback_->Cancel(); 439 cache_read_callback_->Cancel();
(...skipping 527 matching lines...) Expand 10 before | Expand all | Expand 10 after
950 } 967 }
951 968
952 if (response_.headers->response_code() != 206 && !partial_.get() && 969 if (response_.headers->response_code() != 206 && !partial_.get() &&
953 !truncated_) 970 !truncated_)
954 return BeginCacheValidation(); 971 return BeginCacheValidation();
955 972
956 if (!enable_range_support_) 973 if (!enable_range_support_)
957 return BeginCacheValidation(); 974 return BeginCacheValidation();
958 975
959 bool byte_range_requested = partial_.get() != NULL; 976 bool byte_range_requested = partial_.get() != NULL;
960 if (!byte_range_requested) { 977 if (byte_range_requested) {
978 if (OK != entry_->disk_entry->ReadyForSparseIO(entry_ready_callback_))
979 return ERR_IO_PENDING;
980 } else {
961 // The request is not for a range, but we have stored just ranges. 981 // The request is not for a range, but we have stored just ranges.
962 partial_.reset(new PartialData()); 982 partial_.reset(new PartialData());
963 if (!custom_request_.get()) { 983 if (!custom_request_.get()) {
964 custom_request_.reset(new HttpRequestInfo(*request_)); 984 custom_request_.reset(new HttpRequestInfo(*request_));
965 request_ = custom_request_.get(); 985 request_ = custom_request_.get();
966 } 986 }
967 } 987 }
968 988
989 return ValidateEntryHeadersAndContinue(byte_range_requested);
990 }
991
992 int HttpCache::Transaction::ValidateEntryHeadersAndContinue(
993 bool byte_range_requested) {
994 DCHECK(mode_ == READ_WRITE);
995
969 if (!partial_->UpdateFromStoredHeaders(response_.headers, entry_->disk_entry, 996 if (!partial_->UpdateFromStoredHeaders(response_.headers, entry_->disk_entry,
970 truncated_)) { 997 truncated_)) {
971 // The stored data cannot be used. Get rid of it and restart this request. 998 // The stored data cannot be used. Get rid of it and restart this request.
972 // We need to also reset the |truncated_| flag as a new entry is created. 999 // We need to also reset the |truncated_| flag as a new entry is created.
973 DoomPartialEntry(!byte_range_requested); 1000 DoomPartialEntry(!byte_range_requested);
974 mode_ = WRITE; 1001 mode_ = WRITE;
975 truncated_ = false; 1002 truncated_ = false;
976 return AddToEntry(); 1003 return AddToEntry();
977 } 1004 }
978 1005
(...skipping 595 matching lines...) Expand 10 before | Expand all | Expand 10 after
1574 } 1601 }
1575 1602
1576 void HttpCache::Transaction::OnNetworkReadCompleted(int result) { 1603 void HttpCache::Transaction::OnNetworkReadCompleted(int result) {
1577 DoNetworkReadCompleted(result); 1604 DoNetworkReadCompleted(result);
1578 } 1605 }
1579 1606
1580 void HttpCache::Transaction::OnCacheReadCompleted(int result) { 1607 void HttpCache::Transaction::OnCacheReadCompleted(int result) {
1581 DoCacheReadCompleted(result); 1608 DoCacheReadCompleted(result);
1582 } 1609 }
1583 1610
1611 void HttpCache::Transaction::OnCacheEntryReady(int result) {
1612 DCHECK_EQ(OK, result);
1613 ValidateEntryHeadersAndContinue(true);
1614 }
1615
1584 //----------------------------------------------------------------------------- 1616 //-----------------------------------------------------------------------------
1585 1617
1586 HttpCache::HttpCache(HostResolver* host_resolver, 1618 HttpCache::HttpCache(HostResolver* host_resolver,
1587 ProxyService* proxy_service, 1619 ProxyService* proxy_service,
1588 SSLConfigService* ssl_config_service, 1620 SSLConfigService* ssl_config_service,
1589 const std::wstring& cache_dir, 1621 const std::wstring& cache_dir,
1590 int cache_size) 1622 int cache_size)
1591 : disk_cache_dir_(cache_dir), 1623 : disk_cache_dir_(cache_dir),
1592 mode_(NORMAL), 1624 mode_(NORMAL),
1593 type_(DISK_CACHE), 1625 type_(DISK_CACHE),
(...skipping 535 matching lines...) Expand 10 before | Expand all | Expand 10 after
2129 static_cast<net::HttpNetworkLayer*>(network_layer_.get()); 2161 static_cast<net::HttpNetworkLayer*>(network_layer_.get());
2130 HttpNetworkSession* session = network->GetSession(); 2162 HttpNetworkSession* session = network->GetSession();
2131 if (session) { 2163 if (session) {
2132 session->tcp_socket_pool()->CloseIdleSockets(); 2164 session->tcp_socket_pool()->CloseIdleSockets();
2133 } 2165 }
2134 } 2166 }
2135 2167
2136 //----------------------------------------------------------------------------- 2168 //-----------------------------------------------------------------------------
2137 2169
2138 } // namespace net 2170 } // namespace net
OLDNEW
« no previous file with comments | « net/disk_cache/sparse_control.cc ('k') | net/http/http_cache_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698