Chromium Code Reviews| 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 = | |
| 2721 transaction_pattern_ == PATTERN_ENTRY_VALIDATED || | |
| 2722 transaction_pattern_ == PATTERN_ENTRY_UPDATED || | |
| 2723 transaction_pattern_ == PATTERN_ENTRY_CANT_CONDITIONALIZE; | |
| 2708 std::string mime_type; | 2724 std::string mime_type; |
| 2709 HttpResponseHeaders* response_headers = GetResponseInfo()->headers.get(); | 2725 HttpResponseHeaders* response_headers = GetResponseInfo()->headers.get(); |
| 2710 if (response_headers && response_headers->GetMimeType(&mime_type)) { | 2726 if (response_headers && response_headers->GetMimeType(&mime_type)) { |
| 2711 // Record the cache pattern by resource type. The type is inferred by | 2727 // 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 | 2728 // response header mime type, which could be incorrect, so this is just an |
| 2713 // estimate. | 2729 // estimate. |
| 2714 if (mime_type == "text/html" && (request_->load_flags & LOAD_MAIN_FRAME)) { | 2730 if (mime_type == "text/html" && (request_->load_flags & LOAD_MAIN_FRAME)) { |
| 2715 UMA_HISTOGRAM_ENUMERATION(std::string("HttpCache.Pattern.MainFrameHTML"), | 2731 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.MainFrameHTML", |
|
gavinp
2016/05/12 15:02:01
What was this stuff?
jkarlin
2016/05/13 15:06:51
Why was std::string there? It's leftover cruft fro
| |
| 2716 transaction_pattern_, PATTERN_MAX); | 2732 transaction_pattern_, PATTERN_MAX); |
| 2733 if (validation_request) { | |
| 2734 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.MainFrameHTML", | |
| 2735 validation_cause_, VALIDATION_CAUSE_MAX); | |
| 2736 } | |
| 2717 } else if (mime_type == "text/html") { | 2737 } else if (mime_type == "text/html") { |
| 2718 UMA_HISTOGRAM_ENUMERATION( | 2738 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.NonMainFrameHTML", |
| 2719 std::string("HttpCache.Pattern.NonMainFrameHTML"), | 2739 transaction_pattern_, PATTERN_MAX); |
| 2720 transaction_pattern_, PATTERN_MAX); | 2740 if (validation_request) { |
| 2741 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.NonMainFrameHTML", | |
| 2742 validation_cause_, VALIDATION_CAUSE_MAX); | |
| 2743 } | |
| 2721 } else if (mime_type == "text/css") { | 2744 } else if (mime_type == "text/css") { |
| 2722 UMA_HISTOGRAM_ENUMERATION(std::string("HttpCache.Pattern.CSS"), | 2745 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.CSS", transaction_pattern_, |
| 2723 transaction_pattern_, PATTERN_MAX); | 2746 PATTERN_MAX); |
| 2747 if (validation_request) { | |
| 2748 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.CSS", | |
| 2749 validation_cause_, VALIDATION_CAUSE_MAX); | |
| 2750 } | |
| 2724 } else if (base::StartsWith(mime_type, "image/", | 2751 } else if (base::StartsWith(mime_type, "image/", |
| 2725 base::CompareCase::SENSITIVE)) { | 2752 base::CompareCase::SENSITIVE)) { |
| 2726 int64_t content_length = response_headers->GetContentLength(); | 2753 int64_t content_length = response_headers->GetContentLength(); |
| 2727 if (content_length >= 0 && content_length < 100) { | 2754 if (content_length >= 0 && content_length < 100) { |
| 2728 UMA_HISTOGRAM_ENUMERATION(std::string("HttpCache.Pattern.TinyImage"), | 2755 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.TinyImage", |
| 2729 transaction_pattern_, PATTERN_MAX); | 2756 transaction_pattern_, PATTERN_MAX); |
| 2757 if (validation_request) { | |
| 2758 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.TinyImage", | |
| 2759 validation_cause_, VALIDATION_CAUSE_MAX); | |
| 2760 } | |
| 2730 } else if (content_length >= 100) { | 2761 } else if (content_length >= 100) { |
| 2731 UMA_HISTOGRAM_ENUMERATION(std::string("HttpCache.Pattern.NonTinyImage"), | 2762 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.NonTinyImage", |
| 2732 transaction_pattern_, PATTERN_MAX); | 2763 transaction_pattern_, PATTERN_MAX); |
| 2764 if (validation_request) { | |
| 2765 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.NonTinyImage", | |
| 2766 validation_cause_, VALIDATION_CAUSE_MAX); | |
| 2767 } | |
| 2733 } | 2768 } |
| 2734 UMA_HISTOGRAM_ENUMERATION(std::string("HttpCache.Pattern.Image"), | 2769 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.Image", transaction_pattern_, |
| 2735 transaction_pattern_, PATTERN_MAX); | 2770 PATTERN_MAX); |
| 2771 if (validation_request) { | |
| 2772 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.Image", | |
| 2773 validation_cause_, VALIDATION_CAUSE_MAX); | |
| 2774 } | |
| 2736 } else if (base::EndsWith(mime_type, "javascript", | 2775 } else if (base::EndsWith(mime_type, "javascript", |
| 2737 base::CompareCase::SENSITIVE) || | 2776 base::CompareCase::SENSITIVE) || |
| 2738 base::EndsWith(mime_type, "ecmascript", | 2777 base::EndsWith(mime_type, "ecmascript", |
| 2739 base::CompareCase::SENSITIVE)) { | 2778 base::CompareCase::SENSITIVE)) { |
| 2740 UMA_HISTOGRAM_ENUMERATION(std::string("HttpCache.Pattern.JavaScript"), | 2779 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.JavaScript", |
| 2741 transaction_pattern_, PATTERN_MAX); | 2780 transaction_pattern_, PATTERN_MAX); |
| 2781 if (validation_request) { | |
| 2782 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.JavaScript", | |
| 2783 validation_cause_, VALIDATION_CAUSE_MAX); | |
| 2784 } | |
| 2742 } else if (mime_type.find("font") != std::string::npos) { | 2785 } else if (mime_type.find("font") != std::string::npos) { |
| 2743 UMA_HISTOGRAM_ENUMERATION(std::string("HttpCache.Pattern.Font"), | 2786 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.Font", transaction_pattern_, |
| 2744 transaction_pattern_, PATTERN_MAX); | 2787 PATTERN_MAX); |
| 2788 if (validation_request) { | |
| 2789 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.Font", | |
| 2790 validation_cause_, VALIDATION_CAUSE_MAX); | |
| 2791 } | |
| 2745 } | 2792 } |
| 2746 } | 2793 } |
| 2747 | 2794 |
| 2748 UMA_HISTOGRAM_ENUMERATION( | 2795 UMA_HISTOGRAM_ENUMERATION( |
| 2749 "HttpCache.Pattern", transaction_pattern_, PATTERN_MAX); | 2796 "HttpCache.Pattern", transaction_pattern_, PATTERN_MAX); |
| 2797 | |
| 2798 if (validation_request) { | |
| 2799 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause", validation_cause_, | |
| 2800 VALIDATION_CAUSE_MAX); | |
| 2801 } | |
| 2802 | |
| 2750 if (transaction_pattern_ == PATTERN_NOT_COVERED) | 2803 if (transaction_pattern_ == PATTERN_NOT_COVERED) |
| 2751 return; | 2804 return; |
| 2752 DCHECK(!range_requested_); | 2805 DCHECK(!range_requested_); |
| 2753 DCHECK(!first_cache_access_since_.is_null()); | 2806 DCHECK(!first_cache_access_since_.is_null()); |
| 2754 | 2807 |
| 2755 TimeDelta total_time = base::TimeTicks::Now() - first_cache_access_since_; | 2808 TimeDelta total_time = base::TimeTicks::Now() - first_cache_access_since_; |
| 2756 | 2809 |
| 2757 UMA_HISTOGRAM_TIMES("HttpCache.AccessToDone", total_time); | 2810 UMA_HISTOGRAM_TIMES("HttpCache.AccessToDone", total_time); |
| 2758 | 2811 |
| 2759 bool did_send_request = !send_request_since_.is_null(); | 2812 bool did_send_request = !send_request_since_.is_null(); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2815 default: | 2868 default: |
| 2816 NOTREACHED(); | 2869 NOTREACHED(); |
| 2817 } | 2870 } |
| 2818 } | 2871 } |
| 2819 | 2872 |
| 2820 void HttpCache::Transaction::OnIOComplete(int result) { | 2873 void HttpCache::Transaction::OnIOComplete(int result) { |
| 2821 DoLoop(result); | 2874 DoLoop(result); |
| 2822 } | 2875 } |
| 2823 | 2876 |
| 2824 } // namespace net | 2877 } // namespace net |
| OLD | NEW |