1 // Copyright 2006-2008 The Chromium Authors
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_vary_data.h"
6
7 #include <algorithm>
8
9 #include "net/http/http_request_info.h"
10 #include "net/http/http_response_headers.h"
11 #include "testing/gtest/include/gtest/gtest.h"
12
13 namespace net {
14
15 namespace {
16
17 typedef testing::Test HttpVaryDataTest;
18 using ExtraHeaders = std::vector<std::pair<std::string, std::string>>;
19
20 struct TestTransaction {
21 HttpRequestInfo request;
22 scoped_refptr<HttpResponseHeaders> response;
23
Initnet::__anon24b7d5d30111::TestTransaction24 void Init(const ExtraHeaders& request_headers,
25 const std::string& response_headers) {
26 std::string temp(response_headers);
27 std::replace(temp.begin(), temp.end(), '\n', '\0');
28 response = base::MakeRefCounted<HttpResponseHeaders>(temp);
29
30 request.extra_headers.Clear();
31 for (const auto& [key, value] : request_headers)
32 request.extra_headers.SetHeader(key, value);
33 }
34 };
35
36 } // namespace
37
TEST(HttpVaryDataTest,IsInvalid)38 TEST(HttpVaryDataTest, IsInvalid) {
39 // Only first of these result in an invalid vary data object.
40 const char* const kTestResponses[] = {
41 "HTTP/1.1 200 OK\n\n",
42 "HTTP/1.1 200 OK\nVary: *\n\n",
43 "HTTP/1.1 200 OK\nVary: cookie, *, bar\n\n",
44 "HTTP/1.1 200 OK\nVary: cookie\nFoo: 1\nVary: *\n\n",
45 };
46
47 const bool kExpectedValid[] = {false, true, true, true};
48
49 for (size_t i = 0; i < std::size(kTestResponses); ++i) {
50 TestTransaction t;
51 t.Init(/*request_headers=*/{}, kTestResponses[i]);
52
53 HttpVaryData v;
54 EXPECT_FALSE(v.is_valid());
55 EXPECT_EQ(kExpectedValid[i], v.Init(t.request, *t.response.get()));
56 EXPECT_EQ(kExpectedValid[i], v.is_valid());
57 }
58 }
59
TEST(HttpVaryDataTest,MultipleInit)60 TEST(HttpVaryDataTest, MultipleInit) {
61 HttpVaryData v;
62
63 // Init to something valid.
64 TestTransaction t1;
65 t1.Init({{"Foo", "1"}, {"bar", "23"}}, "HTTP/1.1 200 OK\nVary: foo, bar\n\n");
66 EXPECT_TRUE(v.Init(t1.request, *t1.response.get()));
67 EXPECT_TRUE(v.is_valid());
68
69 // Now overwrite by initializing to something invalid.
70 TestTransaction t2;
71 t2.Init({{"Foo", "1"}, {"bar", "23"}}, "HTTP/1.1 200 OK\n\n");
72 EXPECT_FALSE(v.Init(t2.request, *t2.response.get()));
73 EXPECT_FALSE(v.is_valid());
74 }
75
TEST(HttpVaryDataTest,DoesVary)76 TEST(HttpVaryDataTest, DoesVary) {
77 TestTransaction a;
78 a.Init({{"Foo", "1"}}, "HTTP/1.1 200 OK\nVary: foo\n\n");
79
80 TestTransaction b;
81 b.Init({{"Foo", "2"}}, "HTTP/1.1 200 OK\nVary: foo\n\n");
82
83 HttpVaryData v;
84 EXPECT_TRUE(v.Init(a.request, *a.response.get()));
85
86 EXPECT_FALSE(v.MatchesRequest(b.request, *b.response.get()));
87 }
88
TEST(HttpVaryDataTest,DoesVary2)89 TEST(HttpVaryDataTest, DoesVary2) {
90 TestTransaction a;
91 a.Init({{"Foo", "1"}, {"bar", "23"}}, "HTTP/1.1 200 OK\nVary: foo, bar\n\n");
92
93 TestTransaction b;
94 b.Init({{"Foo", "12"}, {"bar", "3"}}, "HTTP/1.1 200 OK\nVary: foo, bar\n\n");
95
96 HttpVaryData v;
97 EXPECT_TRUE(v.Init(a.request, *a.response.get()));
98
99 EXPECT_FALSE(v.MatchesRequest(b.request, *b.response.get()));
100 }
101
TEST(HttpVaryDataTest,DoesVaryStar)102 TEST(HttpVaryDataTest, DoesVaryStar) {
103 // Vary: * varies even when headers are identical
104 const ExtraHeaders kRequestHeaders = {{"Foo", "1"}};
105 const char kResponse[] = "HTTP/1.1 200 OK\nVary: *\n\n";
106
107 TestTransaction a;
108 a.Init(kRequestHeaders, kResponse);
109
110 TestTransaction b;
111 b.Init(kRequestHeaders, kResponse);
112
113 HttpVaryData v;
114 EXPECT_TRUE(v.Init(a.request, *a.response.get()));
115
116 EXPECT_FALSE(v.MatchesRequest(b.request, *b.response.get()));
117 }
118
TEST(HttpVaryDataTest,DoesntVary)119 TEST(HttpVaryDataTest, DoesntVary) {
120 TestTransaction a;
121 a.Init({{"Foo", "1"}}, "HTTP/1.1 200 OK\nVary: foo\n\n");
122
123 TestTransaction b;
124 b.Init({{"Foo", "1"}}, "HTTP/1.1 200 OK\nVary: foo\n\n");
125
126 HttpVaryData v;
127 EXPECT_TRUE(v.Init(a.request, *a.response.get()));
128
129 EXPECT_TRUE(v.MatchesRequest(b.request, *b.response.get()));
130 }
131
TEST(HttpVaryDataTest,DoesntVary2)132 TEST(HttpVaryDataTest, DoesntVary2) {
133 TestTransaction a;
134 a.Init({{"Foo", "1"}, {"bAr", "2"}}, "HTTP/1.1 200 OK\nVary: foo, bar\n\n");
135
136 TestTransaction b;
137 b.Init({{"Foo", "1"}, {"baR", "2"}},
138 "HTTP/1.1 200 OK\nVary: foo\nVary: bar\n\n");
139
140 HttpVaryData v;
141 EXPECT_TRUE(v.Init(a.request, *a.response.get()));
142
143 EXPECT_TRUE(v.MatchesRequest(b.request, *b.response.get()));
144 }
145
TEST(HttpVaryDataTest,DoesntVaryByCookieForRedirect)146 TEST(HttpVaryDataTest, DoesntVaryByCookieForRedirect) {
147 TestTransaction a;
148 a.Init({{"Cookie", "1"}}, "HTTP/1.1 301 Moved\nLocation: x\n\n");
149
150 HttpVaryData v;
151 EXPECT_FALSE(v.Init(a.request, *a.response.get()));
152 }
153
154 } // namespace net
155