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