File: LinkHeader.cpp

package info (click to toggle)
chromium-browser 57.0.2987.98-1~deb8u1
  • links: PTS, VCS
  • area: main
  • in suites: jessie
  • size: 2,637,852 kB
  • ctags: 2,544,394
  • sloc: cpp: 12,815,961; ansic: 3,676,222; python: 1,147,112; asm: 526,608; java: 523,212; xml: 286,794; perl: 92,654; sh: 86,408; objc: 73,271; makefile: 27,698; cs: 18,487; yacc: 13,031; tcl: 12,957; pascal: 4,875; ml: 4,716; lex: 3,904; sql: 3,862; ruby: 1,982; lisp: 1,508; php: 1,368; exp: 404; awk: 325; csh: 117; jsp: 39; sed: 37
file content (86 lines) | stat: -rw-r--r-- 3,183 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
// Copyright 2015 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 "platform/network/LinkHeader.h"

#include "base/strings/string_util.h"
#include "components/link_header_util/link_header_util.h"
#include "wtf/text/ParsingUtilities.h"

namespace blink {

// Verify that the parameter is a link-extension which according to spec doesn't
// have to have a value.
static bool isExtensionParameter(LinkHeader::LinkParameterName name) {
  return name >= LinkHeader::LinkParameterUnknown;
}

static LinkHeader::LinkParameterName parameterNameFromString(
    base::StringPiece name) {
  if (base::EqualsCaseInsensitiveASCII(name, "rel"))
    return LinkHeader::LinkParameterRel;
  if (base::EqualsCaseInsensitiveASCII(name, "anchor"))
    return LinkHeader::LinkParameterAnchor;
  if (base::EqualsCaseInsensitiveASCII(name, "crossorigin"))
    return LinkHeader::LinkParameterCrossOrigin;
  if (base::EqualsCaseInsensitiveASCII(name, "title"))
    return LinkHeader::LinkParameterTitle;
  if (base::EqualsCaseInsensitiveASCII(name, "media"))
    return LinkHeader::LinkParameterMedia;
  if (base::EqualsCaseInsensitiveASCII(name, "type"))
    return LinkHeader::LinkParameterType;
  if (base::EqualsCaseInsensitiveASCII(name, "rev"))
    return LinkHeader::LinkParameterRev;
  if (base::EqualsCaseInsensitiveASCII(name, "hreflang"))
    return LinkHeader::LinkParameterHreflang;
  if (base::EqualsCaseInsensitiveASCII(name, "as"))
    return LinkHeader::LinkParameterAs;
  return LinkHeader::LinkParameterUnknown;
}

void LinkHeader::setValue(LinkParameterName name, const String& value) {
  if (name == LinkParameterRel && !m_rel)
    m_rel = value.lower();
  else if (name == LinkParameterAnchor)
    m_isValid = false;
  else if (name == LinkParameterCrossOrigin)
    m_crossOrigin = value;
  else if (name == LinkParameterAs)
    m_as = value.lower();
  else if (name == LinkParameterType)
    m_mimeType = value.lower();
  else if (name == LinkParameterMedia)
    m_media = value.lower();
}

template <typename Iterator>
LinkHeader::LinkHeader(Iterator begin, Iterator end) : m_isValid(true) {
  std::string url;
  std::unordered_map<std::string, base::Optional<std::string>> params;
  m_isValid = link_header_util::ParseLinkHeaderValue(begin, end, &url, &params);
  if (!m_isValid)
    return;

  m_url = String(&url[0], url.length());
  for (const auto& param : params) {
    LinkParameterName name = parameterNameFromString(param.first);
    if (!isExtensionParameter(name) && !param.second)
      m_isValid = false;
    std::string value = param.second.value_or("");
    setValue(name, String(&value[0], value.length()));
  }
}

LinkHeaderSet::LinkHeaderSet(const String& header) {
  if (header.isNull())
    return;

  DCHECK(header.is8Bit()) << "Headers should always be 8 bit";
  std::string headerString(reinterpret_cast<const char*>(header.characters8()),
                           header.length());
  for (const auto& value : link_header_util::SplitLinkHeader(headerString))
    m_headerSet.push_back(LinkHeader(value.first, value.second));
}

}  // namespace blink