| Index: components/offline_pages/request_header/offline_page_header.cc
|
| diff --git a/components/offline_pages/request_header/offline_page_header.cc b/components/offline_pages/request_header/offline_page_header.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..18f9dedb776b5e7de9327020464236ea00a68c45
|
| --- /dev/null
|
| +++ b/components/offline_pages/request_header/offline_page_header.cc
|
| @@ -0,0 +1,109 @@
|
| +// Copyright 2016 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "components/offline_pages/request_header/offline_page_header.h"
|
| +
|
| +#include "base/strings/string_tokenizer.h"
|
| +#include "base/strings/string_util.h"
|
| +
|
| +namespace offline_pages {
|
| +
|
| +const char kOfflinePageHeader[] = "X-Chrome-offline";
|
| +const char kOfflinePageHeaderReasonKey[] = "reason";
|
| +const char kOfflinePageHeaderReasonValueDueToNetError[] = "error";
|
| +const char kOfflinePageHeaderReasonValueFromDownload[] = "download";
|
| +const char kOfflinePageHeaderReasonValueReload[] = "reload";
|
| +const char kOfflinePageHeaderPersistKey[] = "persist";
|
| +const char kOfflinePageHeaderIDKey[] = "id";
|
| +
|
| +namespace {
|
| +
|
| +std::string ReasonToString(OfflinePageHeader::Reason reason) {
|
| + switch (reason) {
|
| + case OfflinePageHeader::Reason::NET_ERROR:
|
| + return kOfflinePageHeaderReasonValueDueToNetError;
|
| + case OfflinePageHeader::Reason::DOWNLOAD:
|
| + return kOfflinePageHeaderReasonValueFromDownload;
|
| + case OfflinePageHeader::Reason::RELOAD:
|
| + return kOfflinePageHeaderReasonValueReload;
|
| + default:
|
| + NOTREACHED();
|
| + return "";
|
| + }
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +OfflinePageHeader::OfflinePageHeader()
|
| + : need_to_persist(false),
|
| + reason(Reason::NONE) {
|
| +}
|
| +
|
| +OfflinePageHeader::~OfflinePageHeader() {}
|
| +
|
| +bool OfflinePageHeader::ParseFromHeaderValue(const std::string& header_value) {
|
| + // If the offline header is not present, treat it as not parsed successfully.
|
| + if (header_value.empty())
|
| + return false;
|
| +
|
| + base::StringTokenizer tokenizer(header_value, ", ");
|
| + while (tokenizer.GetNext()) {
|
| + std::string pair = tokenizer.token();
|
| + std::size_t pos = pair.find('=');
|
| + if (pos == std::string::npos)
|
| + return false;
|
| + std::string key = base::ToLowerASCII(pair.substr(0, pos));
|
| + std::string value = base::ToLowerASCII(pair.substr(pos + 1));
|
| + if (key == kOfflinePageHeaderPersistKey) {
|
| + need_to_persist = (value == "1");
|
| + } else if (key == kOfflinePageHeaderReasonKey) {
|
| + if (value == kOfflinePageHeaderReasonValueDueToNetError)
|
| + reason = Reason::NET_ERROR;
|
| + else if (value == kOfflinePageHeaderReasonValueFromDownload)
|
| + reason = Reason::DOWNLOAD;
|
| + else if (value == kOfflinePageHeaderReasonValueReload)
|
| + reason = Reason::RELOAD;
|
| + else
|
| + reason = Reason::UNKNOWN;
|
| + } else if (key == kOfflinePageHeaderIDKey) {
|
| + id = value;
|
| + }
|
| + }
|
| +
|
| + return true;
|
| +}
|
| +
|
| +std::string OfflinePageHeader::ToFullHeaderString() const {
|
| + if (reason == Reason::NONE)
|
| + return std::string();
|
| +
|
| + std::string value(kOfflinePageHeader);
|
| + value += ": ";
|
| +
|
| + value += kOfflinePageHeaderPersistKey;
|
| + value += "=";
|
| + value += need_to_persist ? "1" : "0";
|
| +
|
| + value += " " ;
|
| + value += kOfflinePageHeaderReasonKey;
|
| + value += "=";
|
| + value += ReasonToString(reason);
|
| +
|
| + if (!id.empty()) {
|
| + value += " " ;
|
| + value += kOfflinePageHeaderIDKey;
|
| + value += "=";
|
| + value += id;
|
| + }
|
| +
|
| + return value;
|
| +}
|
| +
|
| +void OfflinePageHeader::Clear() {
|
| + reason = Reason::NONE;
|
| + need_to_persist = false;
|
| + id.clear();
|
| +}
|
| +
|
| +} // namespace offline_pages
|
|
|