1 #include "quiche/balsa/header_properties.h"
2
3 #include "quiche/common/platform/api/quiche_test.h"
4
5 namespace quiche::header_properties::test {
6 namespace {
7
TEST(HeaderPropertiesTest,IsMultivaluedHeaderIsCaseInsensitive)8 TEST(HeaderPropertiesTest, IsMultivaluedHeaderIsCaseInsensitive) {
9 EXPECT_TRUE(IsMultivaluedHeader("content-encoding"));
10 EXPECT_TRUE(IsMultivaluedHeader("Content-Encoding"));
11 EXPECT_TRUE(IsMultivaluedHeader("set-cookie"));
12 EXPECT_TRUE(IsMultivaluedHeader("sEt-cOOkie"));
13 EXPECT_TRUE(IsMultivaluedHeader("X-Goo" /**/ "gle-Cache-Control"));
14 EXPECT_TRUE(IsMultivaluedHeader("access-control-expose-HEADERS"));
15
16 EXPECT_FALSE(IsMultivaluedHeader("set-cook"));
17 EXPECT_FALSE(IsMultivaluedHeader("content-length"));
18 EXPECT_FALSE(IsMultivaluedHeader("Content-Length"));
19 }
20
TEST(HeaderPropertiesTest,IsInvalidHeaderKeyChar)21 TEST(HeaderPropertiesTest, IsInvalidHeaderKeyChar) {
22 EXPECT_TRUE(IsInvalidHeaderKeyChar(0x00));
23 EXPECT_TRUE(IsInvalidHeaderKeyChar(0x06));
24 EXPECT_TRUE(IsInvalidHeaderKeyChar(0x09));
25 EXPECT_TRUE(IsInvalidHeaderKeyChar(0x1F));
26 EXPECT_TRUE(IsInvalidHeaderKeyChar(0x7F));
27 EXPECT_TRUE(IsInvalidHeaderKeyChar(' '));
28 EXPECT_TRUE(IsInvalidHeaderKeyChar('"'));
29 EXPECT_TRUE(IsInvalidHeaderKeyChar('\t'));
30 EXPECT_TRUE(IsInvalidHeaderKeyChar('\r'));
31 EXPECT_TRUE(IsInvalidHeaderKeyChar('\n'));
32 EXPECT_TRUE(IsInvalidHeaderKeyChar('}'));
33
34 EXPECT_FALSE(IsInvalidHeaderKeyChar('a'));
35 EXPECT_FALSE(IsInvalidHeaderKeyChar('B'));
36 EXPECT_FALSE(IsInvalidHeaderKeyChar('7'));
37 EXPECT_FALSE(IsInvalidHeaderKeyChar(0x42));
38 EXPECT_FALSE(IsInvalidHeaderKeyChar(0x7C));
39 EXPECT_FALSE(IsInvalidHeaderKeyChar(0x7E));
40 }
41
TEST(HeaderPropertiesTest,IsInvalidHeaderKeyCharAllowDoubleQuote)42 TEST(HeaderPropertiesTest, IsInvalidHeaderKeyCharAllowDoubleQuote) {
43 EXPECT_TRUE(IsInvalidHeaderKeyCharAllowDoubleQuote(0x00));
44 EXPECT_TRUE(IsInvalidHeaderKeyCharAllowDoubleQuote(0x06));
45 EXPECT_TRUE(IsInvalidHeaderKeyCharAllowDoubleQuote(0x09));
46 EXPECT_TRUE(IsInvalidHeaderKeyCharAllowDoubleQuote(0x1F));
47 EXPECT_TRUE(IsInvalidHeaderKeyCharAllowDoubleQuote(0x7F));
48 EXPECT_TRUE(IsInvalidHeaderKeyCharAllowDoubleQuote(' '));
49 EXPECT_TRUE(IsInvalidHeaderKeyCharAllowDoubleQuote('\t'));
50 EXPECT_TRUE(IsInvalidHeaderKeyCharAllowDoubleQuote('\r'));
51 EXPECT_TRUE(IsInvalidHeaderKeyCharAllowDoubleQuote('\n'));
52 EXPECT_TRUE(IsInvalidHeaderKeyCharAllowDoubleQuote('}'));
53
54 EXPECT_FALSE(IsInvalidHeaderKeyCharAllowDoubleQuote('"'));
55 EXPECT_FALSE(IsInvalidHeaderKeyCharAllowDoubleQuote('a'));
56 EXPECT_FALSE(IsInvalidHeaderKeyCharAllowDoubleQuote('B'));
57 EXPECT_FALSE(IsInvalidHeaderKeyCharAllowDoubleQuote('7'));
58 EXPECT_FALSE(IsInvalidHeaderKeyCharAllowDoubleQuote(0x42));
59 EXPECT_FALSE(IsInvalidHeaderKeyCharAllowDoubleQuote(0x7C));
60 EXPECT_FALSE(IsInvalidHeaderKeyCharAllowDoubleQuote(0x7E));
61 }
62
TEST(HeaderPropertiesTest,IsInvalidHeaderChar)63 TEST(HeaderPropertiesTest, IsInvalidHeaderChar) {
64 EXPECT_TRUE(IsInvalidHeaderChar(0x00));
65 EXPECT_TRUE(IsInvalidHeaderChar(0x06));
66 EXPECT_TRUE(IsInvalidHeaderChar(0x1F));
67 EXPECT_TRUE(IsInvalidHeaderChar(0x7F));
68
69 EXPECT_FALSE(IsInvalidHeaderChar(0x09));
70 EXPECT_FALSE(IsInvalidHeaderChar(' '));
71 EXPECT_FALSE(IsInvalidHeaderChar('\t'));
72 EXPECT_FALSE(IsInvalidHeaderChar('\r'));
73 EXPECT_FALSE(IsInvalidHeaderChar('\n'));
74 EXPECT_FALSE(IsInvalidHeaderChar('a'));
75 EXPECT_FALSE(IsInvalidHeaderChar('B'));
76 EXPECT_FALSE(IsInvalidHeaderChar('7'));
77 EXPECT_FALSE(IsInvalidHeaderChar(0x42));
78 EXPECT_FALSE(IsInvalidHeaderChar(0x7D));
79 }
80
TEST(HeaderPropertiesTest,KeyMoreRestrictiveThanValue)81 TEST(HeaderPropertiesTest, KeyMoreRestrictiveThanValue) {
82 for (int c = 0; c < 255; ++c) {
83 if (IsInvalidHeaderChar(c)) {
84 EXPECT_TRUE(IsInvalidHeaderKeyChar(c)) << c;
85 }
86 }
87 }
88
TEST(HeaderPropertiesTest,HasInvalidHeaderChars)89 TEST(HeaderPropertiesTest, HasInvalidHeaderChars) {
90 const char with_null[] = "Here's l\x00king at you, kid";
91 EXPECT_TRUE(HasInvalidHeaderChars(std::string(with_null, sizeof(with_null))));
92 EXPECT_TRUE(HasInvalidHeaderChars("Why's \x06 afraid of \x07? \x07\x08\x09"));
93 EXPECT_TRUE(HasInvalidHeaderChars("\x1Flower power"));
94 EXPECT_TRUE(HasInvalidHeaderChars("\x7Flowers more powers"));
95
96 EXPECT_FALSE(HasInvalidHeaderChars("Plenty of space"));
97 EXPECT_FALSE(HasInvalidHeaderChars("Keeping \tabs"));
98 EXPECT_FALSE(HasInvalidHeaderChars("Al\right"));
99 EXPECT_FALSE(HasInvalidHeaderChars("\new day"));
100 EXPECT_FALSE(HasInvalidHeaderChars("\x42 is a nice character"));
101 }
102
103 } // namespace
104 } // namespace quiche::header_properties::test
105