OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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 "net/cookies/canonical_cookie.h" | 5 #include "net/cookies/canonical_cookie.h" |
6 | 6 |
7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
8 #include "net/cookies/cookie_constants.h" | 8 #include "net/cookies/cookie_constants.h" |
9 #include "net/cookies/cookie_options.h" | 9 #include "net/cookies/cookie_options.h" |
10 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
(...skipping 21 matching lines...) Expand all Loading... |
32 EXPECT_EQ("http://example.com/", CanonicalCookie::GetCookieSourceFromURL( | 32 EXPECT_EQ("http://example.com/", CanonicalCookie::GetCookieSourceFromURL( |
33 GURL("http://example.com/test#foo"))); | 33 GURL("http://example.com/test#foo"))); |
34 } | 34 } |
35 | 35 |
36 TEST(CanonicalCookieTest, Constructor) { | 36 TEST(CanonicalCookieTest, Constructor) { |
37 GURL url("http://www.example.com/test"); | 37 GURL url("http://www.example.com/test"); |
38 base::Time current_time = base::Time::Now(); | 38 base::Time current_time = base::Time::Now(); |
39 | 39 |
40 CanonicalCookie cookie(url, "A", "2", "www.example.com", "/test", | 40 CanonicalCookie cookie(url, "A", "2", "www.example.com", "/test", |
41 current_time, base::Time(), current_time, false, false, | 41 current_time, base::Time(), current_time, false, false, |
42 COOKIE_PRIORITY_DEFAULT); | 42 false, COOKIE_PRIORITY_DEFAULT); |
43 EXPECT_EQ(url.GetOrigin().spec(), cookie.Source()); | 43 EXPECT_EQ(url.GetOrigin().spec(), cookie.Source()); |
44 EXPECT_EQ("A", cookie.Name()); | 44 EXPECT_EQ("A", cookie.Name()); |
45 EXPECT_EQ("2", cookie.Value()); | 45 EXPECT_EQ("2", cookie.Value()); |
46 EXPECT_EQ("www.example.com", cookie.Domain()); | 46 EXPECT_EQ("www.example.com", cookie.Domain()); |
47 EXPECT_EQ("/test", cookie.Path()); | 47 EXPECT_EQ("/test", cookie.Path()); |
48 EXPECT_FALSE(cookie.IsSecure()); | 48 EXPECT_FALSE(cookie.IsSecure()); |
| 49 EXPECT_FALSE(cookie.IsHttpOnly()); |
| 50 EXPECT_FALSE(cookie.IsFirstPartyOnly()); |
49 | 51 |
50 CanonicalCookie cookie2(url, "A", "2", std::string(), std::string(), | 52 CanonicalCookie cookie2(url, "A", "2", std::string(), std::string(), |
51 current_time, base::Time(), current_time, false, | 53 current_time, base::Time(), current_time, false, |
52 false, COOKIE_PRIORITY_DEFAULT); | 54 false, false, COOKIE_PRIORITY_DEFAULT); |
53 EXPECT_EQ(url.GetOrigin().spec(), cookie.Source()); | 55 EXPECT_EQ(url.GetOrigin().spec(), cookie.Source()); |
54 EXPECT_EQ("A", cookie2.Name()); | 56 EXPECT_EQ("A", cookie2.Name()); |
55 EXPECT_EQ("2", cookie2.Value()); | 57 EXPECT_EQ("2", cookie2.Value()); |
56 EXPECT_EQ("", cookie2.Domain()); | 58 EXPECT_EQ("", cookie2.Domain()); |
57 EXPECT_EQ("", cookie2.Path()); | 59 EXPECT_EQ("", cookie2.Path()); |
58 EXPECT_FALSE(cookie2.IsSecure()); | 60 EXPECT_FALSE(cookie2.IsSecure()); |
| 61 EXPECT_FALSE(cookie2.IsHttpOnly()); |
| 62 EXPECT_FALSE(cookie2.IsFirstPartyOnly()); |
59 } | 63 } |
60 | 64 |
61 TEST(CanonicalCookieTest, Create) { | 65 TEST(CanonicalCookieTest, Create) { |
62 // Test creating cookies from a cookie string. | 66 // Test creating cookies from a cookie string. |
63 GURL url("http://www.example.com/test/foo.html"); | 67 GURL url("http://www.example.com/test/foo.html"); |
64 base::Time creation_time = base::Time::Now(); | 68 base::Time creation_time = base::Time::Now(); |
65 CookieOptions options; | 69 CookieOptions options; |
66 | 70 |
67 scoped_ptr<CanonicalCookie> cookie( | 71 scoped_ptr<CanonicalCookie> cookie( |
68 CanonicalCookie::Create(url, "A=2", creation_time, options)); | 72 CanonicalCookie::Create(url, "A=2", creation_time, options)); |
(...skipping 23 matching lines...) Expand all Loading... |
92 // Test creating http only cookies. | 96 // Test creating http only cookies. |
93 cookie.reset( | 97 cookie.reset( |
94 CanonicalCookie::Create(url, "A=2; HttpOnly", creation_time, options)); | 98 CanonicalCookie::Create(url, "A=2; HttpOnly", creation_time, options)); |
95 EXPECT_FALSE(cookie.get()); | 99 EXPECT_FALSE(cookie.get()); |
96 CookieOptions httponly_options; | 100 CookieOptions httponly_options; |
97 httponly_options.set_include_httponly(); | 101 httponly_options.set_include_httponly(); |
98 cookie.reset(CanonicalCookie::Create(url, "A=2; HttpOnly", creation_time, | 102 cookie.reset(CanonicalCookie::Create(url, "A=2; HttpOnly", creation_time, |
99 httponly_options)); | 103 httponly_options)); |
100 EXPECT_TRUE(cookie->IsHttpOnly()); | 104 EXPECT_TRUE(cookie->IsHttpOnly()); |
101 | 105 |
| 106 // Test creating http only cookies. |
| 107 CookieOptions first_party_options; |
| 108 first_party_options.set_first_party_url(url); |
| 109 cookie.reset(CanonicalCookie::Create(url, "A=2; First-Party-Only", |
| 110 creation_time, httponly_options)); |
| 111 EXPECT_TRUE(cookie.get()); |
| 112 EXPECT_TRUE(cookie->IsFirstPartyOnly()); |
| 113 |
102 // Test the creating cookies using specific parameter instead of a cookie | 114 // Test the creating cookies using specific parameter instead of a cookie |
103 // string. | 115 // string. |
104 cookie.reset(CanonicalCookie::Create(url, "A", "2", "www.example.com", | 116 cookie.reset(CanonicalCookie::Create( |
105 "/test", creation_time, base::Time(), | 117 url, "A", "2", "www.example.com", "/test", creation_time, base::Time(), |
106 false, false, COOKIE_PRIORITY_DEFAULT)); | 118 false, false, false, COOKIE_PRIORITY_DEFAULT)); |
107 EXPECT_EQ(url.GetOrigin().spec(), cookie->Source()); | 119 EXPECT_EQ(url.GetOrigin().spec(), cookie->Source()); |
108 EXPECT_EQ("A", cookie->Name()); | 120 EXPECT_EQ("A", cookie->Name()); |
109 EXPECT_EQ("2", cookie->Value()); | 121 EXPECT_EQ("2", cookie->Value()); |
110 EXPECT_EQ(".www.example.com", cookie->Domain()); | 122 EXPECT_EQ(".www.example.com", cookie->Domain()); |
111 EXPECT_EQ("/test", cookie->Path()); | 123 EXPECT_EQ("/test", cookie->Path()); |
112 EXPECT_FALSE(cookie->IsSecure()); | 124 EXPECT_FALSE(cookie->IsSecure()); |
| 125 EXPECT_FALSE(cookie->IsHttpOnly()); |
| 126 EXPECT_FALSE(cookie->IsFirstPartyOnly()); |
113 | 127 |
114 cookie.reset(CanonicalCookie::Create(url, "A", "2", ".www.example.com", | 128 cookie.reset(CanonicalCookie::Create( |
115 "/test", creation_time, base::Time(), | 129 url, "A", "2", ".www.example.com", "/test", creation_time, base::Time(), |
116 false, false, COOKIE_PRIORITY_DEFAULT)); | 130 false, false, false, COOKIE_PRIORITY_DEFAULT)); |
117 EXPECT_EQ(url.GetOrigin().spec(), cookie->Source()); | 131 EXPECT_EQ(url.GetOrigin().spec(), cookie->Source()); |
118 EXPECT_EQ("A", cookie->Name()); | 132 EXPECT_EQ("A", cookie->Name()); |
119 EXPECT_EQ("2", cookie->Value()); | 133 EXPECT_EQ("2", cookie->Value()); |
120 EXPECT_EQ(".www.example.com", cookie->Domain()); | 134 EXPECT_EQ(".www.example.com", cookie->Domain()); |
121 EXPECT_EQ("/test", cookie->Path()); | 135 EXPECT_EQ("/test", cookie->Path()); |
122 EXPECT_FALSE(cookie->IsSecure()); | 136 EXPECT_FALSE(cookie->IsSecure()); |
| 137 EXPECT_FALSE(cookie->IsHttpOnly()); |
| 138 EXPECT_FALSE(cookie->IsFirstPartyOnly()); |
123 } | 139 } |
124 | 140 |
125 TEST(CanonicalCookieTest, EmptyExpiry) { | 141 TEST(CanonicalCookieTest, EmptyExpiry) { |
126 GURL url("http://www7.ipdl.inpit.go.jp/Tokujitu/tjkta.ipdl?N0000=108"); | 142 GURL url("http://www7.ipdl.inpit.go.jp/Tokujitu/tjkta.ipdl?N0000=108"); |
127 base::Time creation_time = base::Time::Now(); | 143 base::Time creation_time = base::Time::Now(); |
128 CookieOptions options; | 144 CookieOptions options; |
129 | 145 |
130 std::string cookie_line = | 146 std::string cookie_line = |
131 "ACSTM=20130308043820420042; path=/; domain=ipdl.inpit.go.jp; Expires="; | 147 "ACSTM=20130308043820420042; path=/; domain=ipdl.inpit.go.jp; Expires="; |
132 scoped_ptr<CanonicalCookie> cookie( | 148 scoped_ptr<CanonicalCookie> cookie( |
(...skipping 26 matching lines...) Expand all Loading... |
159 GURL url("http://www.example.com/"); | 175 GURL url("http://www.example.com/"); |
160 std::string cookie_name = "A"; | 176 std::string cookie_name = "A"; |
161 std::string cookie_value = "2EDA-EF"; | 177 std::string cookie_value = "2EDA-EF"; |
162 std::string cookie_domain = ".www.example.com"; | 178 std::string cookie_domain = ".www.example.com"; |
163 std::string cookie_path = "/"; | 179 std::string cookie_path = "/"; |
164 base::Time creation_time = base::Time::Now(); | 180 base::Time creation_time = base::Time::Now(); |
165 base::Time last_access_time = creation_time; | 181 base::Time last_access_time = creation_time; |
166 base::Time expiration_time = creation_time + base::TimeDelta::FromDays(2); | 182 base::Time expiration_time = creation_time + base::TimeDelta::FromDays(2); |
167 bool secure(false); | 183 bool secure(false); |
168 bool httponly(false); | 184 bool httponly(false); |
| 185 bool firstparty(false); |
169 | 186 |
170 // Test that a cookie is equivalent to itself. | 187 // Test that a cookie is equivalent to itself. |
171 scoped_ptr<CanonicalCookie> cookie(new CanonicalCookie( | 188 scoped_ptr<CanonicalCookie> cookie(new CanonicalCookie( |
172 url, cookie_name, cookie_value, cookie_domain, cookie_path, creation_time, | 189 url, cookie_name, cookie_value, cookie_domain, cookie_path, creation_time, |
173 expiration_time, last_access_time, secure, httponly, | 190 expiration_time, last_access_time, secure, httponly, firstparty, |
174 COOKIE_PRIORITY_MEDIUM)); | 191 COOKIE_PRIORITY_MEDIUM)); |
175 EXPECT_TRUE(cookie->IsEquivalent(*cookie)); | 192 EXPECT_TRUE(cookie->IsEquivalent(*cookie)); |
176 | 193 |
177 // Test that two identical cookies are equivalent. | 194 // Test that two identical cookies are equivalent. |
178 scoped_ptr<CanonicalCookie> other_cookie(new CanonicalCookie( | 195 scoped_ptr<CanonicalCookie> other_cookie(new CanonicalCookie( |
179 url, cookie_name, cookie_value, cookie_domain, cookie_path, creation_time, | 196 url, cookie_name, cookie_value, cookie_domain, cookie_path, creation_time, |
180 expiration_time, last_access_time, secure, httponly, | 197 expiration_time, last_access_time, secure, httponly, firstparty, |
181 COOKIE_PRIORITY_MEDIUM)); | 198 COOKIE_PRIORITY_MEDIUM)); |
182 EXPECT_TRUE(cookie->IsEquivalent(*other_cookie)); | 199 EXPECT_TRUE(cookie->IsEquivalent(*other_cookie)); |
183 | 200 |
184 // Tests that use different variations of attribute values that | 201 // Tests that use different variations of attribute values that |
185 // DON'T affect cookie equivalence. | 202 // DON'T affect cookie equivalence. |
186 other_cookie.reset( | 203 other_cookie.reset( |
187 new CanonicalCookie(url, cookie_name, "2", cookie_domain, cookie_path, | 204 new CanonicalCookie(url, cookie_name, "2", cookie_domain, cookie_path, |
188 creation_time, expiration_time, last_access_time, | 205 creation_time, expiration_time, last_access_time, |
189 secure, httponly, COOKIE_PRIORITY_HIGH)); | 206 secure, httponly, firstparty, COOKIE_PRIORITY_HIGH)); |
190 EXPECT_TRUE(cookie->IsEquivalent(*other_cookie)); | 207 EXPECT_TRUE(cookie->IsEquivalent(*other_cookie)); |
191 | 208 |
192 base::Time other_creation_time = | 209 base::Time other_creation_time = |
193 creation_time + base::TimeDelta::FromMinutes(2); | 210 creation_time + base::TimeDelta::FromMinutes(2); |
194 other_cookie.reset(new CanonicalCookie( | 211 other_cookie.reset(new CanonicalCookie( |
195 url, cookie_name, "2", cookie_domain, cookie_path, other_creation_time, | 212 url, cookie_name, "2", cookie_domain, cookie_path, other_creation_time, |
196 expiration_time, last_access_time, secure, httponly, | 213 expiration_time, last_access_time, secure, httponly, firstparty, |
197 COOKIE_PRIORITY_MEDIUM)); | 214 COOKIE_PRIORITY_MEDIUM)); |
198 EXPECT_TRUE(cookie->IsEquivalent(*other_cookie)); | 215 EXPECT_TRUE(cookie->IsEquivalent(*other_cookie)); |
199 | 216 |
200 other_cookie.reset(new CanonicalCookie( | 217 other_cookie.reset(new CanonicalCookie( |
201 url, cookie_name, cookie_name, cookie_domain, cookie_path, creation_time, | 218 url, cookie_name, cookie_name, cookie_domain, cookie_path, creation_time, |
202 expiration_time, last_access_time, true, httponly, COOKIE_PRIORITY_LOW)); | 219 expiration_time, last_access_time, true, httponly, firstparty, |
| 220 COOKIE_PRIORITY_LOW)); |
| 221 EXPECT_TRUE(cookie->IsEquivalent(*other_cookie)); |
| 222 |
| 223 other_cookie.reset(new CanonicalCookie( |
| 224 url, cookie_name, cookie_name, cookie_domain, cookie_path, creation_time, |
| 225 expiration_time, last_access_time, secure, true, firstparty, |
| 226 COOKIE_PRIORITY_LOW)); |
| 227 EXPECT_TRUE(cookie->IsEquivalent(*other_cookie)); |
| 228 |
| 229 other_cookie.reset(new CanonicalCookie( |
| 230 url, cookie_name, cookie_name, cookie_domain, cookie_path, creation_time, |
| 231 expiration_time, last_access_time, secure, httponly, true, |
| 232 COOKIE_PRIORITY_LOW)); |
203 EXPECT_TRUE(cookie->IsEquivalent(*other_cookie)); | 233 EXPECT_TRUE(cookie->IsEquivalent(*other_cookie)); |
204 | 234 |
205 // Tests that use different variations of attribute values that | 235 // Tests that use different variations of attribute values that |
206 // DO affect cookie equivalence. | 236 // DO affect cookie equivalence. |
207 other_cookie.reset( | 237 other_cookie.reset(new CanonicalCookie( |
208 new CanonicalCookie(url, "B", cookie_value, cookie_domain, cookie_path, | 238 url, "B", cookie_value, cookie_domain, cookie_path, creation_time, |
209 creation_time, expiration_time, last_access_time, | 239 expiration_time, last_access_time, secure, httponly, firstparty, |
210 secure, httponly, COOKIE_PRIORITY_MEDIUM)); | 240 COOKIE_PRIORITY_MEDIUM)); |
211 EXPECT_FALSE(cookie->IsEquivalent(*other_cookie)); | 241 EXPECT_FALSE(cookie->IsEquivalent(*other_cookie)); |
212 | 242 |
213 other_cookie.reset(new CanonicalCookie( | 243 other_cookie.reset(new CanonicalCookie( |
214 url, cookie_name, cookie_value, "www.example.com", cookie_path, | 244 url, cookie_name, cookie_value, "www.example.com", cookie_path, |
215 creation_time, expiration_time, last_access_time, secure, httponly, | 245 creation_time, expiration_time, last_access_time, secure, httponly, |
216 COOKIE_PRIORITY_MEDIUM)); | 246 firstparty, COOKIE_PRIORITY_MEDIUM)); |
217 EXPECT_TRUE(cookie->IsDomainCookie()); | 247 EXPECT_TRUE(cookie->IsDomainCookie()); |
218 EXPECT_FALSE(other_cookie->IsDomainCookie()); | 248 EXPECT_FALSE(other_cookie->IsDomainCookie()); |
219 EXPECT_FALSE(cookie->IsEquivalent(*other_cookie)); | 249 EXPECT_FALSE(cookie->IsEquivalent(*other_cookie)); |
220 | 250 |
221 other_cookie.reset(new CanonicalCookie( | 251 other_cookie.reset(new CanonicalCookie( |
222 url, cookie_name, cookie_value, ".example.com", cookie_path, | 252 url, cookie_name, cookie_value, ".example.com", cookie_path, |
223 creation_time, expiration_time, last_access_time, secure, httponly, | 253 creation_time, expiration_time, last_access_time, secure, httponly, |
224 COOKIE_PRIORITY_MEDIUM)); | 254 firstparty, COOKIE_PRIORITY_MEDIUM)); |
225 EXPECT_FALSE(cookie->IsEquivalent(*other_cookie)); | 255 EXPECT_FALSE(cookie->IsEquivalent(*other_cookie)); |
226 | 256 |
227 other_cookie.reset(new CanonicalCookie( | 257 other_cookie.reset(new CanonicalCookie( |
228 url, cookie_name, cookie_value, cookie_domain, "/test/0", creation_time, | 258 url, cookie_name, cookie_value, cookie_domain, "/test/0", creation_time, |
229 expiration_time, last_access_time, secure, httponly, | 259 expiration_time, last_access_time, secure, httponly, firstparty, |
230 COOKIE_PRIORITY_MEDIUM)); | 260 COOKIE_PRIORITY_MEDIUM)); |
231 EXPECT_FALSE(cookie->IsEquivalent(*other_cookie)); | 261 EXPECT_FALSE(cookie->IsEquivalent(*other_cookie)); |
232 } | 262 } |
233 | 263 |
234 TEST(CanonicalCookieTest, IsDomainMatch) { | 264 TEST(CanonicalCookieTest, IsDomainMatch) { |
235 GURL url("http://www.example.com/test/foo.html"); | 265 GURL url("http://www.example.com/test/foo.html"); |
236 base::Time creation_time = base::Time::Now(); | 266 base::Time creation_time = base::Time::Now(); |
237 CookieOptions options; | 267 CookieOptions options; |
238 | 268 |
239 scoped_ptr<CanonicalCookie> cookie( | 269 scoped_ptr<CanonicalCookie> cookie( |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
322 // is set on the cookie options. | 352 // is set on the cookie options. |
323 options.set_include_httponly(); | 353 options.set_include_httponly(); |
324 cookie.reset( | 354 cookie.reset( |
325 CanonicalCookie::Create(url, "A=2; HttpOnly", creation_time, options)); | 355 CanonicalCookie::Create(url, "A=2; HttpOnly", creation_time, options)); |
326 EXPECT_TRUE(cookie->IsHttpOnly()); | 356 EXPECT_TRUE(cookie->IsHttpOnly()); |
327 EXPECT_TRUE(cookie->IncludeForRequestURL(url, options)); | 357 EXPECT_TRUE(cookie->IncludeForRequestURL(url, options)); |
328 options.set_exclude_httponly(); | 358 options.set_exclude_httponly(); |
329 EXPECT_FALSE(cookie->IncludeForRequestURL(url, options)); | 359 EXPECT_FALSE(cookie->IncludeForRequestURL(url, options)); |
330 } | 360 } |
331 | 361 |
| 362 TEST(CanonicalCookieTest, IncludeFirstPartyForFirstPartyURL) { |
| 363 GURL insecure_url("http://example.test"); |
| 364 GURL secure_url("https://example.test"); |
| 365 GURL secure_url_with_path("https://example.test/foo/bar/index.html"); |
| 366 GURL third_party_url("https://not-example.test"); |
| 367 base::Time creation_time = base::Time::Now(); |
| 368 CookieOptions options; |
| 369 scoped_ptr<CanonicalCookie> cookie; |
| 370 |
| 371 // First-party-only cookies are not inlcuded if a top-level URL is unset. |
| 372 cookie.reset(CanonicalCookie::Create(secure_url, "A=2; First-Party-Only", |
| 373 creation_time, options)); |
| 374 EXPECT_TRUE(cookie->IsFirstPartyOnly()); |
| 375 options.set_first_party_url(GURL()); |
| 376 EXPECT_FALSE(cookie->IncludeForRequestURL(secure_url, options)); |
| 377 |
| 378 // First-party-only cookies are included only if the cookie's origin matches |
| 379 // the |
| 380 // first-party origin. |
| 381 options.set_first_party_url(secure_url); |
| 382 EXPECT_TRUE(cookie->IncludeForRequestURL(secure_url, options)); |
| 383 options.set_first_party_url(insecure_url); |
| 384 EXPECT_FALSE(cookie->IncludeForRequestURL(secure_url, options)); |
| 385 options.set_first_party_url(third_party_url); |
| 386 EXPECT_FALSE(cookie->IncludeForRequestURL(secure_url, options)); |
| 387 |
| 388 // "First-Party-Only" doesn't override the 'secure' flag. |
| 389 cookie.reset(CanonicalCookie::Create( |
| 390 secure_url, "A=2; Secure; First-Party-Only", creation_time, options)); |
| 391 options.set_first_party_url(secure_url); |
| 392 EXPECT_TRUE(cookie->IncludeForRequestURL(secure_url, options)); |
| 393 EXPECT_FALSE(cookie->IncludeForRequestURL(insecure_url, options)); |
| 394 options.set_first_party_url(insecure_url); |
| 395 EXPECT_FALSE(cookie->IncludeForRequestURL(secure_url, options)); |
| 396 EXPECT_FALSE(cookie->IncludeForRequestURL(insecure_url, options)); |
| 397 |
| 398 // "First-Party-Only" doesn't override the 'path' flag. |
| 399 cookie.reset(CanonicalCookie::Create(secure_url_with_path, |
| 400 "A=2; First-Party-Only; path=/foo/bar", |
| 401 creation_time, options)); |
| 402 options.set_first_party_url(secure_url_with_path); |
| 403 EXPECT_TRUE(cookie->IncludeForRequestURL(secure_url_with_path, options)); |
| 404 EXPECT_FALSE(cookie->IncludeForRequestURL(secure_url, options)); |
| 405 options.set_first_party_url(secure_url); |
| 406 EXPECT_TRUE(cookie->IncludeForRequestURL(secure_url_with_path, options)); |
| 407 EXPECT_FALSE(cookie->IncludeForRequestURL(secure_url, options)); |
| 408 } |
| 409 |
332 } // namespace net | 410 } // namespace net |
OLD | NEW |