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

Side by Side Diff: components/offline_pages/request_header/offline_page_header.cc

Issue 2489443002: Move all components/offline_pages/ files into component/offline_pages/core (Closed)
Patch Set: rebase Created 4 years 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
OLDNEW
(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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698