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 "HTTPParsers.h" | 6 #include "HTTPParsers.h" |
7 | 7 |
8 #include "wtf/MathExtras.h" | 8 #include "wtf/MathExtras.h" |
| 9 #include "wtf/testing/WTFTestHelpers.h" |
9 #include "wtf/text/AtomicString.h" | 10 #include "wtf/text/AtomicString.h" |
10 | 11 |
11 #include <gtest/gtest.h> | 12 #include <gtest/gtest.h> |
12 | 13 |
13 namespace WebCore { | 14 namespace WebCore { |
14 | 15 |
| 16 namespace { |
| 17 |
| 18 size_t parseHTTPHeader(const char* data, String& failureReason, AtomicString& na
meStr, AtomicString& valueStr) |
| 19 { |
| 20 return WebCore::parseHTTPHeader(data, strlen(data), failureReason, nameStr,
valueStr); |
| 21 } |
| 22 |
| 23 } // namespace |
| 24 |
15 TEST(HTTPParsersTest, ParseCacheControl) | 25 TEST(HTTPParsersTest, ParseCacheControl) |
16 { | 26 { |
17 CacheControlHeader header; | 27 CacheControlHeader header; |
18 | 28 |
19 header = parseCacheControlDirectives("no-cache", AtomicString()); | 29 header = parseCacheControlDirectives("no-cache", AtomicString()); |
20 EXPECT_TRUE(header.parsed); | 30 EXPECT_TRUE(header.parsed); |
21 EXPECT_TRUE(header.containsNoCache); | 31 EXPECT_TRUE(header.containsNoCache); |
22 EXPECT_FALSE(header.containsNoStore); | 32 EXPECT_FALSE(header.containsNoStore); |
23 EXPECT_FALSE(header.containsMustRevalidate); | 33 EXPECT_FALSE(header.containsMustRevalidate); |
24 EXPECT_TRUE(std::isnan(header.maxAge)); | 34 EXPECT_TRUE(std::isnan(header.maxAge)); |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
87 EXPECT_TRUE(std::isnan(header.maxAge)); | 97 EXPECT_TRUE(std::isnan(header.maxAge)); |
88 | 98 |
89 header = parseCacheControlDirectives(AtomicString(), "no-cache"); | 99 header = parseCacheControlDirectives(AtomicString(), "no-cache"); |
90 EXPECT_TRUE(header.parsed); | 100 EXPECT_TRUE(header.parsed); |
91 EXPECT_TRUE(header.containsNoCache); | 101 EXPECT_TRUE(header.containsNoCache); |
92 EXPECT_FALSE(header.containsNoStore); | 102 EXPECT_FALSE(header.containsNoStore); |
93 EXPECT_FALSE(header.containsMustRevalidate); | 103 EXPECT_FALSE(header.containsMustRevalidate); |
94 EXPECT_TRUE(std::isnan(header.maxAge)); | 104 EXPECT_TRUE(std::isnan(header.maxAge)); |
95 } | 105 } |
96 | 106 |
| 107 TEST(HTTPParsersTest, parseHTTPHeaderSimple) |
| 108 { |
| 109 String failureReason; |
| 110 AtomicString name, value; |
| 111 EXPECT_EQ(11u, parseHTTPHeader("foo: bar\r\notherdata", failureReason, nam
e, value)); |
| 112 EXPECT_TRUE(failureReason.isEmpty()); |
| 113 EXPECT_EQ("foo", name.string()); |
| 114 EXPECT_EQ("bar", value.string()); |
| 115 } |
| 116 |
| 117 TEST(HTTPParsersTest, parseHTTPHeaderEmptyName) |
| 118 { |
| 119 String failureReason; |
| 120 AtomicString name, value; |
| 121 EXPECT_EQ(0u, parseHTTPHeader(": bar\r\notherdata", failureReason, name, val
ue)); |
| 122 EXPECT_EQ("Header name is missing", failureReason); |
| 123 } |
| 124 |
| 125 TEST(HTTPParsersTest, parseHTTPHeaderEmptyValue) |
| 126 { |
| 127 String failureReason; |
| 128 AtomicString name, value; |
| 129 EXPECT_EQ(6u, parseHTTPHeader("foo: \r\notherdata", failureReason, name, val
ue)); |
| 130 EXPECT_TRUE(failureReason.isEmpty()); |
| 131 EXPECT_EQ("foo", name.string()); |
| 132 EXPECT_TRUE(value.isEmpty()); |
| 133 } |
| 134 |
| 135 TEST(HTTPParsersTest, parseHTTPHeaderInvalidName) |
| 136 { |
| 137 String failureReason; |
| 138 AtomicString name, value; |
| 139 EXPECT_EQ(0u, parseHTTPHeader("\xfa: \r\notherdata", failureReason, name, va
lue)); |
| 140 EXPECT_EQ("Invalid UTF-8 sequence in header name", failureReason); |
| 141 } |
| 142 |
| 143 TEST(HTTPParsersTest, parseHTTPHeaderInvalidValue) |
| 144 { |
| 145 String failureReason; |
| 146 AtomicString name, value; |
| 147 EXPECT_EQ(0u, parseHTTPHeader("foo: \xfa\r\notherdata", failureReason, name,
value)); |
| 148 EXPECT_EQ("Invalid UTF-8 sequence in header value", failureReason); |
| 149 } |
| 150 |
| 151 TEST(HTTPParsersTest, parseHTTPHeaderEmpty) |
| 152 { |
| 153 String failureReason; |
| 154 AtomicString name, value; |
| 155 EXPECT_EQ(0u, parseHTTPHeader("", failureReason, name, value)); |
| 156 EXPECT_EQ("Unterminated header name", failureReason); |
| 157 } |
| 158 |
| 159 TEST(HTTPParsersTest, parseHTTPHeaderEmptyLine) |
| 160 { |
| 161 String failureReason; |
| 162 AtomicString name, value; |
| 163 EXPECT_EQ(2u, parseHTTPHeader("\r\notherdata", failureReason, name, value)); |
| 164 EXPECT_TRUE(failureReason.isEmpty()); |
| 165 EXPECT_TRUE(name.isNull()); |
| 166 EXPECT_TRUE(value.isNull()); |
| 167 } |
| 168 |
| 169 TEST(HTTPParsersTest, parseHTTPHeaderUnexpectedCRinName) |
| 170 { |
| 171 String failureReason; |
| 172 AtomicString name, value; |
| 173 EXPECT_EQ(0u, parseHTTPHeader("foo\rotherdata\n", failureReason, name, value
)); |
| 174 EXPECT_EQ("Unexpected CR in name at foo", failureReason); |
| 175 } |
| 176 |
| 177 TEST(HTTPParsersTest, parseHTTPHeaderUnexpectedLFinName) |
| 178 { |
| 179 String failureReason; |
| 180 AtomicString name, value; |
| 181 EXPECT_EQ(0u, parseHTTPHeader("foo\notherdata\n", failureReason, name, value
)); |
| 182 EXPECT_EQ("Unexpected LF in name at foo", failureReason); |
| 183 } |
| 184 |
| 185 TEST(HTTPParsersTest, parseHTTPHeaderUnexpectedLFinValue) |
| 186 { |
| 187 String failureReason; |
| 188 AtomicString name, value; |
| 189 EXPECT_EQ(0u, parseHTTPHeader("foo: bar\notherdata\n", failureReason, name,
value)); |
| 190 EXPECT_EQ("Unexpected LF in value at bar", failureReason); |
| 191 } |
| 192 |
| 193 TEST(HTTPParsersTest, parseHTTPHeaderNoLFAtEndOfLine) |
| 194 { |
| 195 String failureReason; |
| 196 AtomicString name, value; |
| 197 EXPECT_EQ(0u, parseHTTPHeader("foo: bar\r", failureReason, name, value)); |
| 198 EXPECT_EQ("LF doesn't follow CR after value at ", failureReason); |
| 199 } |
| 200 |
| 201 TEST(HTTPParsersTest, parseHTTPHeaderNoLF) |
| 202 { |
| 203 String failureReason; |
| 204 AtomicString name, value; |
| 205 EXPECT_EQ(0u, parseHTTPHeader("foo: bar\rhoge\r\n", failureReason, name, val
ue)); |
| 206 EXPECT_EQ("LF doesn't follow CR after value at hoge\r\n", failureReason); |
| 207 } |
| 208 |
| 209 TEST(HTTPParsersTest, parseHTTPHeaderTwoLines) |
| 210 { |
| 211 const char data[] = "foo: bar\r\nhoge: fuga\r\nxxx"; |
| 212 String failureReason; |
| 213 AtomicString name, value; |
| 214 |
| 215 EXPECT_EQ(9u, parseHTTPHeader(data, failureReason, name, value)); |
| 216 EXPECT_TRUE(failureReason.isEmpty()); |
| 217 EXPECT_EQ("foo", name.string()); |
| 218 EXPECT_EQ("bar", value.string()); |
| 219 |
| 220 EXPECT_EQ(11u, parseHTTPHeader(data + 10, failureReason, name, value)); |
| 221 EXPECT_TRUE(failureReason.isEmpty()); |
| 222 EXPECT_EQ("hoge", name.string()); |
| 223 EXPECT_EQ("fuga", value.string()); |
| 224 } |
| 225 |
97 } // namespace WebCore | 226 } // namespace WebCore |
98 | 227 |
OLD | NEW |