| 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 |