OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 <algorithm> | 5 #include <algorithm> |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/pickle.h" | 8 #include "base/pickle.h" |
9 #include "base/time.h" | 9 #include "base/time.h" |
10 #include "net/http/http_response_headers.h" | 10 #include "net/http/http_response_headers.h" |
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
283 HeadersToRaw(&headers); | 283 HeadersToRaw(&headers); |
284 scoped_refptr<HttpResponseHeaders> parsed = new HttpResponseHeaders(headers); | 284 scoped_refptr<HttpResponseHeaders> parsed = new HttpResponseHeaders(headers); |
285 | 285 |
286 std::string value; | 286 std::string value; |
287 EXPECT_TRUE(parsed->GetNormalizedHeader("cache-control", &value)); | 287 EXPECT_TRUE(parsed->GetNormalizedHeader("cache-control", &value)); |
288 EXPECT_EQ("private, no-store", value); | 288 EXPECT_EQ("private, no-store", value); |
289 } | 289 } |
290 | 290 |
291 TEST(HttpResponseHeadersTest, Persist) { | 291 TEST(HttpResponseHeadersTest, Persist) { |
292 const struct { | 292 const struct { |
| 293 net::HttpResponseHeaders::PersistOptions options; |
293 const char* raw_headers; | 294 const char* raw_headers; |
294 const char* expected_headers; | 295 const char* expected_headers; |
295 } tests[] = { | 296 } tests[] = { |
296 { "HTTP/1.1 200 OK\n" | 297 { net::HttpResponseHeaders::PERSIST_ALL, |
| 298 "HTTP/1.1 200 OK\n" |
297 "Cache-control:private\n" | 299 "Cache-control:private\n" |
298 "cache-Control:no-store\n", | 300 "cache-Control:no-store\n", |
299 | 301 |
300 "HTTP/1.1 200 OK\n" | 302 "HTTP/1.1 200 OK\n" |
301 "Cache-control: private, no-store\n" | 303 "Cache-control: private, no-store\n" |
302 }, | 304 }, |
303 { "HTTP/1.1 200 OK\n" | 305 { net::HttpResponseHeaders::PERSIST_SANS_HOP_BY_HOP, |
| 306 "HTTP/1.1 200 OK\n" |
304 "connection: keep-alive\n" | 307 "connection: keep-alive\n" |
305 "server: blah\n", | 308 "server: blah\n", |
306 | 309 |
307 "HTTP/1.1 200 OK\n" | 310 "HTTP/1.1 200 OK\n" |
308 "server: blah\n" | 311 "server: blah\n" |
309 }, | 312 }, |
310 { "HTTP/1.1 200 OK\n" | 313 { net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE | |
| 314 net::HttpResponseHeaders::PERSIST_SANS_HOP_BY_HOP, |
| 315 "HTTP/1.1 200 OK\n" |
311 "fOo: 1\n" | 316 "fOo: 1\n" |
312 "Foo: 2\n" | 317 "Foo: 2\n" |
313 "Transfer-Encoding: chunked\n" | 318 "Transfer-Encoding: chunked\n" |
314 "CoNnection: keep-alive\n" | 319 "CoNnection: keep-alive\n" |
315 "cache-control: private, no-cache=\"foo\"\n", | 320 "cache-control: private, no-cache=\"foo\"\n", |
316 | 321 |
317 "HTTP/1.1 200 OK\n" | 322 "HTTP/1.1 200 OK\n" |
318 "cache-control: private, no-cache=\"foo\"\n" | 323 "cache-control: private, no-cache=\"foo\"\n" |
319 }, | 324 }, |
320 { "HTTP/1.1 200 OK\n" | 325 { net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE, |
| 326 "HTTP/1.1 200 OK\n" |
321 "Foo: 2\n" | 327 "Foo: 2\n" |
322 "Cache-Control: private,no-cache=\"foo, bar\"\n" | 328 "Cache-Control: private,no-cache=\"foo, bar\"\n" |
323 "bar", | 329 "bar", |
324 | 330 |
325 "HTTP/1.1 200 OK\n" | 331 "HTTP/1.1 200 OK\n" |
326 "Cache-Control: private,no-cache=\"foo, bar\"\n" | 332 "Cache-Control: private,no-cache=\"foo, bar\"\n" |
327 }, | 333 }, |
328 // ignore bogus no-cache value | 334 // ignore bogus no-cache value |
329 { "HTTP/1.1 200 OK\n" | 335 { net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE, |
| 336 "HTTP/1.1 200 OK\n" |
330 "Foo: 2\n" | 337 "Foo: 2\n" |
331 "Cache-Control: private,no-cache=foo\n", | 338 "Cache-Control: private,no-cache=foo\n", |
332 | 339 |
333 "HTTP/1.1 200 OK\n" | 340 "HTTP/1.1 200 OK\n" |
334 "Foo: 2\n" | 341 "Foo: 2\n" |
335 "Cache-Control: private,no-cache=foo\n" | 342 "Cache-Control: private,no-cache=foo\n" |
336 }, | 343 }, |
337 // ignore bogus no-cache value | 344 // ignore bogus no-cache value |
338 { "HTTP/1.1 200 OK\n" | 345 { net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE, |
| 346 "HTTP/1.1 200 OK\n" |
339 "Foo: 2\n" | 347 "Foo: 2\n" |
340 "Cache-Control: private, no-cache=\n", | 348 "Cache-Control: private, no-cache=\n", |
341 | 349 |
342 "HTTP/1.1 200 OK\n" | 350 "HTTP/1.1 200 OK\n" |
343 "Foo: 2\n" | 351 "Foo: 2\n" |
344 "Cache-Control: private, no-cache=\n" | 352 "Cache-Control: private, no-cache=\n" |
345 }, | 353 }, |
346 // ignore empty no-cache value | 354 // ignore empty no-cache value |
347 { "HTTP/1.1 200 OK\n" | 355 { net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE, |
| 356 "HTTP/1.1 200 OK\n" |
348 "Foo: 2\n" | 357 "Foo: 2\n" |
349 "Cache-Control: private, no-cache=\"\"\n", | 358 "Cache-Control: private, no-cache=\"\"\n", |
350 | 359 |
351 "HTTP/1.1 200 OK\n" | 360 "HTTP/1.1 200 OK\n" |
352 "Foo: 2\n" | 361 "Foo: 2\n" |
353 "Cache-Control: private, no-cache=\"\"\n" | 362 "Cache-Control: private, no-cache=\"\"\n" |
354 }, | 363 }, |
355 // ignore wrong quotes no-cache value | 364 // ignore wrong quotes no-cache value |
356 { "HTTP/1.1 200 OK\n" | 365 { net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE, |
| 366 "HTTP/1.1 200 OK\n" |
357 "Foo: 2\n" | 367 "Foo: 2\n" |
358 "Cache-Control: private, no-cache=\'foo\'\n", | 368 "Cache-Control: private, no-cache=\'foo\'\n", |
359 | 369 |
360 "HTTP/1.1 200 OK\n" | 370 "HTTP/1.1 200 OK\n" |
361 "Foo: 2\n" | 371 "Foo: 2\n" |
362 "Cache-Control: private, no-cache=\'foo\'\n" | 372 "Cache-Control: private, no-cache=\'foo\'\n" |
363 }, | 373 }, |
364 // ignore unterminated quotes no-cache value | 374 // ignore unterminated quotes no-cache value |
365 { "HTTP/1.1 200 OK\n" | 375 { net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE, |
| 376 "HTTP/1.1 200 OK\n" |
366 "Foo: 2\n" | 377 "Foo: 2\n" |
367 "Cache-Control: private, no-cache=\"foo\n", | 378 "Cache-Control: private, no-cache=\"foo\n", |
368 | 379 |
369 "HTTP/1.1 200 OK\n" | 380 "HTTP/1.1 200 OK\n" |
370 "Foo: 2\n" | 381 "Foo: 2\n" |
371 "Cache-Control: private, no-cache=\"foo\n" | 382 "Cache-Control: private, no-cache=\"foo\n" |
372 }, | 383 }, |
373 // accept sloppy LWS | 384 // accept sloppy LWS |
374 { "HTTP/1.1 200 OK\n" | 385 { net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE, |
| 386 "HTTP/1.1 200 OK\n" |
375 "Foo: 2\n" | 387 "Foo: 2\n" |
376 "Cache-Control: private, no-cache=\" foo\t, bar\"\n", | 388 "Cache-Control: private, no-cache=\" foo\t, bar\"\n", |
377 | 389 |
378 "HTTP/1.1 200 OK\n" | 390 "HTTP/1.1 200 OK\n" |
379 "Cache-Control: private, no-cache=\" foo\t, bar\"\n" | 391 "Cache-Control: private, no-cache=\" foo\t, bar\"\n" |
380 }, | 392 }, |
381 // header name appears twice, separated by another header | 393 // header name appears twice, separated by another header |
382 { "HTTP/1.1 200 OK\n" | 394 { net::HttpResponseHeaders::PERSIST_ALL, |
| 395 "HTTP/1.1 200 OK\n" |
383 "Foo: 1\n" | 396 "Foo: 1\n" |
384 "Bar: 2\n" | 397 "Bar: 2\n" |
385 "Foo: 3\n", | 398 "Foo: 3\n", |
386 | 399 |
387 "HTTP/1.1 200 OK\n" | 400 "HTTP/1.1 200 OK\n" |
388 "Foo: 1, 3\n" | 401 "Foo: 1, 3\n" |
389 "Bar: 2\n" | 402 "Bar: 2\n" |
390 }, | 403 }, |
391 // header name appears twice, separated by another header (type 2) | 404 // header name appears twice, separated by another header (type 2) |
392 { "HTTP/1.1 200 OK\n" | 405 { net::HttpResponseHeaders::PERSIST_ALL, |
| 406 "HTTP/1.1 200 OK\n" |
393 "Foo: 1, 3\n" | 407 "Foo: 1, 3\n" |
394 "Bar: 2\n" | 408 "Bar: 2\n" |
395 "Foo: 4\n", | 409 "Foo: 4\n", |
396 | 410 |
397 "HTTP/1.1 200 OK\n" | 411 "HTTP/1.1 200 OK\n" |
398 "Foo: 1, 3, 4\n" | 412 "Foo: 1, 3, 4\n" |
399 "Bar: 2\n" | 413 "Bar: 2\n" |
400 }, | 414 }, |
| 415 // Test filtering of cookie headers. |
| 416 { net::HttpResponseHeaders::PERSIST_SANS_COOKIES, |
| 417 "HTTP/1.1 200 OK\n" |
| 418 "Set-Cookie: foo=bar; httponly\n" |
| 419 "Set-Cookie: bar=foo\n" |
| 420 "Bar: 1\n" |
| 421 "Set-Cookie2: bar2=foo2\n", |
| 422 |
| 423 "HTTP/1.1 200 OK\n" |
| 424 "Bar: 1\n" |
| 425 }, |
401 }; | 426 }; |
402 | 427 |
403 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { | 428 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { |
404 std::string headers = tests[i].raw_headers; | 429 std::string headers = tests[i].raw_headers; |
405 HeadersToRaw(&headers); | 430 HeadersToRaw(&headers); |
406 scoped_refptr<HttpResponseHeaders> parsed1 = | 431 scoped_refptr<HttpResponseHeaders> parsed1 = |
407 new HttpResponseHeaders(headers); | 432 new HttpResponseHeaders(headers); |
408 | 433 |
409 Pickle pickle; | 434 Pickle pickle; |
410 parsed1->Persist(&pickle, true); | 435 parsed1->Persist(&pickle, tests[i].options); |
411 | 436 |
412 void* iter = NULL; | 437 void* iter = NULL; |
413 scoped_refptr<HttpResponseHeaders> parsed2 = | 438 scoped_refptr<HttpResponseHeaders> parsed2 = |
414 new HttpResponseHeaders(pickle, &iter); | 439 new HttpResponseHeaders(pickle, &iter); |
415 | 440 |
416 std::string h2; | 441 std::string h2; |
417 parsed2->GetNormalizedHeaders(&h2); | 442 parsed2->GetNormalizedHeaders(&h2); |
418 EXPECT_EQ(string(tests[i].expected_headers), h2); | 443 EXPECT_EQ(string(tests[i].expected_headers), h2); |
419 } | 444 } |
420 } | 445 } |
(...skipping 664 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1085 } | 1110 } |
1086 | 1111 |
1087 TEST(HttpResponseHeadersTest, GetStatusBadStatusLine) { | 1112 TEST(HttpResponseHeadersTest, GetStatusBadStatusLine) { |
1088 std::string headers("Foo bar."); | 1113 std::string headers("Foo bar."); |
1089 HeadersToRaw(&headers); | 1114 HeadersToRaw(&headers); |
1090 scoped_refptr<HttpResponseHeaders> parsed = new HttpResponseHeaders(headers); | 1115 scoped_refptr<HttpResponseHeaders> parsed = new HttpResponseHeaders(headers); |
1091 // The bad status line would have gotten rewritten as | 1116 // The bad status line would have gotten rewritten as |
1092 // HTTP/1.0 200 OK. | 1117 // HTTP/1.0 200 OK. |
1093 EXPECT_EQ(std::string("OK"), parsed->GetStatusText()); | 1118 EXPECT_EQ(std::string("OK"), parsed->GetStatusText()); |
1094 } | 1119 } |
OLD | NEW |