| 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 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 159 done_reading_(false), | 159 done_reading_(false), |
| 160 vary_mismatch_(false), | 160 vary_mismatch_(false), |
| 161 couldnt_conditionalize_request_(false), | 161 couldnt_conditionalize_request_(false), |
| 162 bypass_lock_for_test_(false), | 162 bypass_lock_for_test_(false), |
| 163 fail_conditionalization_for_test_(false), | 163 fail_conditionalization_for_test_(false), |
| 164 io_buf_len_(0), | 164 io_buf_len_(0), |
| 165 read_offset_(0), | 165 read_offset_(0), |
| 166 effective_load_flags_(0), | 166 effective_load_flags_(0), |
| 167 write_len_(0), | 167 write_len_(0), |
| 168 transaction_pattern_(PATTERN_UNDEFINED), | 168 transaction_pattern_(PATTERN_UNDEFINED), |
| 169 validation_cause_(VALIDATION_CAUSE_UNDEFINED), |
| 169 total_received_bytes_(0), | 170 total_received_bytes_(0), |
| 170 total_sent_bytes_(0), | 171 total_sent_bytes_(0), |
| 171 websocket_handshake_stream_base_create_helper_(NULL), | 172 websocket_handshake_stream_base_create_helper_(NULL), |
| 172 weak_factory_(this) { | 173 weak_factory_(this) { |
| 173 static_assert(HttpCache::Transaction::kNumValidationHeaders == | 174 static_assert(HttpCache::Transaction::kNumValidationHeaders == |
| 174 arraysize(kValidationHeaders), | 175 arraysize(kValidationHeaders), |
| 175 "invalid number of validation headers"); | 176 "invalid number of validation headers"); |
| 176 | 177 |
| 177 io_callback_ = base::Bind(&Transaction::OnIOComplete, | 178 io_callback_ = base::Bind(&Transaction::OnIOComplete, |
| 178 weak_factory_.GetWeakPtr()); | 179 weak_factory_.GetWeakPtr()); |
| (...skipping 1972 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2151 | 2152 |
| 2152 ValidationType HttpCache::Transaction::RequiresValidation() { | 2153 ValidationType HttpCache::Transaction::RequiresValidation() { |
| 2153 // TODO(darin): need to do more work here: | 2154 // TODO(darin): need to do more work here: |
| 2154 // - make sure we have a matching request method | 2155 // - make sure we have a matching request method |
| 2155 // - watch out for cached responses that depend on authentication | 2156 // - watch out for cached responses that depend on authentication |
| 2156 | 2157 |
| 2157 if (response_.vary_data.is_valid() && | 2158 if (response_.vary_data.is_valid() && |
| 2158 !response_.vary_data.MatchesRequest(*request_, | 2159 !response_.vary_data.MatchesRequest(*request_, |
| 2159 *response_.headers.get())) { | 2160 *response_.headers.get())) { |
| 2160 vary_mismatch_ = true; | 2161 vary_mismatch_ = true; |
| 2162 validation_cause_ = VALIDATION_CAUSE_VARY_MISMATCH; |
| 2161 return VALIDATION_SYNCHRONOUS; | 2163 return VALIDATION_SYNCHRONOUS; |
| 2162 } | 2164 } |
| 2163 | 2165 |
| 2164 if (effective_load_flags_ & LOAD_PREFERRING_CACHE) | 2166 if (effective_load_flags_ & LOAD_PREFERRING_CACHE) |
| 2165 return VALIDATION_NONE; | 2167 return VALIDATION_NONE; |
| 2166 | 2168 |
| 2167 if (response_.unused_since_prefetch && | 2169 if (response_.unused_since_prefetch && |
| 2168 !(effective_load_flags_ & LOAD_PREFETCH) && | 2170 !(effective_load_flags_ & LOAD_PREFETCH) && |
| 2169 response_.headers->GetCurrentAge( | 2171 response_.headers->GetCurrentAge( |
| 2170 response_.request_time, response_.response_time, | 2172 response_.request_time, response_.response_time, |
| 2171 cache_->clock_->Now()) < TimeDelta::FromMinutes(kPrefetchReuseMins)) { | 2173 cache_->clock_->Now()) < TimeDelta::FromMinutes(kPrefetchReuseMins)) { |
| 2172 // The first use of a resource after prefetch within a short window skips | 2174 // The first use of a resource after prefetch within a short window skips |
| 2173 // validation. | 2175 // validation. |
| 2174 return VALIDATION_NONE; | 2176 return VALIDATION_NONE; |
| 2175 } | 2177 } |
| 2176 | 2178 |
| 2177 if (effective_load_flags_ & LOAD_VALIDATE_CACHE) | 2179 if (effective_load_flags_ & LOAD_VALIDATE_CACHE) { |
| 2180 validation_cause_ = VALIDATION_CAUSE_VALIDATE_FLAG; |
| 2178 return VALIDATION_SYNCHRONOUS; | 2181 return VALIDATION_SYNCHRONOUS; |
| 2182 } |
| 2179 | 2183 |
| 2180 if (request_->method == "PUT" || request_->method == "DELETE") | 2184 if (request_->method == "PUT" || request_->method == "DELETE") |
| 2181 return VALIDATION_SYNCHRONOUS; | 2185 return VALIDATION_SYNCHRONOUS; |
| 2182 | 2186 |
| 2183 ValidationType validation_required_by_headers = | 2187 ValidationType validation_required_by_headers = |
| 2184 response_.headers->RequiresValidation(response_.request_time, | 2188 response_.headers->RequiresValidation(response_.request_time, |
| 2185 response_.response_time, | 2189 response_.response_time, |
| 2186 cache_->clock_->Now()); | 2190 cache_->clock_->Now()); |
| 2187 | 2191 |
| 2192 if (validation_required_by_headers != VALIDATION_NONE) { |
| 2193 validation_cause_ = |
| 2194 response_.headers->GetFreshnessLifetimes(response_.response_time) |
| 2195 .freshness == base::TimeDelta() |
| 2196 ? VALIDATION_CAUSE_ZERO_FRESHNESS |
| 2197 : VALIDATION_CAUSE_STALE; |
| 2198 } |
| 2199 |
| 2188 if (validation_required_by_headers == VALIDATION_ASYNCHRONOUS) { | 2200 if (validation_required_by_headers == VALIDATION_ASYNCHRONOUS) { |
| 2189 // Asynchronous revalidation is only supported for GET methods. | 2201 // Asynchronous revalidation is only supported for GET methods. |
| 2190 if (request_->method != "GET") | 2202 if (request_->method != "GET") |
| 2191 return VALIDATION_SYNCHRONOUS; | 2203 return VALIDATION_SYNCHRONOUS; |
| 2192 } | 2204 } |
| 2193 | 2205 |
| 2194 return validation_required_by_headers; | 2206 return validation_required_by_headers; |
| 2195 } | 2207 } |
| 2196 | 2208 |
| 2197 bool HttpCache::Transaction::ConditionalizeRequest() { | 2209 bool HttpCache::Transaction::ConditionalizeRequest() { |
| (...skipping 500 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2698 } | 2710 } |
| 2699 | 2711 |
| 2700 void HttpCache::Transaction::RecordHistograms() { | 2712 void HttpCache::Transaction::RecordHistograms() { |
| 2701 DCHECK_NE(PATTERN_UNDEFINED, transaction_pattern_); | 2713 DCHECK_NE(PATTERN_UNDEFINED, transaction_pattern_); |
| 2702 if (!cache_.get() || !cache_->GetCurrentBackend() || | 2714 if (!cache_.get() || !cache_->GetCurrentBackend() || |
| 2703 cache_->GetCurrentBackend()->GetCacheType() != DISK_CACHE || | 2715 cache_->GetCurrentBackend()->GetCacheType() != DISK_CACHE || |
| 2704 cache_->mode() != NORMAL || request_->method != "GET") { | 2716 cache_->mode() != NORMAL || request_->method != "GET") { |
| 2705 return; | 2717 return; |
| 2706 } | 2718 } |
| 2707 | 2719 |
| 2720 bool validation_request = transaction_pattern_ == PATTERN_ENTRY_VALIDATED || |
| 2721 transaction_pattern_ == PATTERN_ENTRY_UPDATED; |
| 2708 std::string mime_type; | 2722 std::string mime_type; |
| 2709 HttpResponseHeaders* response_headers = GetResponseInfo()->headers.get(); | 2723 HttpResponseHeaders* response_headers = GetResponseInfo()->headers.get(); |
| 2710 if (response_headers && response_headers->GetMimeType(&mime_type)) { | 2724 if (response_headers && response_headers->GetMimeType(&mime_type)) { |
| 2711 // Record the cache pattern by resource type. The type is inferred by | 2725 // Record the cache pattern by resource type. The type is inferred by |
| 2712 // response header mime type, which could be incorrect, so this is just an | 2726 // response header mime type, which could be incorrect, so this is just an |
| 2713 // estimate. | 2727 // estimate. |
| 2714 if (mime_type == "text/html" && (request_->load_flags & LOAD_MAIN_FRAME)) { | 2728 if (mime_type == "text/html" && (request_->load_flags & LOAD_MAIN_FRAME)) { |
| 2715 UMA_HISTOGRAM_ENUMERATION(std::string("HttpCache.Pattern.MainFrameHTML"), | 2729 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.MainFrameHTML", |
| 2716 transaction_pattern_, PATTERN_MAX); | 2730 transaction_pattern_, PATTERN_MAX); |
| 2731 if (validation_request) { |
| 2732 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.MainFrameHTML", |
| 2733 validation_cause_, VALIDATION_CAUSE_MAX); |
| 2734 } |
| 2717 } else if (mime_type == "text/html") { | 2735 } else if (mime_type == "text/html") { |
| 2718 UMA_HISTOGRAM_ENUMERATION( | 2736 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.NonMainFrameHTML", |
| 2719 std::string("HttpCache.Pattern.NonMainFrameHTML"), | 2737 transaction_pattern_, PATTERN_MAX); |
| 2720 transaction_pattern_, PATTERN_MAX); | 2738 if (validation_request) { |
| 2739 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.NonMainFrameHTML", |
| 2740 validation_cause_, VALIDATION_CAUSE_MAX); |
| 2741 } |
| 2721 } else if (mime_type == "text/css") { | 2742 } else if (mime_type == "text/css") { |
| 2722 UMA_HISTOGRAM_ENUMERATION(std::string("HttpCache.Pattern.CSS"), | 2743 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.CSS", transaction_pattern_, |
| 2723 transaction_pattern_, PATTERN_MAX); | 2744 PATTERN_MAX); |
| 2745 if (validation_request) { |
| 2746 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.CSS", |
| 2747 validation_cause_, VALIDATION_CAUSE_MAX); |
| 2748 } |
| 2724 } else if (base::StartsWith(mime_type, "image/", | 2749 } else if (base::StartsWith(mime_type, "image/", |
| 2725 base::CompareCase::SENSITIVE)) { | 2750 base::CompareCase::SENSITIVE)) { |
| 2726 int64_t content_length = response_headers->GetContentLength(); | 2751 int64_t content_length = response_headers->GetContentLength(); |
| 2727 if (content_length >= 0 && content_length < 100) { | 2752 if (content_length >= 0 && content_length < 100) { |
| 2728 UMA_HISTOGRAM_ENUMERATION(std::string("HttpCache.Pattern.TinyImage"), | 2753 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.TinyImage", |
| 2729 transaction_pattern_, PATTERN_MAX); | 2754 transaction_pattern_, PATTERN_MAX); |
| 2755 if (validation_request) { |
| 2756 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.TinyImage", |
| 2757 validation_cause_, VALIDATION_CAUSE_MAX); |
| 2758 } |
| 2730 } else if (content_length >= 100) { | 2759 } else if (content_length >= 100) { |
| 2731 UMA_HISTOGRAM_ENUMERATION(std::string("HttpCache.Pattern.NonTinyImage"), | 2760 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.NonTinyImage", |
| 2732 transaction_pattern_, PATTERN_MAX); | 2761 transaction_pattern_, PATTERN_MAX); |
| 2762 if (validation_request) { |
| 2763 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.NonTinyImage", |
| 2764 validation_cause_, VALIDATION_CAUSE_MAX); |
| 2765 } |
| 2733 } | 2766 } |
| 2734 UMA_HISTOGRAM_ENUMERATION(std::string("HttpCache.Pattern.Image"), | 2767 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.Image", transaction_pattern_, |
| 2735 transaction_pattern_, PATTERN_MAX); | 2768 PATTERN_MAX); |
| 2769 if (validation_request) { |
| 2770 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.Image", |
| 2771 validation_cause_, VALIDATION_CAUSE_MAX); |
| 2772 } |
| 2736 } else if (base::EndsWith(mime_type, "javascript", | 2773 } else if (base::EndsWith(mime_type, "javascript", |
| 2737 base::CompareCase::SENSITIVE) || | 2774 base::CompareCase::SENSITIVE) || |
| 2738 base::EndsWith(mime_type, "ecmascript", | 2775 base::EndsWith(mime_type, "ecmascript", |
| 2739 base::CompareCase::SENSITIVE)) { | 2776 base::CompareCase::SENSITIVE)) { |
| 2740 UMA_HISTOGRAM_ENUMERATION(std::string("HttpCache.Pattern.JavaScript"), | 2777 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.JavaScript", |
| 2741 transaction_pattern_, PATTERN_MAX); | 2778 transaction_pattern_, PATTERN_MAX); |
| 2779 if (validation_request) { |
| 2780 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.JavaScript", |
| 2781 validation_cause_, VALIDATION_CAUSE_MAX); |
| 2782 } |
| 2742 } else if (mime_type.find("font") != std::string::npos) { | 2783 } else if (mime_type.find("font") != std::string::npos) { |
| 2743 UMA_HISTOGRAM_ENUMERATION(std::string("HttpCache.Pattern.Font"), | 2784 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.Font", transaction_pattern_, |
| 2744 transaction_pattern_, PATTERN_MAX); | 2785 PATTERN_MAX); |
| 2786 if (validation_request) { |
| 2787 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.Font", |
| 2788 validation_cause_, VALIDATION_CAUSE_MAX); |
| 2789 } |
| 2745 } | 2790 } |
| 2746 } | 2791 } |
| 2747 | 2792 |
| 2748 UMA_HISTOGRAM_ENUMERATION( | 2793 UMA_HISTOGRAM_ENUMERATION( |
| 2749 "HttpCache.Pattern", transaction_pattern_, PATTERN_MAX); | 2794 "HttpCache.Pattern", transaction_pattern_, PATTERN_MAX); |
| 2795 |
| 2796 if (validation_request) { |
| 2797 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause", validation_cause_, |
| 2798 VALIDATION_CAUSE_MAX); |
| 2799 } |
| 2800 |
| 2801 if (transaction_pattern_ == PATTERN_ENTRY_CANT_CONDITIONALIZE) { |
| 2802 UMA_HISTOGRAM_ENUMERATION("HttpCache.CantConditionalizeCause", |
| 2803 validation_cause_, VALIDATION_CAUSE_MAX); |
| 2804 } |
| 2805 |
| 2750 if (transaction_pattern_ == PATTERN_NOT_COVERED) | 2806 if (transaction_pattern_ == PATTERN_NOT_COVERED) |
| 2751 return; | 2807 return; |
| 2752 DCHECK(!range_requested_); | 2808 DCHECK(!range_requested_); |
| 2753 DCHECK(!first_cache_access_since_.is_null()); | 2809 DCHECK(!first_cache_access_since_.is_null()); |
| 2754 | 2810 |
| 2755 TimeDelta total_time = base::TimeTicks::Now() - first_cache_access_since_; | 2811 TimeDelta total_time = base::TimeTicks::Now() - first_cache_access_since_; |
| 2756 | 2812 |
| 2757 UMA_HISTOGRAM_TIMES("HttpCache.AccessToDone", total_time); | 2813 UMA_HISTOGRAM_TIMES("HttpCache.AccessToDone", total_time); |
| 2758 | 2814 |
| 2759 bool did_send_request = !send_request_since_.is_null(); | 2815 bool did_send_request = !send_request_since_.is_null(); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2815 default: | 2871 default: |
| 2816 NOTREACHED(); | 2872 NOTREACHED(); |
| 2817 } | 2873 } |
| 2818 } | 2874 } |
| 2819 | 2875 |
| 2820 void HttpCache::Transaction::OnIOComplete(int result) { | 2876 void HttpCache::Transaction::OnIOComplete(int result) { |
| 2821 DoLoop(result); | 2877 DoLoop(result); |
| 2822 } | 2878 } |
| 2823 | 2879 |
| 2824 } // namespace net | 2880 } // namespace net |
| OLD | NEW |