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 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
75 | 75 |
76 enum ExternallyConditionalizedType { | 76 enum ExternallyConditionalizedType { |
77 EXTERNALLY_CONDITIONALIZED_CACHE_REQUIRES_VALIDATION, | 77 EXTERNALLY_CONDITIONALIZED_CACHE_REQUIRES_VALIDATION, |
78 EXTERNALLY_CONDITIONALIZED_CACHE_USABLE, | 78 EXTERNALLY_CONDITIONALIZED_CACHE_USABLE, |
79 EXTERNALLY_CONDITIONALIZED_MISMATCHED_VALIDATORS, | 79 EXTERNALLY_CONDITIONALIZED_MISMATCHED_VALIDATORS, |
80 EXTERNALLY_CONDITIONALIZED_MAX | 80 EXTERNALLY_CONDITIONALIZED_MAX |
81 }; | 81 }; |
82 | 82 |
83 } // namespace | 83 } // namespace |
84 | 84 |
85 #define CACHE_STATUS_HISTOGRAMS(type) \ | |
86 do { \ | |
87 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern" type, cache_entry_status_, \ | |
88 CacheEntryStatus::ENTRY_MAX); \ | |
89 if (validation_request) { \ | |
90 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause" type, \ | |
91 validation_cause_, VALIDATION_CAUSE_MAX); \ | |
92 } \ | |
93 if (stale_request) { \ | |
94 UMA_HISTOGRAM_COUNTS( \ | |
95 "HttpCache.StaleEntry.FreshnessPeriodsSinceLastUsed" type, \ | |
96 freshness_periods_since_last_used); \ | |
97 } \ | |
98 } while (0) | |
99 | |
85 struct HeaderNameAndValue { | 100 struct HeaderNameAndValue { |
86 const char* name; | 101 const char* name; |
87 const char* value; | 102 const char* value; |
88 }; | 103 }; |
89 | 104 |
90 // If the request includes one of these request headers, then avoid caching | 105 // If the request includes one of these request headers, then avoid caching |
91 // to avoid getting confused. | 106 // to avoid getting confused. |
92 static const HeaderNameAndValue kPassThroughHeaders[] = { | 107 static const HeaderNameAndValue kPassThroughHeaders[] = { |
93 { "if-unmodified-since", NULL }, // causes unexpected 412s | 108 { "if-unmodified-since", NULL }, // causes unexpected 412s |
94 { "if-match", NULL }, // causes unexpected 412s | 109 { "if-match", NULL }, // causes unexpected 412s |
(...skipping 2695 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2790 | 2805 |
2791 if (stale_request) { | 2806 if (stale_request) { |
2792 // For stale entries, record how many freshness periods have elapsed since | 2807 // For stale entries, record how many freshness periods have elapsed since |
2793 // the entry was last used. | 2808 // the entry was last used. |
2794 DCHECK(!open_entry_last_used_.is_null()); | 2809 DCHECK(!open_entry_last_used_.is_null()); |
2795 DCHECK(!stale_entry_freshness_.is_zero()); | 2810 DCHECK(!stale_entry_freshness_.is_zero()); |
2796 base::TimeDelta time_since_use = base::Time::Now() - open_entry_last_used_; | 2811 base::TimeDelta time_since_use = base::Time::Now() - open_entry_last_used_; |
2797 freshness_periods_since_last_used = | 2812 freshness_periods_since_last_used = |
2798 (time_since_use * 1000) / stale_entry_freshness_; | 2813 (time_since_use * 1000) / stale_entry_freshness_; |
2799 | 2814 |
2800 UMA_HISTOGRAM_COUNTS("HttpCache.StaleEntry.FreshnessPeriodsSinceLastUsed", | |
2801 freshness_periods_since_last_used); | |
2802 | |
2803 if (validation_request) { | 2815 if (validation_request) { |
2804 int64_t age_in_freshness_periods = | 2816 int64_t age_in_freshness_periods = |
2805 (stale_entry_age_ * 100) / stale_entry_freshness_; | 2817 (stale_entry_age_ * 100) / stale_entry_freshness_; |
2806 if (cache_entry_status_ == CacheEntryStatus::ENTRY_VALIDATED) { | 2818 if (cache_entry_status_ == CacheEntryStatus::ENTRY_VALIDATED) { |
2807 UMA_HISTOGRAM_COUNTS("HttpCache.StaleEntry.Validated.Age", | 2819 UMA_HISTOGRAM_COUNTS("HttpCache.StaleEntry.Validated.Age", |
2808 stale_entry_age_.InSeconds()); | 2820 stale_entry_age_.InSeconds()); |
2809 UMA_HISTOGRAM_COUNTS( | 2821 UMA_HISTOGRAM_COUNTS( |
2810 "HttpCache.StaleEntry.Validated.AgeInFreshnessPeriods", | 2822 "HttpCache.StaleEntry.Validated.AgeInFreshnessPeriods", |
2811 age_in_freshness_periods); | 2823 age_in_freshness_periods); |
2812 | 2824 |
2813 } else { | 2825 } else { |
2814 UMA_HISTOGRAM_COUNTS("HttpCache.StaleEntry.Updated.Age", | 2826 UMA_HISTOGRAM_COUNTS("HttpCache.StaleEntry.Updated.Age", |
2815 stale_entry_age_.InSeconds()); | 2827 stale_entry_age_.InSeconds()); |
2816 UMA_HISTOGRAM_COUNTS( | 2828 UMA_HISTOGRAM_COUNTS( |
2817 "HttpCache.StaleEntry.Updated.AgeInFreshnessPeriods", | 2829 "HttpCache.StaleEntry.Updated.AgeInFreshnessPeriods", |
2818 age_in_freshness_periods); | 2830 age_in_freshness_periods); |
2819 } | 2831 } |
2820 } | 2832 } |
2821 } | 2833 } |
2822 | 2834 |
2823 std::string mime_type; | 2835 std::string mime_type; |
2824 HttpResponseHeaders* response_headers = GetResponseInfo()->headers.get(); | 2836 HttpResponseHeaders* response_headers = GetResponseInfo()->headers.get(); |
2825 if (response_headers && response_headers->GetMimeType(&mime_type)) { | 2837 if (response_headers && response_headers->GetMimeType(&mime_type)) { |
2826 // Record the cache pattern by resource type. The type is inferred by | 2838 // Record the cache pattern by resource type. The type is inferred by |
2827 // response header mime type, which could be incorrect, so this is just an | 2839 // response header mime type, which could be incorrect, so this is just an |
2828 // estimate. | 2840 // estimate. |
2829 if (mime_type == "text/html" && | 2841 if (mime_type == "text/html" && |
2830 (request_->load_flags & LOAD_MAIN_FRAME_DEPRECATED)) { | 2842 (request_->load_flags & LOAD_MAIN_FRAME_DEPRECATED)) { |
2831 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.MainFrameHTML", | 2843 CACHE_STATUS_HISTOGRAMS(".MainFrameHTML"); |
2832 cache_entry_status_, | |
2833 CacheEntryStatus::ENTRY_MAX); | |
2834 if (validation_request) { | |
2835 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.MainFrameHTML", | |
2836 validation_cause_, VALIDATION_CAUSE_MAX); | |
2837 } | |
2838 if (stale_request) { | |
2839 UMA_HISTOGRAM_COUNTS( | |
2840 "HttpCache.StaleEntry.FreshnessPeriodsSinceLastUsed.MainFrameHTML", | |
2841 freshness_periods_since_last_used); | |
2842 } | |
2843 } else if (mime_type == "text/html") { | 2844 } else if (mime_type == "text/html") { |
2844 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.NonMainFrameHTML", | 2845 CACHE_STATUS_HISTOGRAMS(".NonMainFrameHTML"); |
2845 cache_entry_status_, | |
2846 CacheEntryStatus::ENTRY_MAX); | |
2847 if (validation_request) { | |
2848 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.NonMainFrameHTML", | |
2849 validation_cause_, VALIDATION_CAUSE_MAX); | |
2850 } | |
2851 if (stale_request) { | |
2852 UMA_HISTOGRAM_COUNTS( | |
2853 "HttpCache.StaleEntry.FreshnessPeriodsSinceLastUsed." | |
2854 "NonMainFrameHTML", | |
2855 freshness_periods_since_last_used); | |
2856 } | |
2857 } else if (mime_type == "text/css") { | 2846 } else if (mime_type == "text/css") { |
2858 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.CSS", cache_entry_status_, | 2847 CACHE_STATUS_HISTOGRAMS(".CSS"); |
2859 CacheEntryStatus::ENTRY_MAX); | |
2860 if (validation_request) { | |
2861 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.CSS", | |
2862 validation_cause_, VALIDATION_CAUSE_MAX); | |
2863 } | |
2864 if (stale_request) { | |
2865 UMA_HISTOGRAM_COUNTS( | |
2866 "HttpCache.StaleEntry.FreshnessPeriodsSinceLastUsed.CSS", | |
2867 freshness_periods_since_last_used); | |
2868 } | |
2869 } else if (base::StartsWith(mime_type, "image/", | 2848 } else if (base::StartsWith(mime_type, "image/", |
2870 base::CompareCase::SENSITIVE)) { | 2849 base::CompareCase::SENSITIVE)) { |
2871 int64_t content_length = response_headers->GetContentLength(); | 2850 int64_t content_length = response_headers->GetContentLength(); |
2872 if (content_length >= 0 && content_length < 100) { | 2851 if (content_length >= 0 && content_length < 100) { |
2873 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.TinyImage", | 2852 CACHE_STATUS_HISTOGRAMS(".TinyImage"); |
2874 cache_entry_status_, | |
2875 CacheEntryStatus::ENTRY_MAX); | |
2876 if (validation_request) { | |
2877 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.TinyImage", | |
2878 validation_cause_, VALIDATION_CAUSE_MAX); | |
2879 } | |
2880 if (stale_request) { | |
2881 UMA_HISTOGRAM_COUNTS( | |
2882 "HttpCache.StaleEntry.FreshnessPeriodsSinceLastUsed.TinyImage", | |
2883 freshness_periods_since_last_used); | |
2884 } | |
2885 } else if (content_length >= 100) { | 2853 } else if (content_length >= 100) { |
2886 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.NonTinyImage", | 2854 CACHE_STATUS_HISTOGRAMS(".NonTinyImage"); |
2887 cache_entry_status_, | |
2888 CacheEntryStatus::ENTRY_MAX); | |
2889 if (validation_request) { | |
2890 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.NonTinyImage", | |
2891 validation_cause_, VALIDATION_CAUSE_MAX); | |
2892 } | |
2893 if (stale_request) { | |
2894 UMA_HISTOGRAM_COUNTS( | |
2895 "HttpCache.StaleEntry.FreshnessPeriodsSinceLastUsed.NonTinyImage", | |
2896 freshness_periods_since_last_used); | |
2897 } | |
2898 } | 2855 } |
2899 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.Image", cache_entry_status_, | 2856 CACHE_STATUS_HISTOGRAMS(".Image"); |
2900 CacheEntryStatus::ENTRY_MAX); | |
2901 if (validation_request) { | |
2902 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.Image", | |
2903 validation_cause_, VALIDATION_CAUSE_MAX); | |
2904 } | |
2905 if (stale_request) { | |
2906 UMA_HISTOGRAM_COUNTS( | |
2907 "HttpCache.StaleEntry.FreshnessPeriodsSinceLastUsed.Image", | |
2908 freshness_periods_since_last_used); | |
2909 } | |
2910 } else if (base::EndsWith(mime_type, "javascript", | 2857 } else if (base::EndsWith(mime_type, "javascript", |
2911 base::CompareCase::SENSITIVE) || | 2858 base::CompareCase::SENSITIVE) || |
2912 base::EndsWith(mime_type, "ecmascript", | 2859 base::EndsWith(mime_type, "ecmascript", |
2913 base::CompareCase::SENSITIVE)) { | 2860 base::CompareCase::SENSITIVE)) { |
2914 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.JavaScript", | 2861 CACHE_STATUS_HISTOGRAMS(".JavaScript"); |
2915 cache_entry_status_, | |
2916 CacheEntryStatus::ENTRY_MAX); | |
2917 if (validation_request) { | |
2918 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.JavaScript", | |
2919 validation_cause_, VALIDATION_CAUSE_MAX); | |
2920 } | |
2921 if (stale_request) { | |
2922 UMA_HISTOGRAM_COUNTS( | |
2923 "HttpCache.StaleEntry.FreshnessPeriodsSinceLastUsed.JavaScript", | |
2924 freshness_periods_since_last_used); | |
2925 } | |
2926 } else if (mime_type.find("font") != std::string::npos) { | 2862 } else if (mime_type.find("font") != std::string::npos) { |
2927 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.Font", cache_entry_status_, | 2863 CACHE_STATUS_HISTOGRAMS(".Font"); |
2928 CacheEntryStatus::ENTRY_MAX); | 2864 } else if (base::StartsWith(mime_type, "audio/", |
2929 if (validation_request) { | 2865 base::CompareCase::SENSITIVE)) { |
2930 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause.Font", | 2866 CACHE_STATUS_HISTOGRAMS(".Audio"); |
2931 validation_cause_, VALIDATION_CAUSE_MAX); | 2867 } else if (base::StartsWith(mime_type, "video/", |
2932 } | 2868 base::CompareCase::SENSITIVE)) { |
2933 if (stale_request) { | 2869 CACHE_STATUS_HISTOGRAMS(".Video"); |
2934 UMA_HISTOGRAM_COUNTS( | |
2935 "HttpCache.StaleEntry.FreshnessPeriodsSinceLastUsed.Font", | |
2936 freshness_periods_since_last_used); | |
2937 } | |
2938 } | 2870 } |
2939 } | 2871 } |
2940 | 2872 |
2941 UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern", cache_entry_status_, | 2873 CACHE_STATUS_HISTOGRAMS(""); |
gavinp
2016/09/23 15:41:49
Does this have to be "", or would () work too? I b
jkarlin
2016/09/23 15:53:02
() works. WIll commit with that.
jkarlin
2016/09/23 17:05:22
Nope, Windows doesn't like it. Reverting.
| |
2942 CacheEntryStatus::ENTRY_MAX); | |
2943 | |
2944 if (validation_request) { | |
2945 UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause", validation_cause_, | |
2946 VALIDATION_CAUSE_MAX); | |
2947 } | |
2948 | 2874 |
2949 if (cache_entry_status_ == CacheEntryStatus::ENTRY_CANT_CONDITIONALIZE) { | 2875 if (cache_entry_status_ == CacheEntryStatus::ENTRY_CANT_CONDITIONALIZE) { |
2950 UMA_HISTOGRAM_ENUMERATION("HttpCache.CantConditionalizeCause", | 2876 UMA_HISTOGRAM_ENUMERATION("HttpCache.CantConditionalizeCause", |
2951 validation_cause_, VALIDATION_CAUSE_MAX); | 2877 validation_cause_, VALIDATION_CAUSE_MAX); |
2952 } | 2878 } |
2953 | 2879 |
2954 if (cache_entry_status_ == CacheEntryStatus::ENTRY_OTHER) | 2880 if (cache_entry_status_ == CacheEntryStatus::ENTRY_OTHER) |
2955 return; | 2881 return; |
2956 DCHECK(!range_requested_); | 2882 DCHECK(!range_requested_); |
2957 DCHECK(!first_cache_access_since_.is_null()); | 2883 DCHECK(!first_cache_access_since_.is_null()); |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3020 default: | 2946 default: |
3021 NOTREACHED(); | 2947 NOTREACHED(); |
3022 } | 2948 } |
3023 } | 2949 } |
3024 | 2950 |
3025 void HttpCache::Transaction::OnIOComplete(int result) { | 2951 void HttpCache::Transaction::OnIOComplete(int result) { |
3026 DoLoop(result); | 2952 DoLoop(result); |
3027 } | 2953 } |
3028 | 2954 |
3029 } // namespace net | 2955 } // namespace net |
OLD | NEW |