OLD | NEW |
| (Empty) |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "components/offline_pages/request_header/offline_page_header.h" | |
6 | |
7 #include "base/strings/string_tokenizer.h" | |
8 #include "base/strings/string_util.h" | |
9 | |
10 namespace offline_pages { | |
11 | |
12 const char kOfflinePageHeader[] = "X-Chrome-offline"; | |
13 const char kOfflinePageHeaderReasonKey[] = "reason"; | |
14 const char kOfflinePageHeaderReasonValueDueToNetError[] = "error"; | |
15 const char kOfflinePageHeaderReasonValueFromDownload[] = "download"; | |
16 const char kOfflinePageHeaderReasonValueReload[] = "reload"; | |
17 const char kOfflinePageHeaderPersistKey[] = "persist"; | |
18 const char kOfflinePageHeaderIDKey[] = "id"; | |
19 | |
20 namespace { | |
21 | |
22 bool ParseOfflineHeaderValue(const std::string& header_value, | |
23 bool* need_to_persist, | |
24 OfflinePageHeader::Reason* reason, | |
25 std::string* id) { | |
26 // If the offline header is not present, treat it as not parsed successfully. | |
27 if (header_value.empty()) | |
28 return false; | |
29 | |
30 bool token_found = false; | |
31 base::StringTokenizer tokenizer(header_value, ", "); | |
32 while (tokenizer.GetNext()) { | |
33 token_found = true; | |
34 std::string pair = tokenizer.token(); | |
35 std::size_t pos = pair.find('='); | |
36 if (pos == std::string::npos) | |
37 return false; | |
38 std::string key = base::ToLowerASCII(pair.substr(0, pos)); | |
39 std::string value = base::ToLowerASCII(pair.substr(pos + 1)); | |
40 if (key == kOfflinePageHeaderPersistKey) { | |
41 if (value == "1") | |
42 *need_to_persist = true; | |
43 else if (value == "0") | |
44 *need_to_persist = false; | |
45 else | |
46 return false; | |
47 } else if (key == kOfflinePageHeaderReasonKey) { | |
48 if (value == kOfflinePageHeaderReasonValueDueToNetError) | |
49 *reason = OfflinePageHeader::Reason::NET_ERROR; | |
50 else if (value == kOfflinePageHeaderReasonValueFromDownload) | |
51 *reason = OfflinePageHeader::Reason::DOWNLOAD; | |
52 else if (value == kOfflinePageHeaderReasonValueReload) | |
53 *reason = OfflinePageHeader::Reason::RELOAD; | |
54 else | |
55 return false; | |
56 } else if (key == kOfflinePageHeaderIDKey) { | |
57 *id = value; | |
58 } else { | |
59 return false; | |
60 } | |
61 } | |
62 | |
63 return token_found; | |
64 } | |
65 | |
66 std::string ReasonToString(OfflinePageHeader::Reason reason) { | |
67 switch (reason) { | |
68 case OfflinePageHeader::Reason::NET_ERROR: | |
69 return kOfflinePageHeaderReasonValueDueToNetError; | |
70 case OfflinePageHeader::Reason::DOWNLOAD: | |
71 return kOfflinePageHeaderReasonValueFromDownload; | |
72 case OfflinePageHeader::Reason::RELOAD: | |
73 return kOfflinePageHeaderReasonValueReload; | |
74 default: | |
75 NOTREACHED(); | |
76 return ""; | |
77 } | |
78 } | |
79 | |
80 } // namespace | |
81 | |
82 OfflinePageHeader::OfflinePageHeader() | |
83 : did_fail_parsing_for_test(false), | |
84 need_to_persist(false), | |
85 reason(Reason::NONE) { | |
86 } | |
87 | |
88 OfflinePageHeader::OfflinePageHeader(const std::string& header_value) | |
89 : did_fail_parsing_for_test(false), | |
90 need_to_persist(false), | |
91 reason(Reason::NONE) { | |
92 if (!ParseOfflineHeaderValue(header_value, &need_to_persist, &reason, &id)) { | |
93 did_fail_parsing_for_test = true; | |
94 Clear(); | |
95 } | |
96 } | |
97 | |
98 OfflinePageHeader::~OfflinePageHeader() {} | |
99 | |
100 std::string OfflinePageHeader::GetCompleteHeaderString() const { | |
101 if (reason == Reason::NONE) | |
102 return std::string(); | |
103 | |
104 std::string value(kOfflinePageHeader); | |
105 value += ": "; | |
106 | |
107 value += kOfflinePageHeaderPersistKey; | |
108 value += "="; | |
109 value += need_to_persist ? "1" : "0"; | |
110 | |
111 value += " " ; | |
112 value += kOfflinePageHeaderReasonKey; | |
113 value += "="; | |
114 value += ReasonToString(reason); | |
115 | |
116 if (!id.empty()) { | |
117 value += " " ; | |
118 value += kOfflinePageHeaderIDKey; | |
119 value += "="; | |
120 value += id; | |
121 } | |
122 | |
123 return value; | |
124 } | |
125 | |
126 void OfflinePageHeader::Clear() { | |
127 reason = Reason::NONE; | |
128 need_to_persist = false; | |
129 id.clear(); | |
130 } | |
131 | |
132 } // namespace offline_pages | |
OLD | NEW |