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

Side by Side Diff: third_party/WebKit/Source/platform/network/LinkHeader.cpp

Issue 1811163002: Share link header parsing code between blink and content. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@base-optional
Patch Set: address more comments Created 4 years, 7 months 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 2015 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 "platform/network/LinkHeader.h"
6
7 #include "components/link_header_util/link_header_util.h"
8 #include "platform/ParsingUtilities.h"
9
10 namespace blink {
11
12 // Verify that the parameter is a link-extension which according to spec doesn't have to have a value.
13 static bool isExtensionParameter(LinkHeader::LinkParameterName name)
14 {
15 return name >= LinkHeader::LinkParameterUnknown;
16 }
17
18 static LinkHeader::LinkParameterName parameterNameFromString(const String& name)
19 {
20 if (equalIgnoringCase(name, "rel"))
21 return LinkHeader::LinkParameterRel;
22 if (equalIgnoringCase(name, "anchor"))
23 return LinkHeader::LinkParameterAnchor;
24 if (equalIgnoringCase(name, "crossorigin"))
25 return LinkHeader::LinkParameterCrossOrigin;
26 if (equalIgnoringCase(name, "title"))
27 return LinkHeader::LinkParameterTitle;
28 if (equalIgnoringCase(name, "media"))
29 return LinkHeader::LinkParameterMedia;
30 if (equalIgnoringCase(name, "type"))
31 return LinkHeader::LinkParameterType;
32 if (equalIgnoringCase(name, "rev"))
33 return LinkHeader::LinkParameterRev;
34 if (equalIgnoringCase(name, "hreflang"))
35 return LinkHeader::LinkParameterHreflang;
36 if (equalIgnoringCase(name, "as"))
37 return LinkHeader::LinkParameterAs;
38 return LinkHeader::LinkParameterUnknown;
39 }
40
41 void LinkHeader::setValue(LinkParameterName name, const String& value)
42 {
43 if (name == LinkParameterRel && !m_rel)
44 m_rel = value.lower();
45 else if (name == LinkParameterAnchor)
46 m_isValid = false;
47 else if (name == LinkParameterCrossOrigin)
48 m_crossOrigin = value;
49 else if (name == LinkParameterAs)
50 m_as = value.lower();
51 else if (name == LinkParameterType)
52 m_mimeType = value.lower();
53 else if (name == LinkParameterMedia)
54 m_media = value.lower();
55 }
56
57 template <typename Iterator>
58 LinkHeader::LinkHeader(Iterator begin, Iterator end)
59 : m_isValid(true)
60 {
61 std::string url;
62 std::unordered_map<std::string, base::Optional<std::string>> params;
63 m_isValid = link_header_util::ParseLinkHeaderValue(begin, end, &url, &params );
64 if (!m_isValid)
65 return;
66
67 m_url = String(&url[0], url.length());
68 for (const auto& param : params) {
69 LinkParameterName name = parameterNameFromString(String(&param.first[0], param.first.length()));
70 if (!isExtensionParameter(name) && !param.second)
71 m_isValid = false;
72 std::string value = param.second.value_or("");
73 setValue(name, String(&value[0], value.length()));
74 }
75 }
76
77 LinkHeaderSet::LinkHeaderSet(const String& header)
78 {
79 if (header.isNull())
80 return;
81
82 DCHECK(header.is8Bit()) << "Headers should always be 8 bit";
83 std::string headerString(reinterpret_cast<const char*>(header.characters8()) , header.length());
84 for (const auto& value : link_header_util::SplitLinkHeader(headerString))
85 m_headerSet.append(LinkHeader(value.first, value.second));
86 }
87
88 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698