OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "config.h" | 5 #include "config.h" |
6 #include "platform/network/HTTPParsers.h" | 6 #include "platform/network/HTTPParsers.h" |
7 | 7 |
8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
9 #include "wtf/MathExtras.h" | 9 #include "wtf/MathExtras.h" |
10 #include "wtf/text/AtomicString.h" | 10 #include "wtf/text/AtomicString.h" |
11 | 11 |
12 namespace blink { | 12 namespace blink { |
13 | 13 |
14 namespace { | |
15 | |
16 size_t parseHTTPHeader(const char* data, String& failureReason, AtomicString& na
meStr, AtomicString& valueStr) | |
17 { | |
18 return blink::parseHTTPHeader(data, strlen(data), failureReason, nameStr, va
lueStr); | |
19 } | |
20 | |
21 } // namespace | |
22 | |
23 TEST(HTTPParsersTest, ParseCacheControl) | 14 TEST(HTTPParsersTest, ParseCacheControl) |
24 { | 15 { |
25 CacheControlHeader header; | 16 CacheControlHeader header; |
26 | 17 |
27 header = parseCacheControlDirectives("no-cache", AtomicString()); | 18 header = parseCacheControlDirectives("no-cache", AtomicString()); |
28 EXPECT_TRUE(header.parsed); | 19 EXPECT_TRUE(header.parsed); |
29 EXPECT_TRUE(header.containsNoCache); | 20 EXPECT_TRUE(header.containsNoCache); |
30 EXPECT_FALSE(header.containsNoStore); | 21 EXPECT_FALSE(header.containsNoStore); |
31 EXPECT_FALSE(header.containsMustRevalidate); | 22 EXPECT_FALSE(header.containsMustRevalidate); |
32 EXPECT_TRUE(std::isnan(header.maxAge)); | 23 EXPECT_TRUE(std::isnan(header.maxAge)); |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
95 EXPECT_TRUE(std::isnan(header.maxAge)); | 86 EXPECT_TRUE(std::isnan(header.maxAge)); |
96 | 87 |
97 header = parseCacheControlDirectives(AtomicString(), "no-cache"); | 88 header = parseCacheControlDirectives(AtomicString(), "no-cache"); |
98 EXPECT_TRUE(header.parsed); | 89 EXPECT_TRUE(header.parsed); |
99 EXPECT_TRUE(header.containsNoCache); | 90 EXPECT_TRUE(header.containsNoCache); |
100 EXPECT_FALSE(header.containsNoStore); | 91 EXPECT_FALSE(header.containsNoStore); |
101 EXPECT_FALSE(header.containsMustRevalidate); | 92 EXPECT_FALSE(header.containsMustRevalidate); |
102 EXPECT_TRUE(std::isnan(header.maxAge)); | 93 EXPECT_TRUE(std::isnan(header.maxAge)); |
103 } | 94 } |
104 | 95 |
105 TEST(HTTPParsersTest, parseHTTPHeaderSimple) | |
106 { | |
107 String failureReason; | |
108 AtomicString name, value; | |
109 EXPECT_EQ(12u, parseHTTPHeader("foo: bar\r\notherdata", failureReason, nam
e, value)); | |
110 EXPECT_TRUE(failureReason.isEmpty()); | |
111 EXPECT_EQ("foo", name.string()); | |
112 EXPECT_EQ("bar", value.string()); | |
113 } | |
114 | |
115 TEST(HTTPParsersTest, parseHTTPHeaderEmptyName) | |
116 { | |
117 String failureReason; | |
118 AtomicString name, value; | |
119 EXPECT_EQ(0u, parseHTTPHeader(": bar\r\notherdata", failureReason, name, val
ue)); | |
120 EXPECT_EQ("Header name is missing", failureReason); | |
121 } | |
122 | |
123 TEST(HTTPParsersTest, parseHTTPHeaderEmptyValue) | |
124 { | |
125 String failureReason; | |
126 AtomicString name, value; | |
127 EXPECT_EQ(7u, parseHTTPHeader("foo: \r\notherdata", failureReason, name, val
ue)); | |
128 EXPECT_TRUE(failureReason.isEmpty()); | |
129 EXPECT_EQ("foo", name.string()); | |
130 EXPECT_TRUE(value.isEmpty()); | |
131 } | |
132 | |
133 TEST(HTTPParsersTest, parseHTTPHeaderInvalidName) | |
134 { | |
135 String failureReason; | |
136 AtomicString name, value; | |
137 EXPECT_EQ(0u, parseHTTPHeader("\xfa: \r\notherdata", failureReason, name, va
lue)); | |
138 EXPECT_EQ("Invalid UTF-8 sequence in header name", failureReason); | |
139 } | |
140 | |
141 TEST(HTTPParsersTest, parseHTTPHeaderInvalidValue) | |
142 { | |
143 String failureReason; | |
144 AtomicString name, value; | |
145 EXPECT_EQ(0u, parseHTTPHeader("foo: \xfa\r\notherdata", failureReason, name,
value)); | |
146 EXPECT_EQ("Invalid UTF-8 sequence in header value", failureReason); | |
147 } | |
148 | |
149 TEST(HTTPParsersTest, parseHTTPHeaderEmpty) | |
150 { | |
151 String failureReason; | |
152 AtomicString name, value; | |
153 EXPECT_EQ(0u, parseHTTPHeader("", failureReason, name, value)); | |
154 EXPECT_EQ("Unterminated header name", failureReason); | |
155 } | |
156 | |
157 TEST(HTTPParsersTest, parseHTTPHeaderEmptyLine) | |
158 { | |
159 String failureReason; | |
160 AtomicString name, value; | |
161 EXPECT_EQ(2u, parseHTTPHeader("\r\notherdata", failureReason, name, value)); | |
162 EXPECT_TRUE(failureReason.isEmpty()); | |
163 EXPECT_TRUE(name.isNull()); | |
164 EXPECT_TRUE(value.isNull()); | |
165 } | |
166 | |
167 TEST(HTTPParsersTest, parseHTTPHeaderUnexpectedCRinName) | |
168 { | |
169 String failureReason; | |
170 AtomicString name, value; | |
171 EXPECT_EQ(0u, parseHTTPHeader("foo\rotherdata\n", failureReason, name, value
)); | |
172 EXPECT_EQ("Unexpected CR in name at foo", failureReason); | |
173 } | |
174 | |
175 TEST(HTTPParsersTest, parseHTTPHeaderUnexpectedLFinName) | |
176 { | |
177 String failureReason; | |
178 AtomicString name, value; | |
179 EXPECT_EQ(0u, parseHTTPHeader("foo\notherdata\n", failureReason, name, value
)); | |
180 EXPECT_EQ("Unexpected LF in name at foo", failureReason); | |
181 } | |
182 | |
183 TEST(HTTPParsersTest, parseHTTPHeaderUnexpectedLFinValue) | |
184 { | |
185 String failureReason; | |
186 AtomicString name, value; | |
187 EXPECT_EQ(0u, parseHTTPHeader("foo: bar\notherdata\n", failureReason, name,
value)); | |
188 EXPECT_EQ("Unexpected LF in value at bar", failureReason); | |
189 } | |
190 | |
191 TEST(HTTPParsersTest, parseHTTPHeaderNoLFAtEndOfLine) | |
192 { | |
193 String failureReason; | |
194 AtomicString name, value; | |
195 EXPECT_EQ(0u, parseHTTPHeader("foo: bar\r", failureReason, name, value)); | |
196 EXPECT_EQ("LF doesn't follow CR after value at ", failureReason); | |
197 } | |
198 | |
199 TEST(HTTPParsersTest, parseHTTPHeaderNoLF) | |
200 { | |
201 String failureReason; | |
202 AtomicString name, value; | |
203 EXPECT_EQ(0u, parseHTTPHeader("foo: bar\rhoge\r\n", failureReason, name, val
ue)); | |
204 EXPECT_EQ("LF doesn't follow CR after value at hoge\r\n", failureReason); | |
205 } | |
206 | |
207 TEST(HTTPParsersTest, parseHTTPHeaderTwoLines) | |
208 { | |
209 const char data[] = "foo: bar\r\nhoge: fuga\r\nxxx"; | |
210 String failureReason; | |
211 AtomicString name, value; | |
212 | |
213 EXPECT_EQ(10u, parseHTTPHeader(data, failureReason, name, value)); | |
214 EXPECT_TRUE(failureReason.isEmpty()); | |
215 EXPECT_EQ("foo", name.string()); | |
216 EXPECT_EQ("bar", value.string()); | |
217 | |
218 EXPECT_EQ(12u, parseHTTPHeader(data + 10, failureReason, name, value)); | |
219 EXPECT_TRUE(failureReason.isEmpty()); | |
220 EXPECT_EQ("hoge", name.string()); | |
221 EXPECT_EQ("fuga", value.string()); | |
222 } | |
223 | |
224 TEST(HTTPParsersTest, CommaDelimitedHeaderSet) | 96 TEST(HTTPParsersTest, CommaDelimitedHeaderSet) |
225 { | 97 { |
226 CommaDelimitedHeaderSet set1; | 98 CommaDelimitedHeaderSet set1; |
227 CommaDelimitedHeaderSet set2; | 99 CommaDelimitedHeaderSet set2; |
228 parseCommaDelimitedHeader("dpr, rw, whatever", set1); | 100 parseCommaDelimitedHeader("dpr, rw, whatever", set1); |
229 EXPECT_TRUE(set1.contains("dpr")); | 101 EXPECT_TRUE(set1.contains("dpr")); |
230 EXPECT_TRUE(set1.contains("rw")); | 102 EXPECT_TRUE(set1.contains("rw")); |
231 EXPECT_TRUE(set1.contains("whatever")); | 103 EXPECT_TRUE(set1.contains("whatever")); |
232 parseCommaDelimitedHeader("dprw\t , fo\to", set2); | 104 parseCommaDelimitedHeader("dprw\t , fo\to", set2); |
233 EXPECT_FALSE(set2.contains("dpr")); | 105 EXPECT_FALSE(set2.contains("dpr")); |
(...skipping 22 matching lines...) Expand all Loading... |
256 EXPECT_FALSE(blink::isValidHTTPFieldContentRFC7230("t ")); | 128 EXPECT_FALSE(blink::isValidHTTPFieldContentRFC7230("t ")); |
257 EXPECT_FALSE(blink::isValidHTTPFieldContentRFC7230(String("t\0t", 3))); | 129 EXPECT_FALSE(blink::isValidHTTPFieldContentRFC7230(String("t\0t", 3))); |
258 EXPECT_FALSE(blink::isValidHTTPFieldContentRFC7230(String("\0", 1))); | 130 EXPECT_FALSE(blink::isValidHTTPFieldContentRFC7230(String("\0", 1))); |
259 EXPECT_FALSE(blink::isValidHTTPFieldContentRFC7230(String("test \0, 6"))); | 131 EXPECT_FALSE(blink::isValidHTTPFieldContentRFC7230(String("test \0, 6"))); |
260 EXPECT_FALSE(blink::isValidHTTPFieldContentRFC7230(String("test "))); | 132 EXPECT_FALSE(blink::isValidHTTPFieldContentRFC7230(String("test "))); |
261 EXPECT_FALSE(blink::isValidHTTPFieldContentRFC7230("test\r\n data")); | 133 EXPECT_FALSE(blink::isValidHTTPFieldContentRFC7230("test\r\n data")); |
262 EXPECT_FALSE(blink::isValidHTTPFieldContentRFC7230(String(hiraganaA))); | 134 EXPECT_FALSE(blink::isValidHTTPFieldContentRFC7230(String(hiraganaA))); |
263 } | 135 } |
264 | 136 |
265 } // namespace blink | 137 } // namespace blink |
266 | |
OLD | NEW |