OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 | 8 |
9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
10 | 10 |
(...skipping 565 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
576 // When in record mode, we want to NEVER load from the cache. | 576 // When in record mode, we want to NEVER load from the cache. |
577 // The reason for this is beacuse we save the Set-Cookie headers | 577 // The reason for this is beacuse we save the Set-Cookie headers |
578 // (intentionally). If we read from the cache, we replay them | 578 // (intentionally). If we read from the cache, we replay them |
579 // prematurely. | 579 // prematurely. |
580 if (cache_->mode() == RECORD) | 580 if (cache_->mode() == RECORD) |
581 effective_load_flags_ |= LOAD_BYPASS_CACHE; | 581 effective_load_flags_ |= LOAD_BYPASS_CACHE; |
582 | 582 |
583 // If HttpCache has type MEDIA make sure LOAD_ENABLE_DOWNLOAD_FILE is set, | 583 // If HttpCache has type MEDIA make sure LOAD_ENABLE_DOWNLOAD_FILE is set, |
584 // otherwise make sure LOAD_ENABLE_DOWNLOAD_FILE is not set when HttpCache | 584 // otherwise make sure LOAD_ENABLE_DOWNLOAD_FILE is not set when HttpCache |
585 // has type other than MEDIA. | 585 // has type other than MEDIA. |
586 if (cache_->type() == HttpCache::MEDIA) { | 586 if (cache_->type() == MEDIA_CACHE) { |
587 DCHECK(effective_load_flags_ & LOAD_ENABLE_DOWNLOAD_FILE); | 587 DCHECK(effective_load_flags_ & LOAD_ENABLE_DOWNLOAD_FILE); |
588 } else { | 588 } else { |
589 DCHECK(!(effective_load_flags_ & LOAD_ENABLE_DOWNLOAD_FILE)); | 589 DCHECK(!(effective_load_flags_ & LOAD_ENABLE_DOWNLOAD_FILE)); |
590 } | 590 } |
591 | 591 |
592 // Some headers imply load flags. The order here is significant. | 592 // Some headers imply load flags. The order here is significant. |
593 // | 593 // |
594 // LOAD_DISABLE_CACHE : no cache read or write | 594 // LOAD_DISABLE_CACHE : no cache read or write |
595 // LOAD_BYPASS_CACHE : no cache read | 595 // LOAD_BYPASS_CACHE : no cache read |
596 // LOAD_VALIDATE_CACHE : no cache read unless validation | 596 // LOAD_VALIDATE_CACHE : no cache read unless validation |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
775 } | 775 } |
776 | 776 |
777 int HttpCache::Transaction::ReadResponseInfoFromEntry() { | 777 int HttpCache::Transaction::ReadResponseInfoFromEntry() { |
778 DCHECK(entry_); | 778 DCHECK(entry_); |
779 | 779 |
780 if (!HttpCache::ReadResponseInfo(entry_->disk_entry, &response_)) | 780 if (!HttpCache::ReadResponseInfo(entry_->disk_entry, &response_)) |
781 return ERR_FAILED; | 781 return ERR_FAILED; |
782 | 782 |
783 // If the cache object is used for media file, we want the file handle of | 783 // If the cache object is used for media file, we want the file handle of |
784 // response data. | 784 // response data. |
785 if (cache_->type() == HttpCache::MEDIA) { | 785 if (cache_->type() == MEDIA_CACHE) { |
786 response_.response_data_file = | 786 response_.response_data_file = |
787 entry_->disk_entry->GetPlatformFile(kResponseContentIndex); | 787 entry_->disk_entry->GetPlatformFile(kResponseContentIndex); |
788 } | 788 } |
789 | 789 |
790 return OK; | 790 return OK; |
791 } | 791 } |
792 | 792 |
793 void HttpCache::Transaction::WriteToEntry(int index, int offset, | 793 void HttpCache::Transaction::WriteToEntry(int index, int offset, |
794 IOBuffer* data, int data_len) { | 794 IOBuffer* data, int data_len) { |
795 if (!entry_) | 795 if (!entry_) |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
849 | 849 |
850 // If the cache is for media files, we try to prepare the response data | 850 // If the cache is for media files, we try to prepare the response data |
851 // file as an external file and truncate it afterwards. | 851 // file as an external file and truncate it afterwards. |
852 // Recipient of ResponseInfo should judge from |response_.response_data_file| | 852 // Recipient of ResponseInfo should judge from |response_.response_data_file| |
853 // to tell whether an external file of response data is available for reading | 853 // to tell whether an external file of response data is available for reading |
854 // or not. | 854 // or not. |
855 // TODO(hclam): we should prepare the target stream as extern file only | 855 // TODO(hclam): we should prepare the target stream as extern file only |
856 // if we get a valid response from server, i.e. 200. We don't want empty | 856 // if we get a valid response from server, i.e. 200. We don't want empty |
857 // cache files for redirection or external files for erroneous requests. | 857 // cache files for redirection or external files for erroneous requests. |
858 response_.response_data_file = base::kInvalidPlatformFileValue; | 858 response_.response_data_file = base::kInvalidPlatformFileValue; |
859 if (cache_->type() == HttpCache::MEDIA) { | 859 if (cache_->type() == MEDIA_CACHE) { |
860 response_.response_data_file = | 860 response_.response_data_file = |
861 entry_->disk_entry->UseExternalFile(kResponseContentIndex); | 861 entry_->disk_entry->UseExternalFile(kResponseContentIndex); |
862 } | 862 } |
863 | 863 |
864 // Truncate the stream. | 864 // Truncate the stream. |
865 WriteToEntry(kResponseContentIndex, 0, NULL, 0); | 865 WriteToEntry(kResponseContentIndex, 0, NULL, 0); |
866 } | 866 } |
867 | 867 |
868 void HttpCache::Transaction::DoneWritingToEntry(bool success) { | 868 void HttpCache::Transaction::DoneWritingToEntry(bool success) { |
869 if (!entry_) | 869 if (!entry_) |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
970 HandleResult(result); | 970 HandleResult(result); |
971 } | 971 } |
972 | 972 |
973 //----------------------------------------------------------------------------- | 973 //----------------------------------------------------------------------------- |
974 | 974 |
975 HttpCache::HttpCache(ProxyService* proxy_service, | 975 HttpCache::HttpCache(ProxyService* proxy_service, |
976 const std::wstring& cache_dir, | 976 const std::wstring& cache_dir, |
977 int cache_size) | 977 int cache_size) |
978 : disk_cache_dir_(cache_dir), | 978 : disk_cache_dir_(cache_dir), |
979 mode_(NORMAL), | 979 mode_(NORMAL), |
980 type_(COMMON), | 980 type_(DISK_CACHE), |
981 network_layer_(HttpNetworkLayer::CreateFactory(proxy_service)), | 981 network_layer_(HttpNetworkLayer::CreateFactory(proxy_service)), |
982 ALLOW_THIS_IN_INITIALIZER_LIST(task_factory_(this)), | 982 ALLOW_THIS_IN_INITIALIZER_LIST(task_factory_(this)), |
983 in_memory_cache_(false), | 983 in_memory_cache_(false), |
984 cache_size_(cache_size) { | 984 cache_size_(cache_size) { |
985 } | 985 } |
986 | 986 |
987 HttpCache::HttpCache(HttpNetworkSession* session, | 987 HttpCache::HttpCache(HttpNetworkSession* session, |
988 const std::wstring& cache_dir, | 988 const std::wstring& cache_dir, |
989 int cache_size) | 989 int cache_size) |
990 : disk_cache_dir_(cache_dir), | 990 : disk_cache_dir_(cache_dir), |
991 mode_(NORMAL), | 991 mode_(NORMAL), |
992 type_(COMMON), | 992 type_(DISK_CACHE), |
993 network_layer_(HttpNetworkLayer::CreateFactory(session)), | 993 network_layer_(HttpNetworkLayer::CreateFactory(session)), |
994 ALLOW_THIS_IN_INITIALIZER_LIST(task_factory_(this)), | 994 ALLOW_THIS_IN_INITIALIZER_LIST(task_factory_(this)), |
995 in_memory_cache_(false), | 995 in_memory_cache_(false), |
996 cache_size_(cache_size) { | 996 cache_size_(cache_size) { |
997 } | 997 } |
998 | 998 |
999 HttpCache::HttpCache(ProxyService* proxy_service, int cache_size) | 999 HttpCache::HttpCache(ProxyService* proxy_service, int cache_size) |
1000 : mode_(NORMAL), | 1000 : mode_(NORMAL), |
1001 type_(COMMON), | 1001 type_(MEMORY_CACHE), |
1002 network_layer_(HttpNetworkLayer::CreateFactory(proxy_service)), | 1002 network_layer_(HttpNetworkLayer::CreateFactory(proxy_service)), |
1003 ALLOW_THIS_IN_INITIALIZER_LIST(task_factory_(this)), | 1003 ALLOW_THIS_IN_INITIALIZER_LIST(task_factory_(this)), |
1004 in_memory_cache_(true), | 1004 in_memory_cache_(true), |
1005 cache_size_(cache_size) { | 1005 cache_size_(cache_size) { |
1006 } | 1006 } |
1007 | 1007 |
1008 HttpCache::HttpCache(HttpTransactionFactory* network_layer, | 1008 HttpCache::HttpCache(HttpTransactionFactory* network_layer, |
1009 disk_cache::Backend* disk_cache) | 1009 disk_cache::Backend* disk_cache) |
1010 : mode_(NORMAL), | 1010 : mode_(NORMAL), |
1011 type_(COMMON), | 1011 type_(DISK_CACHE), |
1012 network_layer_(network_layer), | 1012 network_layer_(network_layer), |
1013 disk_cache_(disk_cache), | 1013 disk_cache_(disk_cache), |
1014 ALLOW_THIS_IN_INITIALIZER_LIST(task_factory_(this)), | 1014 ALLOW_THIS_IN_INITIALIZER_LIST(task_factory_(this)), |
1015 in_memory_cache_(false), | 1015 in_memory_cache_(false), |
1016 cache_size_(0) { | 1016 cache_size_(0) { |
1017 } | 1017 } |
1018 | 1018 |
1019 HttpCache::~HttpCache() { | 1019 HttpCache::~HttpCache() { |
1020 // If we have any active entries remaining, then we need to deactivate them. | 1020 // If we have any active entries remaining, then we need to deactivate them. |
1021 // We may have some pending calls to OnProcessPendingQueue, but since those | 1021 // We may have some pending calls to OnProcessPendingQueue, but since those |
(...skipping 17 matching lines...) Expand all Loading... |
1039 // Do lazy initialization of disk cache if needed. | 1039 // Do lazy initialization of disk cache if needed. |
1040 if (!disk_cache_.get()) { | 1040 if (!disk_cache_.get()) { |
1041 DCHECK(cache_size_ >= 0); | 1041 DCHECK(cache_size_ >= 0); |
1042 if (in_memory_cache_) { | 1042 if (in_memory_cache_) { |
1043 // We may end up with no folder name and no cache if the initialization | 1043 // We may end up with no folder name and no cache if the initialization |
1044 // of the disk cache fails. We want to be sure that what we wanted to have | 1044 // of the disk cache fails. We want to be sure that what we wanted to have |
1045 // was an in-memory cache. | 1045 // was an in-memory cache. |
1046 disk_cache_.reset(disk_cache::CreateInMemoryCacheBackend(cache_size_)); | 1046 disk_cache_.reset(disk_cache::CreateInMemoryCacheBackend(cache_size_)); |
1047 } else if (!disk_cache_dir_.empty()) { | 1047 } else if (!disk_cache_dir_.empty()) { |
1048 disk_cache_.reset(disk_cache::CreateCacheBackend(disk_cache_dir_, true, | 1048 disk_cache_.reset(disk_cache::CreateCacheBackend(disk_cache_dir_, true, |
1049 cache_size_)); | 1049 cache_size_, type_)); |
1050 disk_cache_dir_.clear(); // Reclaim memory. | 1050 disk_cache_dir_.clear(); // Reclaim memory. |
1051 } | 1051 } |
1052 } | 1052 } |
1053 return new HttpCache::Transaction(this); | 1053 return new HttpCache::Transaction(this); |
1054 } | 1054 } |
1055 | 1055 |
1056 HttpCache* HttpCache::GetCache() { | 1056 HttpCache* HttpCache::GetCache() { |
1057 return this; | 1057 return this; |
1058 } | 1058 } |
1059 | 1059 |
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1477 return; // have to wait | 1477 return; // have to wait |
1478 | 1478 |
1479 entry->pending_queue.erase(entry->pending_queue.begin()); | 1479 entry->pending_queue.erase(entry->pending_queue.begin()); |
1480 | 1480 |
1481 AddTransactionToEntry(entry, next); | 1481 AddTransactionToEntry(entry, next); |
1482 } | 1482 } |
1483 | 1483 |
1484 //----------------------------------------------------------------------------- | 1484 //----------------------------------------------------------------------------- |
1485 | 1485 |
1486 } // namespace net | 1486 } // namespace net |
OLD | NEW |