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 1003 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1014 HasHeaderValue("pragma", "no-cache") || | 1014 HasHeaderValue("pragma", "no-cache") || |
1015 // Vary: * is never usable: see RFC 2616 section 13.6. | 1015 // Vary: * is never usable: see RFC 2616 section 13.6. |
1016 HasHeaderValue("vary", "*")) { | 1016 HasHeaderValue("vary", "*")) { |
1017 return lifetimes; | 1017 return lifetimes; |
1018 } | 1018 } |
1019 | 1019 |
1020 // Cache-Control directive must_revalidate overrides stale-while-revalidate. | 1020 // Cache-Control directive must_revalidate overrides stale-while-revalidate. |
1021 bool must_revalidate = HasHeaderValue("cache-control", "must-revalidate"); | 1021 bool must_revalidate = HasHeaderValue("cache-control", "must-revalidate"); |
1022 | 1022 |
1023 if (must_revalidate || !GetStaleWhileRevalidateValue(&lifetimes.staleness)) { | 1023 if (must_revalidate || !GetStaleWhileRevalidateValue(&lifetimes.staleness)) { |
1024 DCHECK(lifetimes.staleness == TimeDelta()); | 1024 DCHECK_EQ(TimeDelta(), lifetimes.staleness); |
1025 } | 1025 } |
1026 | 1026 |
1027 // NOTE: "Cache-Control: max-age" overrides Expires, so we only check the | 1027 // NOTE: "Cache-Control: max-age" overrides Expires, so we only check the |
1028 // Expires header after checking for max-age in GetFreshnessLifetimes. This | 1028 // Expires header after checking for max-age in GetFreshnessLifetimes. This |
1029 // is important since "Expires: <date in the past>" means not fresh, but | 1029 // is important since "Expires: <date in the past>" means not fresh, but |
1030 // it should not trump a max-age value. | 1030 // it should not trump a max-age value. |
1031 if (GetMaxAgeValue(&lifetimes.freshness)) | 1031 if (GetMaxAgeValue(&lifetimes.freshness)) |
1032 return lifetimes; | 1032 return lifetimes; |
1033 | 1033 |
1034 // If there is no Date header, then assume that the server response was | 1034 // If there is no Date header, then assume that the server response was |
1035 // generated at the time when we received the response. | 1035 // generated at the time when we received the response. |
1036 Time date_value; | 1036 Time date_value; |
1037 if (!GetDateValue(&date_value)) | 1037 if (!GetDateValue(&date_value)) |
1038 date_value = response_time; | 1038 date_value = response_time; |
1039 | 1039 |
1040 Time expires_value; | 1040 Time expires_value; |
1041 if (GetExpiresValue(&expires_value)) { | 1041 if (GetExpiresValue(&expires_value)) { |
1042 // The expires value can be a date in the past! | 1042 // The expires value can be a date in the past! |
1043 if (expires_value > date_value) { | 1043 if (expires_value > date_value) { |
1044 lifetimes.freshness = expires_value - date_value; | 1044 lifetimes.freshness = expires_value - date_value; |
1045 return lifetimes; | 1045 return lifetimes; |
1046 } | 1046 } |
1047 | 1047 |
1048 DCHECK(lifetimes.freshness == TimeDelta()); | 1048 DCHECK_EQ(TimeDelta(), lifetimes.freshness); |
1049 return lifetimes; | 1049 return lifetimes; |
1050 } | 1050 } |
1051 | 1051 |
1052 // From RFC 2616 section 13.4: | 1052 // From RFC 2616 section 13.4: |
1053 // | 1053 // |
1054 // A response received with a status code of 200, 203, 206, 300, 301 or 410 | 1054 // A response received with a status code of 200, 203, 206, 300, 301 or 410 |
1055 // MAY be stored by a cache and used in reply to a subsequent request, | 1055 // MAY be stored by a cache and used in reply to a subsequent request, |
1056 // subject to the expiration mechanism, unless a cache-control directive | 1056 // subject to the expiration mechanism, unless a cache-control directive |
1057 // prohibits caching. | 1057 // prohibits caching. |
1058 // ... | 1058 // ... |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1090 if (response_code_ == 300 || response_code_ == 301 || response_code_ == 308 || | 1090 if (response_code_ == 300 || response_code_ == 301 || response_code_ == 308 || |
1091 response_code_ == 410) { | 1091 response_code_ == 410) { |
1092 lifetimes.freshness = TimeDelta::Max(); | 1092 lifetimes.freshness = TimeDelta::Max(); |
1093 lifetimes.staleness = TimeDelta(); // It should never be stale. | 1093 lifetimes.staleness = TimeDelta(); // It should never be stale. |
1094 return lifetimes; | 1094 return lifetimes; |
1095 } | 1095 } |
1096 | 1096 |
1097 // Our heuristic freshness estimate for this resource is 0 seconds, in | 1097 // Our heuristic freshness estimate for this resource is 0 seconds, in |
1098 // accordance with common browser behaviour. However, stale-while-revalidate | 1098 // accordance with common browser behaviour. However, stale-while-revalidate |
1099 // may still apply. | 1099 // may still apply. |
1100 DCHECK(lifetimes.freshness == TimeDelta()); | 1100 DCHECK_EQ(TimeDelta(), lifetimes.freshness); |
1101 return lifetimes; | 1101 return lifetimes; |
1102 } | 1102 } |
1103 | 1103 |
1104 // From RFC 2616 section 13.2.3: | 1104 // From RFC 2616 section 13.2.3: |
1105 // | 1105 // |
1106 // Summary of age calculation algorithm, when a cache receives a response: | 1106 // Summary of age calculation algorithm, when a cache receives a response: |
1107 // | 1107 // |
1108 // /* | 1108 // /* |
1109 // * age_value | 1109 // * age_value |
1110 // * is the value of Age: header received by the cache with | 1110 // * is the value of Age: header received by the cache with |
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1443 return true; | 1443 return true; |
1444 } | 1444 } |
1445 | 1445 |
1446 bool HttpResponseHeaders::IsChunkEncoded() const { | 1446 bool HttpResponseHeaders::IsChunkEncoded() const { |
1447 // Ignore spurious chunked responses from HTTP/1.0 servers and proxies. | 1447 // Ignore spurious chunked responses from HTTP/1.0 servers and proxies. |
1448 return GetHttpVersion() >= HttpVersion(1, 1) && | 1448 return GetHttpVersion() >= HttpVersion(1, 1) && |
1449 HasHeaderValue("Transfer-Encoding", "chunked"); | 1449 HasHeaderValue("Transfer-Encoding", "chunked"); |
1450 } | 1450 } |
1451 | 1451 |
1452 } // namespace net | 1452 } // namespace net |
OLD | NEW |