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 // 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 Loading... |
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 Loading... |
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 |
OLD | NEW |