1 // Copyright (c) 2012 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 "net/http/http_request_headers.h" 6 7 #include "base/memory/scoped_ptr.h" 8 #include "base/values.h" 9 #include "testing/gtest/include/gtest/gtest.h" 10 11 namespace net { 12 13 namespace { 14 15 TEST(HttpRequestHeaders, HasHeader) { 16 HttpRequestHeaders headers; 17 headers.SetHeader("Foo", "bar"); 18 EXPECT_TRUE(headers.HasHeader("foo")); 19 EXPECT_TRUE(headers.HasHeader("Foo")); 20 EXPECT_FALSE(headers.HasHeader("Fo")); 21 22 const HttpRequestHeaders& headers_ref = headers; 23 EXPECT_TRUE(headers_ref.HasHeader("foo")); 24 EXPECT_TRUE(headers_ref.HasHeader("Foo")); 25 EXPECT_FALSE(headers_ref.HasHeader("Fo")); 26 } 27 28 TEST(HttpRequestHeaders, SetHeader) { 29 HttpRequestHeaders headers; 30 headers.SetHeader("Foo", "bar"); 31 EXPECT_EQ("Foo: bar\r\n\r\n", headers.ToString()); 32 } 33 34 TEST(HttpRequestHeaders, SetMultipleHeaders) { 35 HttpRequestHeaders headers; 36 headers.SetHeader("Cookie-Monster", "Nom nom nom"); 37 headers.SetHeader("Domo-Kun", "Loves Chrome"); 38 EXPECT_EQ("Cookie-Monster: Nom nom nom\r\nDomo-Kun: Loves Chrome\r\n\r\n", 39 headers.ToString()); 40 } 41 42 TEST(HttpRequestHeaders, SetHeaderTwice) { 43 HttpRequestHeaders headers; 44 headers.SetHeader("Foo", "bar"); 45 headers.SetHeader("Foo", "bar"); 46 EXPECT_EQ("Foo: bar\r\n\r\n", headers.ToString()); 47 } 48 49 TEST(HttpRequestHeaders, SetHeaderTwiceCaseInsensitive) { 50 HttpRequestHeaders headers; 51 headers.SetHeader("Foo", "bar"); 52 headers.SetHeader("FoO", "Bar"); 53 EXPECT_EQ("Foo: Bar\r\n\r\n", headers.ToString()); 54 } 55 56 TEST(HttpRequestHeaders, SetHeaderTwiceSamePrefix) { 57 HttpRequestHeaders headers; 58 headers.SetHeader("FooBar", "smokes"); 59 headers.SetHeader("Foo", "crack"); 60 EXPECT_EQ("FooBar: smokes\r\nFoo: crack\r\n\r\n", headers.ToString()); 61 const HttpRequestHeaders& headers_ref = headers; 62 EXPECT_EQ("FooBar: smokes\r\nFoo: crack\r\n\r\n", headers_ref.ToString()); 63 } 64 65 TEST(HttpRequestHeaders, SetEmptyHeader) { 66 HttpRequestHeaders headers; 67 headers.SetHeader("Foo", "Bar"); 68 headers.SetHeader("Bar", ""); 69 EXPECT_EQ("Foo: Bar\r\nBar:\r\n\r\n", headers.ToString()); 70 } 71 72 TEST(HttpRequestHeaders, SetHeaderIfMissing) { 73 HttpRequestHeaders headers; 74 headers.SetHeaderIfMissing("Foo", "Bar"); 75 EXPECT_EQ("Foo: Bar\r\n\r\n", headers.ToString()); 76 headers.SetHeaderIfMissing("Foo", "Baz"); 77 EXPECT_EQ("Foo: Bar\r\n\r\n", headers.ToString()); 78 } 79 80 TEST(HttpRequestHeaders, RemoveHeader) { 81 HttpRequestHeaders headers; 82 headers.SetHeader("Foo", "bar"); 83 headers.RemoveHeader("Foo"); 84 EXPECT_EQ("\r\n", headers.ToString()); 85 } 86 87 TEST(HttpRequestHeaders, RemoveHeaderMissingHeader) { 88 HttpRequestHeaders headers; 89 headers.SetHeader("Foo", "bar"); 90 headers.RemoveHeader("Bar"); 91 EXPECT_EQ("Foo: bar\r\n\r\n", headers.ToString()); 92 } 93 94 TEST(HttpRequestHeaders, RemoveHeaderCaseInsensitive) { 95 HttpRequestHeaders headers; 96 headers.SetHeader("Foo", "bar"); 97 headers.SetHeader("All-Your-Base", "Belongs To Chrome"); 98 headers.RemoveHeader("foo"); 99 EXPECT_EQ("All-Your-Base: Belongs To Chrome\r\n\r\n", headers.ToString()); 100 } 101 102 TEST(HttpRequestHeaders, AddHeaderFromString) { 103 HttpRequestHeaders headers; 104 headers.AddHeaderFromString("Foo: bar"); 105 EXPECT_EQ("Foo: bar\r\n\r\n", headers.ToString()); 106 } 107 108 TEST(HttpRequestHeaders, AddHeaderFromStringNoLeadingWhitespace) { 109 HttpRequestHeaders headers; 110 headers.AddHeaderFromString("Foo:bar"); 111 EXPECT_EQ("Foo: bar\r\n\r\n", headers.ToString()); 112 } 113 114 TEST(HttpRequestHeaders, AddHeaderFromStringMoreLeadingWhitespace) { 115 HttpRequestHeaders headers; 116 headers.AddHeaderFromString("Foo: \t \t bar"); 117 EXPECT_EQ("Foo: bar\r\n\r\n", headers.ToString()); 118 } 119 120 TEST(HttpRequestHeaders, AddHeaderFromStringTrailingWhitespace) { 121 HttpRequestHeaders headers; 122 headers.AddHeaderFromString("Foo: bar \t \t "); 123 EXPECT_EQ("Foo: bar\r\n\r\n", headers.ToString()); 124 } 125 126 TEST(HttpRequestHeaders, AddHeaderFromStringLeadingTrailingWhitespace) { 127 HttpRequestHeaders headers; 128 headers.AddHeaderFromString("Foo: \t bar\t "); 129 EXPECT_EQ("Foo: bar\r\n\r\n", headers.ToString()); 130 } 131 132 TEST(HttpRequestHeaders, AddHeaderFromStringWithEmptyValue) { 133 HttpRequestHeaders headers; 134 headers.AddHeaderFromString("Foo:"); 135 EXPECT_EQ("Foo:\r\n\r\n", headers.ToString()); 136 } 137 138 TEST(HttpRequestHeaders, AddHeaderFromStringWithWhitespaceValue) { 139 HttpRequestHeaders headers; 140 headers.AddHeaderFromString("Foo: "); 141 EXPECT_EQ("Foo:\r\n\r\n", headers.ToString()); 142 } 143 144 TEST(HttpRequestHeaders, MergeFrom) { 145 HttpRequestHeaders headers; 146 headers.SetHeader("A", "A"); 147 headers.SetHeader("B", "B"); 148 149 HttpRequestHeaders headers2; 150 headers2.SetHeader("B", "b"); 151 headers2.SetHeader("C", "c"); 152 headers.MergeFrom(headers2); 153 EXPECT_EQ("A: A\r\nB: b\r\nC: c\r\n\r\n", headers.ToString()); 154 } 155 156 TEST(HttpRequestHeaders, CopyFrom) { 157 HttpRequestHeaders headers; 158 headers.SetHeader("A", "A"); 159 headers.SetHeader("B", "B"); 160 161 HttpRequestHeaders headers2; 162 headers2.SetHeader("B", "b"); 163 headers2.SetHeader("C", "c"); 164 headers.CopyFrom(headers2); 165 EXPECT_EQ("B: b\r\nC: c\r\n\r\n", headers.ToString()); 166 } 167 168 TEST(HttpRequestHeaders, ToNetLogParamAndBackAgain) { 169 HttpRequestHeaders headers; 170 headers.SetHeader("B", "b"); 171 headers.SetHeader("A", "a"); 172 std::string request_line("GET /stuff"); 173 174 scoped_ptr<base::Value> event_param( 175 headers.NetLogCallback(&request_line, NetLog::LOG_ALL_BUT_BYTES)); 176 HttpRequestHeaders headers2; 177 std::string request_line2; 178 179 ASSERT_TRUE(HttpRequestHeaders::FromNetLogParam(event_param.get(), 180 &headers2, 181 &request_line2)); 182 EXPECT_EQ(request_line, request_line2); 183 EXPECT_EQ("B: b\r\nA: a\r\n\r\n", headers2.ToString()); 184 } 185 186 } // namespace 187 188 } // namespace net 189