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

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

Issue 1729963002: WIP/proof-of-concept to make blink::LinkHeader reuse net:: parsing code (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@string-tokenizer-brackets
Patch Set: Created 4 years, 9 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 "net/http/http_util.h"
8 #include "platform/ParsingUtilities.h"
9
10 namespace blink {
11
12 static LinkHeader::LinkParameterName paramterNameFromString(String name)
13 {
14 if (equalIgnoringCase(name, "rel"))
15 return LinkHeader::LinkParameterRel;
16 if (equalIgnoringCase(name, "anchor"))
17 return LinkHeader::LinkParameterAnchor;
18 if (equalIgnoringCase(name, "crossorigin"))
19 return LinkHeader::LinkParameterCrossOrigin;
20 if (equalIgnoringCase(name, "title"))
21 return LinkHeader::LinkParameterTitle;
22 if (equalIgnoringCase(name, "media"))
23 return LinkHeader::LinkParameterMedia;
24 if (equalIgnoringCase(name, "type"))
25 return LinkHeader::LinkParameterType;
26 if (equalIgnoringCase(name, "rev"))
27 return LinkHeader::LinkParameterRev;
28 if (equalIgnoringCase(name, "hreflang"))
29 return LinkHeader::LinkParameterHreflang;
30 if (equalIgnoringCase(name, "as"))
31 return LinkHeader::LinkParameterAs;
32 return LinkHeader::LinkParameterUnknown;
33 }
34
35 void LinkHeader::setValue(LinkParameterName name, String value)
36 {
37 // FIXME: Add support for more header parameters as neccessary.
38 if (name == LinkParameterRel && !m_rel)
39 m_rel = value.lower();
40 else if (name == LinkParameterAnchor)
41 m_isValid = false;
42 else if (name == LinkParameterCrossOrigin)
43 m_crossOrigin = value;
44 else if (name == LinkParameterAs)
45 m_as = value.lower();
46 }
47
48 static bool extractURL(std::string::const_iterator begin, std::string::const_ite rator end, std::string::const_iterator* urlBegin, std::string::const_iterator* u rlEnd)
49 {
50 if (begin == end)
51 return false;
52 if (*begin != '<')
53 return false;
54 ++begin;
55 *urlBegin = begin;
56 while (begin < end && *begin != '>')
57 ++begin;
58 *urlEnd = begin;
59 if (begin == end || *begin != '>')
60 return false;
61 return true;
62 }
63
64 LinkHeader::LinkHeader(std::string::const_iterator begin, std::string::const_ite rator end)
65 : m_isValid(true)
66 {
67 std::string::const_iterator urlBegin;
68 std::string::const_iterator urlEnd;
69 if (!extractURL(begin, end, &urlBegin, &urlEnd)) {
70 m_isValid = false;
71 return;
72 }
73 begin = urlEnd + 1;
74 net::HttpUtil::TrimLWS(&urlBegin, &urlEnd);
75 m_url = String(&urlBegin[0], urlEnd - urlBegin);
76
77 net::HttpUtil::TrimLWS(&begin, &end);
78 if (begin != end && *begin != ';') {
79 m_isValid = false;
80 return;
81 }
82 net::HttpUtil::NameValuePairsIterator params(begin, end, ';', net::HttpUtil: :NameValuePairsIterator::VALUES_OPTIONAL);
83 while (params.GetNext()) {
84 const char* nameBegin = &*params.name_begin();
85 LinkParameterName name = paramterNameFromString(String(nameBegin, params .name_end() - params.name_begin()));
86 const char* valueBegin = &*params.value_begin();
87 setValue(name, String(valueBegin, params.value_end() - params.value_begi n()));
88 }
89 }
90
91 LinkHeaderSet::LinkHeaderSet(const String& header)
92 {
93 if (header.isNull())
94 return;
95
96 ASSERT(header.is8Bit());
97 std::string headerString(reinterpret_cast<const char*>(header.characters8()) , header.length());
98 base::StringTokenizer tokenizer(headerString, ",");
99 tokenizer.set_paired_quote_chars("\"'<", "\"'>");
100 while (tokenizer.GetNext()) {
101 std::string::const_iterator valueBegin = tokenizer.token_begin();
102 std::string::const_iterator valueEnd = tokenizer.token_end();
103 net::HttpUtil::TrimLWS(&valueBegin, &valueEnd);
104 if (valueBegin != valueEnd)
105 m_headerSet.append(LinkHeader(valueBegin, valueEnd));
106 }
107 }
108
109 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/platform/network/LinkHeader.h ('k') | third_party/WebKit/Source/platform/network/LinkHeaderTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698