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

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

Issue 2880543003: Implement a parser for Content-Disposition header fields (Closed)
Patch Set: Rebase Created 3 years, 6 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 2017 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/ParsedContentHeaderFieldParameters.h"
6
7 #include "platform/network/HeaderFieldTokenizer.h"
8 #include "platform/wtf/text/StringBuilder.h"
9 #include "platform/wtf/text/StringView.h"
10
11 namespace blink {
12
13 ParsedContentHeaderFieldParameters::ParsedContentHeaderFieldParameters()
14 : is_valid_(false) {}
15
16 // static
17 ParsedContentHeaderFieldParameters
18 ParsedContentHeaderFieldParameters::CreateForTesting(const String& input,
19 Mode mode) {
20 ParsedContentHeaderFieldParameters parameters;
21 parameters.ParseParameters(HeaderFieldTokenizer(input), mode);
22 return parameters;
23 }
24
25 String ParsedContentHeaderFieldParameters::ParameterValueForName(
26 const String& name) const {
27 if (!name.ContainsOnlyASCII())
28 return String();
29 return parameters_.at(name.LowerASCII());
30 }
31
32 size_t ParsedContentHeaderFieldParameters::ParameterCount() const {
33 return parameters_.size();
34 }
35
36 // parameters := *(";" parameter)
37 //
38 // From http://tools.ietf.org/html/rfc2045#section-5.1:
39 //
40 // parameter := attribute "=" value
41 //
42 // attribute := token
43 // ; Matching of attributes
44 // ; is ALWAYS case-insensitive.
45 //
46 // value := token / quoted-string
47 //
48 // token := 1*<any (US-ASCII) CHAR except SPACE, CTLs,
49 // or tspecials>
50 //
51 // tspecials := "(" / ")" / "<" / ">" / "@" /
52 // "," / ";" / ":" / "\" / <">
53 // "/" / "[" / "]" / "?" / "="
54 // ; Must be in quoted-string,
55 // ; to use within parameter values
56 void ParsedContentHeaderFieldParameters::ParseParameters(
57 HeaderFieldTokenizer tokenizer,
58 Mode mode) {
59 DCHECK(!is_valid_);
60 DCHECK(parameters_.IsEmpty());
61
62 KeyValuePairs map;
63 for (;;) {
64 tokenizer.SkipSpaces();
65 if (tokenizer.IsConsumed())
66 break;
67
68 if (!tokenizer.Consume(';')) {
69 DVLOG(1) << "Failed to find ';'";
70 return;
71 }
72
73 StringView key;
74 String value;
75 if (!tokenizer.ConsumeToken(Mode::kNormal, key)) {
76 DVLOG(1) << "Invalid content parameter name. (at " << tokenizer.Index()
77 << ")";
78 return;
79 }
80 if (!tokenizer.Consume('=')) {
81 DVLOG(1) << "Failed to find '='";
82 return;
83 }
84 if (!tokenizer.ConsumeTokenOrQuotedString(mode, value)) {
85 DVLOG(1) << "Invalid content parameter value (at " << tokenizer.Index()
86 << ", for '" << key.ToString() << "').";
87 return;
88 }
89 // As |key| is parsed as a token, it consists of ascii characters
90 // and hence we don't need to care about non-ascii lowercasing.
91 DCHECK(key.ToString().ContainsOnlyASCII());
92 String key_string = key.ToString().LowerASCII();
93 if (mode == Mode::kStrict && map.find(key_string) != map.end()) {
94 DVLOG(1) << "Parameter " << key_string << " is defined multiple times.";
95 return;
96 }
97 map.Set(key_string, value);
98 }
99 parameters_ = std::move(map);
100 is_valid_ = true;
101 }
102
103 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698