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

Side by Side Diff: third_party/WebKit/Source/platform/network/HeaderFieldTokenizer.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/HeaderFieldTokenizer.h"
6
7 #include "platform/wtf/text/StringBuilder.h"
8 #include "platform/wtf/text/StringView.h"
9
10 namespace blink {
11
12 namespace {
13
14 using Mode = HeaderFieldTokenizer::Mode;
15
16 bool IsTokenCharacter(Mode mode, UChar c) {
17 if (c >= 128)
18 return false;
19 if (c < 0x20)
20 return false;
21
22 switch (c) {
23 case ' ':
24 case ';':
25 case '"':
26 return false;
27 case '(':
28 case ')':
29 case '<':
30 case '>':
31 case '@':
32 case ',':
33 case ':':
34 case '\\':
35 case '/':
36 case '[':
37 case ']':
38 case '?':
39 case '=':
40 return mode == Mode::kRelaxed;
41 default:
42 return true;
43 }
44 }
45
46 } // namespace
47
48 HeaderFieldTokenizer::HeaderFieldTokenizer(const String& header_field)
49 : index_(0u), input_(header_field) {}
50
51 HeaderFieldTokenizer::HeaderFieldTokenizer(HeaderFieldTokenizer&&) = default;
52
53 bool HeaderFieldTokenizer::Consume(char c) {
54 DCHECK_NE(c, ' ');
55
56 SkipSpaces();
57 if (IsConsumed() || input_[index_] != c)
58 return false;
59
60 ++index_;
61 return true;
62 }
63
64 bool HeaderFieldTokenizer::ConsumeQuotedString(String& output) {
65 StringBuilder builder;
66
67 DCHECK_EQ('"', input_[index_]);
68 ++index_;
69
70 while (!IsConsumed()) {
71 if (input_[index_] == '"') {
72 output = builder.ToString();
73 ++index_;
74 return true;
75 }
76 if (input_[index_] == '\\') {
77 ++index_;
78 if (IsConsumed())
79 return false;
80 }
81 builder.Append(input_[index_]);
82 ++index_;
83 }
84 return false;
85 }
86
87 bool HeaderFieldTokenizer::ConsumeToken(Mode mode, StringView& output) {
88 DCHECK(output.IsNull());
89
90 SkipSpaces();
91
92 auto start = index_;
93 while (!IsConsumed() && IsTokenCharacter(mode, input_[index_]))
94 ++index_;
95
96 if (start == index_)
97 return false;
98
99 output = StringView(input_, start, index_ - start);
100 return true;
101 }
102
103 bool HeaderFieldTokenizer::ConsumeTokenOrQuotedString(Mode mode,
104 String& output) {
105 SkipSpaces();
106 if (IsConsumed())
107 return false;
108
109 if (input_[index_] == '"')
110 return ConsumeQuotedString(output);
111
112 StringView view;
113 if (!ConsumeToken(mode, view))
114 return false;
115 output = view.ToString();
116 return true;
117 }
118
119 void HeaderFieldTokenizer::SkipSpaces() {
120 while (!IsConsumed() && input_[index_] == ' ')
121 ++index_;
122 }
123
124 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698