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

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

Issue 2644063003: HTTP Cache Age calculation mechanism changed with RFC 7234 (Closed)
Patch Set: HTTP Cache Age calculation mechanism changed with RFC 7234 Created 3 years, 11 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
« no previous file with comments | « no previous file | net/http/http_response_headers_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) 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 // The rules for header parsing were borrowed from Firefox: 5 // The rules for header parsing were borrowed from Firefox:
6 // http://lxr.mozilla.org/seamonkey/source/netwerk/protocol/http/src/nsHttpRespo nseHead.cpp 6 // http://lxr.mozilla.org/seamonkey/source/netwerk/protocol/http/src/nsHttpRespo nseHead.cpp
7 // The rules for parsing content-types were also borrowed from Firefox: 7 // The rules for parsing content-types were also borrowed from Firefox:
8 // http://lxr.mozilla.org/mozilla/source/netwerk/base/src/nsURLHelper.cpp#834 8 // http://lxr.mozilla.org/mozilla/source/netwerk/base/src/nsURLHelper.cpp#834
9 9
10 #include "net/http/http_response_headers.h" 10 #include "net/http/http_response_headers.h"
(...skipping 1085 matching lines...) Expand 10 before | Expand all | Expand 10 after
1096 return lifetimes; 1096 return lifetimes;
1097 } 1097 }
1098 1098
1099 // Our heuristic freshness estimate for this resource is 0 seconds, in 1099 // Our heuristic freshness estimate for this resource is 0 seconds, in
1100 // accordance with common browser behaviour. However, stale-while-revalidate 1100 // accordance with common browser behaviour. However, stale-while-revalidate
1101 // may still apply. 1101 // may still apply.
1102 DCHECK_EQ(TimeDelta(), lifetimes.freshness); 1102 DCHECK_EQ(TimeDelta(), lifetimes.freshness);
1103 return lifetimes; 1103 return lifetimes;
1104 } 1104 }
1105 1105
1106 // From RFC 2616 section 13.2.3: 1106 // From RFC 7234 section 4.2.3:
1107 // 1107 //
1108 // Summary of age calculation algorithm, when a cache receives a response: 1108 // The following data is used for the age calculation:
1109 // 1109 //
1110 // /* 1110 // age_value
1111 // * age_value 1111 //
1112 // * is the value of Age: header received by the cache with 1112 // The term "age_value" denotes the value of the Age header field
1113 // * this response. 1113 // (Section 5.1), in a form appropriate for arithmetic operation; or
1114 // * date_value 1114 // 0, if not available.
1115 // * is the value of the origin server's Date: header 1115 //
1116 // * request_time 1116 // date_value
1117 // * is the (local) time when the cache made the request 1117 //
1118 // * that resulted in this cached response 1118 // The term "date_value" denotes the value of the Date header field,
1119 // * response_time 1119 // in a form appropriate for arithmetic operations. See Section
1120 // * is the (local) time when the cache received the 1120 // 7.1.1.2 of [RFC7231] for the definition of the Date header field,
1121 // * response 1121 // and for requirements regarding responses without it.
1122 // * now 1122 //
1123 // * is the current (local) time 1123 // now
1124 // */ 1124 //
1125 // apparent_age = max(0, response_time - date_value); 1125 // The term "now" means "the current value of the clock at the host
1126 // corrected_received_age = max(apparent_age, age_value); 1126 // performing the calculation". A host ought to use NTP ([RFC5905])
1127 // response_delay = response_time - request_time; 1127 // or some similar protocol to synchronize its clocks to Coordinated
1128 // corrected_initial_age = corrected_received_age + response_delay; 1128 // Universal Time.
1129 // resident_time = now - response_time; 1129 //
1130 // current_age = corrected_initial_age + resident_time; 1130 // request_time
1131 //
1132 // The current value of the clock at the host at the time the request
1133 // resulting in the stored response was made.
1134 //
1135 // response_time
1136 //
1137 // The current value of the clock at the host at the time the
1138 // response was received.
1139 //
1140 // The age is then calculated as
1141 //
1142 // apparent_age = max(0, response_time - date_value);
1143 // response_delay = response_time - request_time;
1144 // corrected_age_value = age_value + response_delay;
1145 // corrected_initial_age = max(apparent_age, corrected_age_value);
1146 // resident_time = now - response_time;
1147 // current_age = corrected_initial_age + resident_time;
1131 // 1148 //
1132 TimeDelta HttpResponseHeaders::GetCurrentAge(const Time& request_time, 1149 TimeDelta HttpResponseHeaders::GetCurrentAge(const Time& request_time,
1133 const Time& response_time, 1150 const Time& response_time,
1134 const Time& current_time) const { 1151 const Time& current_time) const {
1135 // If there is no Date header, then assume that the server response was 1152 // If there is no Date header, then assume that the server response was
1136 // generated at the time when we received the response. 1153 // generated at the time when we received the response.
1137 Time date_value; 1154 Time date_value;
1138 if (!GetDateValue(&date_value)) 1155 if (!GetDateValue(&date_value))
1139 date_value = response_time; 1156 date_value = response_time;
1140 1157
1141 // If there is no Age header, then assume age is zero. GetAgeValue does not 1158 // If there is no Age header, then assume age is zero. GetAgeValue does not
1142 // modify its out param if the value does not exist. 1159 // modify its out param if the value does not exist.
1143 TimeDelta age_value; 1160 TimeDelta age_value;
1144 GetAgeValue(&age_value); 1161 GetAgeValue(&age_value);
1145 1162
1146 TimeDelta apparent_age = std::max(TimeDelta(), response_time - date_value); 1163 TimeDelta apparent_age = std::max(TimeDelta(), response_time - date_value);
1147 TimeDelta corrected_received_age = std::max(apparent_age, age_value);
1148 TimeDelta response_delay = response_time - request_time; 1164 TimeDelta response_delay = response_time - request_time;
1149 TimeDelta corrected_initial_age = corrected_received_age + response_delay; 1165 TimeDelta corrected_age_value = age_value + response_delay;
1166 TimeDelta corrected_initial_age = std::max(apparent_age, corrected_age_value);
1150 TimeDelta resident_time = current_time - response_time; 1167 TimeDelta resident_time = current_time - response_time;
1151 TimeDelta current_age = corrected_initial_age + resident_time; 1168 TimeDelta current_age = corrected_initial_age + resident_time;
1152 1169
1153 return current_age; 1170 return current_age;
1154 } 1171 }
1155 1172
1156 bool HttpResponseHeaders::GetMaxAgeValue(TimeDelta* result) const { 1173 bool HttpResponseHeaders::GetMaxAgeValue(TimeDelta* result) const {
1157 return GetCacheControlDirective("max-age", result); 1174 return GetCacheControlDirective("max-age", result);
1158 } 1175 }
1159 1176
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after
1468 return true; 1485 return true;
1469 } 1486 }
1470 1487
1471 bool HttpResponseHeaders::IsChunkEncoded() const { 1488 bool HttpResponseHeaders::IsChunkEncoded() const {
1472 // Ignore spurious chunked responses from HTTP/1.0 servers and proxies. 1489 // Ignore spurious chunked responses from HTTP/1.0 servers and proxies.
1473 return GetHttpVersion() >= HttpVersion(1, 1) && 1490 return GetHttpVersion() >= HttpVersion(1, 1) &&
1474 HasHeaderValue("Transfer-Encoding", "chunked"); 1491 HasHeaderValue("Transfer-Encoding", "chunked");
1475 } 1492 }
1476 1493
1477 } // namespace net 1494 } // namespace net
OLDNEW
« no previous file with comments | « no previous file | net/http/http_response_headers_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698