OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org) | 2 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org) |
3 * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. | 3 * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. |
4 * Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/ | 4 * Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/ |
5 * Copyright (C) 2009 Google Inc. All rights reserved. | 5 * Copyright (C) 2009 Google Inc. All rights reserved. |
6 * Copyright (C) 2011 Apple Inc. All Rights Reserved. | 6 * Copyright (C) 2011 Apple Inc. All Rights Reserved. |
7 * | 7 * |
8 * Redistribution and use in source and binary forms, with or without | 8 * Redistribution and use in source and binary forms, with or without |
9 * modification, are permitted provided that the following conditions | 9 * modification, are permitted provided that the following conditions |
10 * are met: | 10 * are met: |
(...skipping 682 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
693 } | 693 } |
694 } | 694 } |
695 } | 695 } |
696 | 696 |
697 CacheControlHeader parseCacheControlDirectives( | 697 CacheControlHeader parseCacheControlDirectives( |
698 const AtomicString& cacheControlValue, | 698 const AtomicString& cacheControlValue, |
699 const AtomicString& pragmaValue) { | 699 const AtomicString& pragmaValue) { |
700 CacheControlHeader cacheControlHeader; | 700 CacheControlHeader cacheControlHeader; |
701 cacheControlHeader.parsed = true; | 701 cacheControlHeader.parsed = true; |
702 cacheControlHeader.maxAge = std::numeric_limits<double>::quiet_NaN(); | 702 cacheControlHeader.maxAge = std::numeric_limits<double>::quiet_NaN(); |
703 cacheControlHeader.staleWhileRevalidate = | |
704 std::numeric_limits<double>::quiet_NaN(); | |
705 | 703 |
706 static const char noCacheDirective[] = "no-cache"; | 704 static const char noCacheDirective[] = "no-cache"; |
707 static const char noStoreDirective[] = "no-store"; | 705 static const char noStoreDirective[] = "no-store"; |
708 static const char mustRevalidateDirective[] = "must-revalidate"; | 706 static const char mustRevalidateDirective[] = "must-revalidate"; |
709 static const char maxAgeDirective[] = "max-age"; | 707 static const char maxAgeDirective[] = "max-age"; |
710 static const char staleWhileRevalidateDirective[] = "stale-while-revalidate"; | |
711 | 708 |
712 if (!cacheControlValue.isEmpty()) { | 709 if (!cacheControlValue.isEmpty()) { |
713 Vector<std::pair<String, String>> directives; | 710 Vector<std::pair<String, String>> directives; |
714 parseCacheHeader(cacheControlValue, directives); | 711 parseCacheHeader(cacheControlValue, directives); |
715 | 712 |
716 size_t directivesSize = directives.size(); | 713 size_t directivesSize = directives.size(); |
717 for (size_t i = 0; i < directivesSize; ++i) { | 714 for (size_t i = 0; i < directivesSize; ++i) { |
718 // RFC2616 14.9.1: A no-cache directive with a value is only meaningful | 715 // RFC2616 14.9.1: A no-cache directive with a value is only meaningful |
719 // for proxy caches. It should be ignored by a browser level cache. | 716 // for proxy caches. It should be ignored by a browser level cache. |
720 if (equalIgnoringCase(directives[i].first, noCacheDirective) && | 717 if (equalIgnoringCase(directives[i].first, noCacheDirective) && |
721 directives[i].second.isEmpty()) { | 718 directives[i].second.isEmpty()) { |
722 cacheControlHeader.containsNoCache = true; | 719 cacheControlHeader.containsNoCache = true; |
723 } else if (equalIgnoringCase(directives[i].first, noStoreDirective)) { | 720 } else if (equalIgnoringCase(directives[i].first, noStoreDirective)) { |
724 cacheControlHeader.containsNoStore = true; | 721 cacheControlHeader.containsNoStore = true; |
725 } else if (equalIgnoringCase(directives[i].first, | 722 } else if (equalIgnoringCase(directives[i].first, |
726 mustRevalidateDirective)) { | 723 mustRevalidateDirective)) { |
727 cacheControlHeader.containsMustRevalidate = true; | 724 cacheControlHeader.containsMustRevalidate = true; |
728 } else if (equalIgnoringCase(directives[i].first, maxAgeDirective)) { | 725 } else if (equalIgnoringCase(directives[i].first, maxAgeDirective)) { |
729 if (!std::isnan(cacheControlHeader.maxAge)) { | 726 if (!std::isnan(cacheControlHeader.maxAge)) { |
730 // First max-age directive wins if there are multiple ones. | 727 // First max-age directive wins if there are multiple ones. |
731 continue; | 728 continue; |
732 } | 729 } |
733 bool ok; | 730 bool ok; |
734 double maxAge = directives[i].second.toDouble(&ok); | 731 double maxAge = directives[i].second.toDouble(&ok); |
735 if (ok) | 732 if (ok) |
736 cacheControlHeader.maxAge = maxAge; | 733 cacheControlHeader.maxAge = maxAge; |
737 } else if (equalIgnoringCase(directives[i].first, | |
738 staleWhileRevalidateDirective)) { | |
739 if (!std::isnan(cacheControlHeader.staleWhileRevalidate)) { | |
740 // First stale-while-revalidate directive wins if there are multiple | |
741 // ones. | |
742 continue; | |
743 } | |
744 bool ok; | |
745 double staleWhileRevalidate = directives[i].second.toDouble(&ok); | |
746 if (ok) | |
747 cacheControlHeader.staleWhileRevalidate = staleWhileRevalidate; | |
748 } | 734 } |
749 } | 735 } |
750 } | 736 } |
751 | 737 |
752 if (!cacheControlHeader.containsNoCache) { | 738 if (!cacheControlHeader.containsNoCache) { |
753 // Handle Pragma: no-cache | 739 // Handle Pragma: no-cache |
754 // This is deprecated and equivalent to Cache-control: no-cache | 740 // This is deprecated and equivalent to Cache-control: no-cache |
755 // Don't bother tokenizing the value, it is not important | 741 // Don't bother tokenizing the value, it is not important |
756 cacheControlHeader.containsNoCache = | 742 cacheControlHeader.containsNoCache = |
757 pragmaValue.lower().contains(noCacheDirective); | 743 pragmaValue.lower().contains(noCacheDirective); |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
879 bool parseContentRangeHeaderFor206(const String& contentRange, | 865 bool parseContentRangeHeaderFor206(const String& contentRange, |
880 int64_t* firstBytePosition, | 866 int64_t* firstBytePosition, |
881 int64_t* lastBytePosition, | 867 int64_t* lastBytePosition, |
882 int64_t* instanceLength) { | 868 int64_t* instanceLength) { |
883 return net::HttpUtil::ParseContentRangeHeaderFor206( | 869 return net::HttpUtil::ParseContentRangeHeaderFor206( |
884 StringUTF8Adaptor(contentRange).asStringPiece(), firstBytePosition, | 870 StringUTF8Adaptor(contentRange).asStringPiece(), firstBytePosition, |
885 lastBytePosition, instanceLength); | 871 lastBytePosition, instanceLength); |
886 } | 872 } |
887 | 873 |
888 } // namespace blink | 874 } // namespace blink |
OLD | NEW |