15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <limits>
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/pickle.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/http/http_byte_range.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_response_headers.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct TestData {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* raw_headers;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* expected_headers;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int expected_response_code;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::HttpVersion expected_parsed_version;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::HttpVersion expected_version;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpResponseHeadersTest : public testing::Test {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Transform "normal"-looking headers (\n-separated) to the appropriate
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// input format for ParseRawHeaders (\0-separated).
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HeadersToRaw(std::string* headers) {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::replace(headers->begin(), headers->end(), '\n', '\0');
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!headers->empty())
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *headers += '\0';
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class HttpResponseHeadersCacheControlTest : public HttpResponseHeadersTest {
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) protected:
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Make tests less verbose.
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  typedef base::TimeDelta TimeDelta;
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Initilise the headers() value with a Cache-Control header set to
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // |cache_control|. |cache_control| is copied and so can safely be a
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // temporary.
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void InitializeHeadersWithCacheControl(const char* cache_control) {
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    std::string raw_headers("HTTP/1.1 200 OK\n");
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    raw_headers += "Cache-Control: ";
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    raw_headers += cache_control;
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    raw_headers += "\n";
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    HeadersToRaw(&raw_headers);
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    headers_ = new net::HttpResponseHeaders(raw_headers);
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const scoped_refptr<net::HttpResponseHeaders>& headers() { return headers_; }
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Return a pointer to a TimeDelta object. For use when the value doesn't
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // matter.
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TimeDelta* TimeDeltaPointer() { return &delta_; }
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Get the max-age value. This should only be used in tests where a valid
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // max-age parameter is expected to be present.
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TimeDelta GetMaxAgeValue() {
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DCHECK(headers_.get()) << "Call InitializeHeadersWithCacheControl() first";
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    TimeDelta max_age_value;
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EXPECT_TRUE(headers()->GetMaxAgeValue(&max_age_value));
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return max_age_value;
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Get the stale-while-revalidate value. This should only be used in tests
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // where a valid max-age parameter is expected to be present.
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TimeDelta GetStaleWhileRevalidateValue() {
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DCHECK(headers_.get()) << "Call InitializeHeadersWithCacheControl() first";
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    TimeDelta stale_while_revalidate_value;
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EXPECT_TRUE(
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        headers()->GetStaleWhileRevalidateValue(&stale_while_revalidate_value));
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return stale_while_revalidate_value;
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private:
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_refptr<net::HttpResponseHeaders> headers_;
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TimeDelta delta_;
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class CommonHttpResponseHeadersTest
8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    : public HttpResponseHeadersTest,
8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      public ::testing::WithParamInterface<TestData> {
8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
8903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_P(CommonHttpResponseHeadersTest, TestCommon) {
9103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const TestData test = GetParam();
9203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string raw_headers(test.raw_headers);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HeadersToRaw(&raw_headers);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string expected_headers(test.expected_headers);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string headers;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::HttpResponseHeaders> parsed(
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new net::HttpResponseHeaders(raw_headers));
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  parsed->GetNormalizedHeaders(&headers);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Transform to readable output format (so it's easier to see diffs).
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::replace(headers.begin(), headers.end(), ' ', '_');
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::replace(headers.begin(), headers.end(), '\n', '\\');
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::replace(expected_headers.begin(), expected_headers.end(), ' ', '_');
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::replace(expected_headers.begin(), expected_headers.end(), '\n', '\\');
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_headers, headers);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(test.expected_response_code, parsed->response_code());
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(test.expected_parsed_version == parsed->GetParsedHttpVersion());
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(test.expected_version == parsed->GetHttpVersion());
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TestData response_headers_tests[] = {
11703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  {
11803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // Normalise whitespace.
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "HTTP/1.1    202   Accepted  \n"
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Content-TYPE  : text/html; charset=utf-8  \n"
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Set-Cookie: a \n"
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Set-Cookie:   b \n",
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "HTTP/1.1 202 Accepted\n"
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Content-TYPE: text/html; charset=utf-8\n"
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Set-Cookie: a, b\n",
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    202,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::HttpVersion(1,1),
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::HttpVersion(1,1)
13203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
13303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  {
13403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // Normalize leading whitespace.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "HTTP/1.1    202   Accepted  \n"
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Starts with space -- will be skipped as invalid.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  Content-TYPE  : text/html; charset=utf-8  \n"
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Set-Cookie: a \n"
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Set-Cookie:   b \n",
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "HTTP/1.1 202 Accepted\n"
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Set-Cookie: a, b\n",
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    202,
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::HttpVersion(1,1),
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::HttpVersion(1,1)
14803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
14903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  {
15003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // Normalize blank headers.
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Header1 :          \n"
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Header2: \n"
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Header3:\n"
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Header4\n"
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Header5    :\n",
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Header1: \n"
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Header2: \n"
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Header3: \n"
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Header5: \n",
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    200,
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::HttpVersion(1,1),
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::HttpVersion(1,1)
16803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
16903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  {
17003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // Don't believe the http/0.9 version if there are headers!
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "hTtP/0.9 201\n"
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Content-TYPE: text/html; charset=utf-8\n",
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "HTTP/1.0 201 OK\n"
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Content-TYPE: text/html; charset=utf-8\n",
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    201,
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::HttpVersion(0,9),
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::HttpVersion(1,0)
18103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
18203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  {
18303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // Accept the HTTP/0.9 version number if there are no headers.
18403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // This is how HTTP/0.9 responses get constructed from
18503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // HttpNetworkTransaction.
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "hTtP/0.9 200 OK\n",
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "HTTP/0.9 200 OK\n",
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    200,
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::HttpVersion(0,9),
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::HttpVersion(0,9)
19403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
19503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  {
19603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // Add missing OK.
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "HTTP/1.1 201\n"
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Content-TYPE: text/html; charset=utf-8\n",
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "HTTP/1.1 201 OK\n"
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Content-TYPE: text/html; charset=utf-8\n",
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    201,
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::HttpVersion(1,1),
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::HttpVersion(1,1)
20703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
20803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  {
20903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // Normalize bad status line.
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "SCREWED_UP_STATUS_LINE\n"
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Content-TYPE: text/html; charset=utf-8\n",
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "HTTP/1.0 200 OK\n"
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Content-TYPE: text/html; charset=utf-8\n",
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    200,
21803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    net::HttpVersion(0,0), // Parse error.
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::HttpVersion(1,0)
22003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
22103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  {
22203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // Normalize invalid status code.
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "HTTP/1.1 -1  Unknown\n",
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "HTTP/1.1 200 OK\n",
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    200,
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::HttpVersion(1,1),
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::HttpVersion(1,1)
23103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
23203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  {
23303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // Normalize empty header.
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "",
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "HTTP/1.0 200 OK\n",
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    200,
24003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    net::HttpVersion(0,0), // Parse Error.
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::HttpVersion(1,0)
24203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
24303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  {
24403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // Normalize headers that start with a colon.
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "HTTP/1.1    202   Accepted  \n"
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "foo: bar\n"
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ": a \n"
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    " : b\n"
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "baz: blat \n",
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "HTTP/1.1 202 Accepted\n"
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "foo: bar\n"
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "baz: blat\n",
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    202,
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::HttpVersion(1,1),
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::HttpVersion(1,1)
25903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
26003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  {
26103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // Normalize headers that end with a colon.
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "HTTP/1.1    202   Accepted  \n"
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "foo:   \n"
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "bar:\n"
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "baz: blat \n"
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "zip:\n",
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "HTTP/1.1 202 Accepted\n"
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "foo: \n"
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "bar: \n"
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "baz: blat\n"
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "zip: \n",
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    202,
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::HttpVersion(1,1),
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::HttpVersion(1,1)
27803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
27903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  {
28003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // Normalize whitespace headers.
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\n   \n",
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "HTTP/1.0 200 OK\n",
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    200,
28703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    net::HttpVersion(0,0),  // Parse error.
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::HttpVersion(1,0)
28903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
29003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  {
29103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // Consolidate Set-Cookie headers.
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Set-Cookie: x=1\n"
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Set-Cookie: y=2\n",
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Set-Cookie: x=1, y=2\n",
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    200,
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::HttpVersion(1,1),
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::HttpVersion(1,1)
30303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
30403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
30503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
30603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(HttpResponseHeaders,
30703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        CommonHttpResponseHeadersTest,
30803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        testing::ValuesIn(response_headers_tests));
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpResponseHeadersTest, GetNormalizedHeader) {
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string headers =
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "HTTP/1.1 200 OK\n"
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Cache-control: private\n"
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "cache-Control: no-store\n";
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HeadersToRaw(&headers);
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::HttpResponseHeaders> parsed(
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new net::HttpResponseHeaders(headers));
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string value;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(parsed->GetNormalizedHeader("cache-control", &value));
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("private, no-store", value);
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)struct PersistData {
32503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  net::HttpResponseHeaders::PersistOptions options;
32603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const char* raw_headers;
32703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const char* expected_headers;
32803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class PersistenceTest
33103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    : public HttpResponseHeadersTest,
33203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      public ::testing::WithParamInterface<PersistData> {
33303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_P(PersistenceTest, Persist) {
33603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const PersistData test = GetParam();
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string headers = test.raw_headers;
33903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  HeadersToRaw(&headers);
34003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_refptr<net::HttpResponseHeaders> parsed1(
34103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      new net::HttpResponseHeaders(headers));
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Pickle pickle;
34403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  parsed1->Persist(&pickle, test.options);
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  PickleIterator iter(pickle);
34703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_refptr<net::HttpResponseHeaders> parsed2(
34803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      new net::HttpResponseHeaders(pickle, &iter));
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string h2;
35103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  parsed2->GetNormalizedHeaders(&h2);
35203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(std::string(test.expected_headers), h2);
35303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)const struct PersistData persistence_tests[] = {
35603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { net::HttpResponseHeaders::PERSIST_ALL,
35703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
35803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-control:private\n"
35903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "cache-Control:no-store\n",
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
36203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-control: private, no-store\n"
36303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
36403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { net::HttpResponseHeaders::PERSIST_SANS_HOP_BY_HOP,
36503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
36603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "connection: keep-alive\n"
36703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "server: blah\n",
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
37003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "server: blah\n"
37103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
37203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE |
37303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    net::HttpResponseHeaders::PERSIST_SANS_HOP_BY_HOP,
37403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
37503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "fOo: 1\n"
37603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Foo: 2\n"
37703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Transfer-Encoding: chunked\n"
37803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "CoNnection: keep-alive\n"
37903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "cache-control: private, no-cache=\"foo\"\n",
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
38203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "cache-control: private, no-cache=\"foo\"\n"
38303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
38403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE,
38503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
38603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Foo: 2\n"
38703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-Control: private,no-cache=\"foo, bar\"\n"
38803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "bar",
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
39103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-Control: private,no-cache=\"foo, bar\"\n"
39203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
39303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Ignore bogus no-cache value.
39403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE,
39503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
39603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Foo: 2\n"
39703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-Control: private,no-cache=foo\n",
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
40003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Foo: 2\n"
40103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-Control: private,no-cache=foo\n"
40203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
40303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Ignore bogus no-cache value.
40403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE,
40503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
40603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Foo: 2\n"
40703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-Control: private, no-cache=\n",
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
41003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Foo: 2\n"
41103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-Control: private, no-cache=\n"
41203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
41303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Ignore empty no-cache value.
41403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE,
41503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
41603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Foo: 2\n"
41703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-Control: private, no-cache=\"\"\n",
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
42003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Foo: 2\n"
42103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-Control: private, no-cache=\"\"\n"
42203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
42303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Ignore wrong quotes no-cache value.
42403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE,
42503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
42603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Foo: 2\n"
42703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-Control: private, no-cache=\'foo\'\n",
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
43003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Foo: 2\n"
43103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-Control: private, no-cache=\'foo\'\n"
43203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
43303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Ignore unterminated quotes no-cache value.
43403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE,
43503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
43603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Foo: 2\n"
43703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-Control: private, no-cache=\"foo\n",
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
44003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Foo: 2\n"
44103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-Control: private, no-cache=\"foo\n"
44203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
44303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Accept sloppy LWS.
44403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE,
44503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
44603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Foo: 2\n"
44703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-Control: private, no-cache=\" foo\t, bar\"\n",
44803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
44903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
45003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-Control: private, no-cache=\" foo\t, bar\"\n"
45103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
45203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Header name appears twice, separated by another header.
45303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { net::HttpResponseHeaders::PERSIST_ALL,
45403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
45503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Foo: 1\n"
45603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Bar: 2\n"
45703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Foo: 3\n",
45803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
45903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
46003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Foo: 1, 3\n"
46103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Bar: 2\n"
46203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
46303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Header name appears twice, separated by another header (type 2).
46403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { net::HttpResponseHeaders::PERSIST_ALL,
46503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
46603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Foo: 1, 3\n"
46703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Bar: 2\n"
46803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Foo: 4\n",
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
47103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Foo: 1, 3, 4\n"
47203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Bar: 2\n"
47303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
47403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Test filtering of cookie headers.
47503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { net::HttpResponseHeaders::PERSIST_SANS_COOKIES,
47603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
47703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Set-Cookie: foo=bar; httponly\n"
47803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Set-Cookie: bar=foo\n"
47903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Bar: 1\n"
48003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Set-Cookie2: bar2=foo2\n",
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
48303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Bar: 1\n"
48403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
48503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Test LWS at the end of a header.
48603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { net::HttpResponseHeaders::PERSIST_ALL,
48703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
48803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length: 450   \n"
48903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Encoding: gzip\n",
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
49203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length: 450\n"
49303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Encoding: gzip\n"
49403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
49503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Test LWS at the end of a header.
49603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { net::HttpResponseHeaders::PERSIST_RAW,
49703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
49803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length: 450   \n"
49903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Encoding: gzip\n",
50003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
50103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
50203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length: 450\n"
50303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Encoding: gzip\n"
50403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
50503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Test filtering of transport security state headers.
50603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { net::HttpResponseHeaders::PERSIST_SANS_SECURITY_STATE,
50703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
50803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Strict-Transport-Security: max-age=1576800\n"
50903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Bar: 1\n"
51003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Public-Key-Pins: max-age=100000; "
51103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        "pin-sha1=\"ObT42aoSpAqWdY9WfRfL7i0HsVk=\";"
51203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        "pin-sha1=\"7kW49EVwZG0hSNx41ZO/fUPN0ek=\"",
51303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
51403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
51503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Bar: 1\n"
51603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
51703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
51803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
51903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(HttpResponseHeaders,
52003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        PersistenceTest,
52103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        testing::ValuesIn(persistence_tests));
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpResponseHeadersTest, EnumerateHeader_Coalesced) {
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure that commas in quoted strings are not regarded as value separators.
52503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Ensure that whitespace following a value is trimmed properly.
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string headers =
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "HTTP/1.1 200 OK\n"
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Cache-control:private , no-cache=\"set-cookie,server\" \n"
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "cache-Control: no-store\n";
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HeadersToRaw(&headers);
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::HttpResponseHeaders> parsed(
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new net::HttpResponseHeaders(headers));
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* iter = NULL;
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string value;
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(parsed->EnumerateHeader(&iter, "cache-control", &value));
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("private", value);
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(parsed->EnumerateHeader(&iter, "cache-control", &value));
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("no-cache=\"set-cookie,server\"", value);
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(parsed->EnumerateHeader(&iter, "cache-control", &value));
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("no-store", value);
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(parsed->EnumerateHeader(&iter, "cache-control", &value));
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpResponseHeadersTest, EnumerateHeader_Challenge) {
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Even though WWW-Authenticate has commas, it should not be treated as
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // coalesced values.
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string headers =
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "HTTP/1.1 401 OK\n"
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "WWW-Authenticate:Digest realm=foobar, nonce=x, domain=y\n"
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "WWW-Authenticate:Basic realm=quatar\n";
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HeadersToRaw(&headers);
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::HttpResponseHeaders> parsed(
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new net::HttpResponseHeaders(headers));
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* iter = NULL;
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string value;
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(parsed->EnumerateHeader(&iter, "WWW-Authenticate", &value));
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("Digest realm=foobar, nonce=x, domain=y", value);
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(parsed->EnumerateHeader(&iter, "WWW-Authenticate", &value));
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("Basic realm=quatar", value);
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(parsed->EnumerateHeader(&iter, "WWW-Authenticate", &value));
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpResponseHeadersTest, EnumerateHeader_DateValued) {
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The comma in a date valued header should not be treated as a
56703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // field-value separator.
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string headers =
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "HTTP/1.1 200 OK\n"
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Date: Tue, 07 Aug 2007 23:10:55 GMT\n"
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Last-Modified: Wed, 01 Aug 2007 23:23:45 GMT\n";
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HeadersToRaw(&headers);
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::HttpResponseHeaders> parsed(
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new net::HttpResponseHeaders(headers));
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string value;
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(parsed->EnumerateHeader(NULL, "date", &value));
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("Tue, 07 Aug 2007 23:10:55 GMT", value);
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(parsed->EnumerateHeader(NULL, "last-modified", &value));
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("Wed, 01 Aug 2007 23:23:45 GMT", value);
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpResponseHeadersTest, DefaultDateToGMT) {
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify we make the best interpretation when parsing dates that incorrectly
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // do not end in "GMT" as RFC2616 requires.
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string headers =
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "HTTP/1.1 200 OK\n"
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Date: Tue, 07 Aug 2007 23:10:55\n"
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Last-Modified: Tue, 07 Aug 2007 19:10:55 EDT\n"
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Expires: Tue, 07 Aug 2007 23:10:55 UTC\n";
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HeadersToRaw(&headers);
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::HttpResponseHeaders> parsed(
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new net::HttpResponseHeaders(headers));
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time expected_value;
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(base::Time::FromString("Tue, 07 Aug 2007 23:10:55 GMT",
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     &expected_value));
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time value;
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When the timezone is missing, GMT is a good guess as its what RFC2616
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // requires.
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(parsed->GetDateValue(&value));
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_value, value);
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If GMT is missing but an RFC822-conforming one is present, use that.
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(parsed->GetLastModifiedValue(&value));
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_value, value);
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If an unknown timezone is present, treat like a missing timezone and
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // default to GMT.  The only example of a web server not specifying "GMT"
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // used "UTC" which is equivalent to GMT.
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (parsed->GetExpiresValue(&value))
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_value, value);
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)struct ContentTypeTestData {
61403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const std::string raw_headers;
61503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const std::string mime_type;
61603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const bool has_mimetype;
61703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const std::string charset;
61803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const bool has_charset;
61903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const std::string all_content_type;
62003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class ContentTypeTest
62303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    : public HttpResponseHeadersTest,
62403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      public ::testing::WithParamInterface<ContentTypeTestData> {
62503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
62603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
62703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_P(ContentTypeTest, GetMimeType) {
62803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const ContentTypeTestData test = GetParam();
62903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
63003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string headers(test.raw_headers);
63103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  HeadersToRaw(&headers);
63203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_refptr<net::HttpResponseHeaders> parsed(
63303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      new net::HttpResponseHeaders(headers));
63403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
63503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string value;
63603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(test.has_mimetype, parsed->GetMimeType(&value));
63703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(test.mime_type, value);
63803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  value.clear();
63903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(test.has_charset, parsed->GetCharset(&value));
64003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(test.charset, value);
64103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(parsed->GetNormalizedHeader("content-type", &value));
64203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(test.all_content_type, value);
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)const ContentTypeTestData mimetype_tests[] = {
64603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
64703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-type: text/html\n",
64803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "text/html", true,
64903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "", false,
65003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "text/html" },
65103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Multiple content-type headers should give us the last one.
65203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
65303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-type: text/html\n"
65403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-type: text/html\n",
65503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "text/html", true,
65603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "", false,
65703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "text/html, text/html" },
65803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
65903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-type: text/plain\n"
66003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-type: text/html\n"
66103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-type: text/plain\n"
66203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-type: text/html\n",
66303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "text/html", true,
66403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "", false,
66503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "text/plain, text/html, text/plain, text/html" },
66603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Test charset parsing.
66703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
66803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-type: text/html\n"
66903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-type: text/html; charset=ISO-8859-1\n",
67003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "text/html", true,
67103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "iso-8859-1", true,
67203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "text/html, text/html; charset=ISO-8859-1" },
67303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Test charset in double quotes.
67403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
67503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-type: text/html\n"
67603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-type: text/html; charset=\"ISO-8859-1\"\n",
67703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "text/html", true,
67803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "iso-8859-1", true,
67903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "text/html, text/html; charset=\"ISO-8859-1\"" },
68003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // If there are multiple matching content-type headers, we carry
68103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // over the charset value.
68203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
68303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-type: text/html;charset=utf-8\n"
68403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-type: text/html\n",
68503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "text/html", true,
68603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "utf-8", true,
68703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "text/html;charset=utf-8, text/html" },
68803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Test single quotes.
68903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
69003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-type: text/html;charset='utf-8'\n"
69103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-type: text/html\n",
69203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "text/html", true,
69303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "utf-8", true,
69403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "text/html;charset='utf-8', text/html" },
69503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Last charset wins if matching content-type.
69603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
69703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-type: text/html;charset=utf-8\n"
69803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-type: text/html;charset=iso-8859-1\n",
69903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "text/html", true,
70003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "iso-8859-1", true,
70103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "text/html;charset=utf-8, text/html;charset=iso-8859-1" },
70203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Charset is ignored if the content types change.
70303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
70403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-type: text/plain;charset=utf-8\n"
70503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-type: text/html\n",
70603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "text/html", true,
70703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "", false,
70803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "text/plain;charset=utf-8, text/html" },
70903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Empty content-type.
71003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
71103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-type: \n",
71203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "", false,
71303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "", false,
71403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "" },
71503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Emtpy charset.
71603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
71703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-type: text/html;charset=\n",
71803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "text/html", true,
71903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "", false,
72003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "text/html;charset=" },
72103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Multiple charsets, last one wins.
72203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
72303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-type: text/html;charset=utf-8; charset=iso-8859-1\n",
72403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "text/html", true,
72503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "iso-8859-1", true,
72603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "text/html;charset=utf-8; charset=iso-8859-1" },
72703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Multiple params.
72803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
72903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-type: text/html; foo=utf-8; charset=iso-8859-1\n",
73003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "text/html", true,
73103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "iso-8859-1", true,
73203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "text/html; foo=utf-8; charset=iso-8859-1" },
73303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
73403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-type: text/html ; charset=utf-8 ; bar=iso-8859-1\n",
73503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "text/html", true,
73603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "utf-8", true,
73703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "text/html ; charset=utf-8 ; bar=iso-8859-1" },
73803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Comma embeded in quotes.
73903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
74003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-type: text/html ; charset='utf-8,text/plain' ;\n",
74103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "text/html", true,
74203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "utf-8,text/plain", true,
74303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "text/html ; charset='utf-8,text/plain' ;" },
74403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Charset with leading spaces.
74503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
74603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-type: text/html ; charset= 'utf-8' ;\n",
74703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "text/html", true,
74803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "utf-8", true,
74903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "text/html ; charset= 'utf-8' ;" },
75003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Media type comments in mime-type.
75103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
75203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-type: text/html (html)\n",
75303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "text/html", true,
75403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "", false,
75503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)   "text/html (html)" },
75603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Incomplete charset= param.
75703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
75803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-type: text/html; char=\n",
75903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "text/html", true,
76003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "", false,
76103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "text/html; char=" },
76203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Invalid media type: no slash.
76303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
76403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-type: texthtml\n",
76503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "", false,
76603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "", false,
76703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "texthtml" },
76803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Invalid media type: "*/*".
76903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
77003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-type: */*\n",
77103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "", false,
77203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "", false,
77303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "*/*" },
77403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
77503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
77603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(HttpResponseHeaders,
77703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        ContentTypeTest,
77803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        testing::ValuesIn(mimetype_tests));
77903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
78003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)struct RequiresValidationTestData {
78103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const char* headers;
78203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  bool requires_validation;
78303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
78403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
78503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class RequiresValidationTest
78603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    : public HttpResponseHeadersTest,
78703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      public ::testing::WithParamInterface<RequiresValidationTestData> {
78803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
78903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
79003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_P(RequiresValidationTest, RequiresValidation) {
79103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const RequiresValidationTestData test = GetParam();
79203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time request_time, response_time, current_time;
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time::FromString("Wed, 28 Nov 2007 00:40:09 GMT", &request_time);
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time::FromString("Wed, 28 Nov 2007 00:40:12 GMT", &response_time);
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time::FromString("Wed, 28 Nov 2007 00:45:20 GMT", &current_time);
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
79803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string headers(test.headers);
79903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  HeadersToRaw(&headers);
80003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_refptr<net::HttpResponseHeaders> parsed(
80103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      new net::HttpResponseHeaders(headers));
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
80303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  bool requires_validation =
80403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      parsed->RequiresValidation(request_time, response_time, current_time);
80503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(test.requires_validation, requires_validation);
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
80803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)const struct RequiresValidationTestData requires_validation_tests[] = {
80903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // No expiry info: expires immediately.
81003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
81103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "\n",
81203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    true
81303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
81403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // No expiry info: expires immediately.
81503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
81603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "\n",
81703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    true
81803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
81903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Valid for a little while.
82003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
82103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "cache-control: max-age=10000\n"
82203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "\n",
82303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false
82403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
82503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Expires in the future.
82603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
82703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
82803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "expires: Wed, 28 Nov 2007 01:00:00 GMT\n"
82903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "\n",
83003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false
83103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
83203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Already expired.
83303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
83403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
83503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "expires: Wed, 28 Nov 2007 00:00:00 GMT\n"
83603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "\n",
83703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    true
83803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
83903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Max-age trumps expires.
84003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
84103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
84203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "expires: Wed, 28 Nov 2007 00:00:00 GMT\n"
84303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "cache-control: max-age=10000\n"
84403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "\n",
84503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false
84603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
84703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Last-modified heuristic: modified a while ago.
84803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
84903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
85003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "last-modified: Wed, 27 Nov 2007 08:00:00 GMT\n"
85103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "\n",
85203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false
85303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
85403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 203 Non-Authoritative Information\n"
85503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
85603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "last-modified: Wed, 27 Nov 2007 08:00:00 GMT\n"
85703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "\n",
85803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false
85903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
86003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 206 Partial Content\n"
86103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
86203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "last-modified: Wed, 27 Nov 2007 08:00:00 GMT\n"
86303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "\n",
86403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false
86503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
86603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Last-modified heuristic: modified recently.
86703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
86803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
86903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "last-modified: Wed, 28 Nov 2007 00:40:10 GMT\n"
87003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "\n",
87103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    true
87203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
87303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 203 Non-Authoritative Information\n"
87403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
87503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "last-modified: Wed, 28 Nov 2007 00:40:10 GMT\n"
87603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "\n",
87703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    true
87803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
87903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 206 Partial Content\n"
88003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
88103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "last-modified: Wed, 28 Nov 2007 00:40:10 GMT\n"
88203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "\n",
88303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    true
88403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
88503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Cached permanent redirect.
88603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 301 Moved Permanently\n"
88703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "\n",
88803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false
88903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
89003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Another cached permanent redirect.
89103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 308 Permanent Redirect\n"
89203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "\n",
89303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false
89403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
89503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Cached redirect: not reusable even though by default it would be.
89603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 300 Multiple Choices\n"
89703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-Control: no-cache\n"
89803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "\n",
89903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    true
90003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
90103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Cached forever by default.
90203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 410 Gone\n"
90303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "\n",
90403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false
90503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
90603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Cached temporary redirect: not reusable.
90703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 302 Found\n"
90803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "\n",
90903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    true
91003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
91103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Cached temporary redirect: reusable.
91203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 302 Found\n"
91303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "cache-control: max-age=10000\n"
91403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "\n",
91503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false
91603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
91703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Cache-control: max-age=N overrides expires: date in the past.
91803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
91903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
92003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "expires: Wed, 28 Nov 2007 00:20:11 GMT\n"
92103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "cache-control: max-age=10000\n"
92203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "\n",
92303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false
92403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
92503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Cache-control: no-store overrides expires: in the future.
92603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
92703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
92803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "expires: Wed, 29 Nov 2007 00:40:11 GMT\n"
92903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "cache-control: no-store,private,no-cache=\"foo\"\n"
93003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "\n",
93103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    true
93203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
93303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Pragma: no-cache overrides last-modified heuristic.
93403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
93503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
93603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "last-modified: Wed, 27 Nov 2007 08:00:00 GMT\n"
93703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "pragma: no-cache\n"
93803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "\n",
93903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    true
94003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
94103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
94203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // TODO(darin): Add many many more tests here.
94303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
94503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(HttpResponseHeaders,
94603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        RequiresValidationTest,
94703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        testing::ValuesIn(requires_validation_tests));
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
94903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)struct UpdateTestData {
95003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const char* orig_headers;
95103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const char* new_headers;
95203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const char* expected_headers;
95303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class UpdateTest
95603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    : public HttpResponseHeadersTest,
95703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      public ::testing::WithParamInterface<UpdateTestData> {
95803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
96003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_P(UpdateTest, Update) {
96103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const UpdateTestData test = GetParam();
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
96303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string orig_headers(test.orig_headers);
96403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  HeadersToRaw(&orig_headers);
96503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_refptr<net::HttpResponseHeaders> parsed(
96603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      new net::HttpResponseHeaders(orig_headers));
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
96803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string new_headers(test.new_headers);
96903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  HeadersToRaw(&new_headers);
97003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_refptr<net::HttpResponseHeaders> new_parsed(
97103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      new net::HttpResponseHeaders(new_headers));
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
97303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  parsed->Update(*new_parsed.get());
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
97503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string resulting_headers;
97603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  parsed->GetNormalizedHeaders(&resulting_headers);
97703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(std::string(test.expected_headers), resulting_headers);
97803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
98003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)const UpdateTestData update_tests[] = {
98103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n",
9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
98303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1/1 304 Not Modified\n"
98403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "connection: keep-alive\n"
98503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-control: max-age=10000\n",
9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
98703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
98803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-control: max-age=10000\n"
98903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
99003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
99103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Foo: 1\n"
99203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-control: private\n",
9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
99403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1/1 304 Not Modified\n"
99503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "connection: keep-alive\n"
99603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-control: max-age=10000\n",
9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
99803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
99903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-control: max-age=10000\n"
100003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Foo: 1\n"
100103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
100203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
100303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Foo: 1\n"
100403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-control: private\n",
10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
100603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1/1 304 Not Modified\n"
100703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "connection: keep-alive\n"
100803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-CONTROL: max-age=10000\n",
10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
101003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
101103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-CONTROL: max-age=10000\n"
101203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Foo: 1\n"
101303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
101403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
101503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length: 450\n",
10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
101703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1/1 304 Not Modified\n"
101803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "connection: keep-alive\n"
101903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-control:      max-age=10001   \n",
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
102203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-control: max-age=10001\n"
102303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length: 450\n"
102403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
102503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
102603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "X-Frame-Options: DENY\n",
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1/1 304 Not Modified\n"
102903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "X-Frame-Options: ALLOW\n",
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
103103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
103203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "X-Frame-Options: DENY\n",
103303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
103403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
103503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "X-WebKit-CSP: default-src 'none'\n",
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
103703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1/1 304 Not Modified\n"
103803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "X-WebKit-CSP: default-src *\n",
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
104003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
104103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "X-WebKit-CSP: default-src 'none'\n",
104203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
104303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
104403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "X-XSS-Protection: 1\n",
104503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
104603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1/1 304 Not Modified\n"
104703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "X-XSS-Protection: 0\n",
104803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
104903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
105003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "X-XSS-Protection: 1\n",
105103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
105203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n",
105303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
105403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1/1 304 Not Modified\n"
105503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "X-Content-Type-Options: nosniff\n",
105603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
105703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
105803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
105903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
106003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
106103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(HttpResponseHeaders,
106203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        UpdateTest,
106303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        testing::ValuesIn(update_tests));
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
106503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)struct EnumerateHeaderTestData {
106603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const char* headers;
106703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const char* expected_lines;
106803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
106903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
107003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class EnumerateHeaderLinesTest
107103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    : public HttpResponseHeadersTest,
107203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      public ::testing::WithParamInterface<EnumerateHeaderTestData> {
107303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
107403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
107503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_P(EnumerateHeaderLinesTest, EnumerateHeaderLines) {
107603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const EnumerateHeaderTestData test = GetParam();
107703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
107803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string headers(test.headers);
107903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  HeadersToRaw(&headers);
108003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_refptr<net::HttpResponseHeaders> parsed(
108103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      new net::HttpResponseHeaders(headers));
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
108303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string name, value, lines;
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
108503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void* iter = NULL;
108603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  while (parsed->EnumerateHeaderLines(&iter, &name, &value)) {
108703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    lines.append(name);
108803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    lines.append(": ");
108903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    lines.append(value);
109003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    lines.append("\n");
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
109203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
109303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(std::string(test.expected_lines), lines);
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
109603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)const EnumerateHeaderTestData enumerate_header_tests[] = {
109703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n",
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
109903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    ""
110003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
110103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
110203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Foo: 1\n",
110303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
110403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Foo: 1\n"
110503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
110603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
110703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Foo: 1\n"
110803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Bar: 2\n"
110903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Foo: 3\n",
111003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
111103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Foo: 1\nBar: 2\nFoo: 3\n"
111203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
111303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
111403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Foo: 1, 2, 3\n",
111503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
111603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Foo: 1, 2, 3\n"
111703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
111803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
111903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
112003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(HttpResponseHeaders,
112103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        EnumerateHeaderLinesTest,
112203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        testing::ValuesIn(enumerate_header_tests));
112303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
112403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)struct IsRedirectTestData {
112503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const char* headers;
112603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const char* location;
112703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  bool is_redirect;
112803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
112903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
113003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class IsRedirectTest
113103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    : public HttpResponseHeadersTest,
113203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      public ::testing::WithParamInterface<IsRedirectTestData> {
113303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
113403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
113503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_P(IsRedirectTest, IsRedirect) {
113603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const IsRedirectTestData test = GetParam();
113703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
113803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string headers(test.headers);
113903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  HeadersToRaw(&headers);
114003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_refptr<net::HttpResponseHeaders> parsed(
114103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      new net::HttpResponseHeaders(headers));
114203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
114303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string location;
114403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(parsed->IsRedirect(&location), test.is_redirect);
114503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(location, test.location);
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
114803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)const IsRedirectTestData is_redirect_tests[] = {
114903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n",
115003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "",
115103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false
115203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
115303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 301 Moved\n"
115403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Location: http://foopy/\n",
115503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "http://foopy/",
115603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    true
115703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
115803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 301 Moved\n"
115903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Location: \t \n",
116003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "",
116103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false
116203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
116303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // We use the first location header as the target of the redirect.
116403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 301 Moved\n"
116503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Location: http://foo/\n"
116603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Location: http://bar/\n",
116703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "http://foo/",
116803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    true
116903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
117003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // We use the first _valid_ location header as the target of the redirect.
117103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 301 Moved\n"
117203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Location: \n"
117303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Location: http://bar/\n",
117403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "http://bar/",
117503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    true
117603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
117703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Bug 1050541 (location header with an unescaped comma).
117803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 301 Moved\n"
117903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Location: http://foo/bar,baz.html\n",
118003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "http://foo/bar,baz.html",
118103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    true
118203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
118303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Bug 1224617 (location header with non-ASCII bytes).
118403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 301 Moved\n"
118503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Location: http://foo/bar?key=\xE4\xF6\xFC\n",
118603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "http://foo/bar?key=%E4%F6%FC",
118703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    true
118803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
118903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Shift_JIS, Big5, and GBK contain multibyte characters with the trailing
119003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // byte falling in the ASCII range.
119103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 301 Moved\n"
119203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Location: http://foo/bar?key=\x81\x5E\xD8\xBF\n",
119303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "http://foo/bar?key=%81^%D8%BF",
119403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    true
119503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
119603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 301 Moved\n"
119703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Location: http://foo/bar?key=\x82\x40\xBD\xC4\n",
119803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "http://foo/bar?key=%82@%BD%C4",
119903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    true
120003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
120103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 301 Moved\n"
120203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Location: http://foo/bar?key=\x83\x5C\x82\x5D\xCB\xD7\n",
120303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "http://foo/bar?key=%83\\%82]%CB%D7",
120403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    true
120503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
120603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
120803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(HttpResponseHeaders,
120903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        IsRedirectTest,
121003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        testing::ValuesIn(is_redirect_tests));
121103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
121203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)struct ContentLengthTestData {
121303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const char* headers;
121403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  int64 expected_len;
121503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
121603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
121703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class GetContentLengthTest
121803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    : public HttpResponseHeadersTest,
121903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      public ::testing::WithParamInterface<ContentLengthTestData> {
122003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
122103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
122203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_P(GetContentLengthTest, GetContentLength) {
122303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const ContentLengthTestData test = GetParam();
122403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
122503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string headers(test.headers);
122603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  HeadersToRaw(&headers);
122703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_refptr<net::HttpResponseHeaders> parsed(
122803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      new net::HttpResponseHeaders(headers));
122903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
123003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(test.expected_len, parsed->GetContentLength());
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
123303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)const ContentLengthTestData content_length_tests[] = {
123403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n",
123503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1
123603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
123703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
123803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length: 10\n",
123903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    10
124003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
124103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
124203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length: \n",
124303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1
124403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
124503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
124603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length: abc\n",
124703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1
124803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
124903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
125003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length: -10\n",
125103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1
125203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
125303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
125403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length:  +10\n",
125503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1
125603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
125703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
125803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length: 23xb5\n",
125903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1
126003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
126103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
126203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length: 0xA\n",
126303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1
126403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
126503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
126603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length: 010\n",
126703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    10
126803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
126903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Content-Length too big, will overflow an int64.
127003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
127103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length: 40000000000000000000\n",
127203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1
127303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
127403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
127503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length:       10\n",
127603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    10
127703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
127803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
127903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length: 10  \n",
128003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    10
128103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
128203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
128303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length: \t10\n",
128403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    10
128503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
128603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
128703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length: \v10\n",
128803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1
128903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
129003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
129103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length: \f10\n",
129203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1
129303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
129403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
129503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "cOnTeNt-LENgth: 33\n",
129603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    33
129703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
129803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
129903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length: 34\r\n",
130003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1
130103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
130203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
130403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(HttpResponseHeaders,
130503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        GetContentLengthTest,
130603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        testing::ValuesIn(content_length_tests));
130703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
130803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)struct ContentRangeTestData {
130903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const char* headers;
131003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  bool expected_return_value;
131103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  int64 expected_first_byte_position;
131203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  int64 expected_last_byte_position;
131303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  int64 expected_instance_size;
131403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
131503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
131603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class ContentRangeTest
131703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    : public HttpResponseHeadersTest,
131803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      public ::testing::WithParamInterface<ContentRangeTestData> {
131903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
132003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
132103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_P(ContentRangeTest, GetContentRange) {
132203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const ContentRangeTestData test = GetParam();
132303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
132403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string headers(test.headers);
132503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  HeadersToRaw(&headers);
132603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_refptr<net::HttpResponseHeaders> parsed(
132703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      new net::HttpResponseHeaders(headers));
132803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
132903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  int64 first_byte_position;
133003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  int64 last_byte_position;
133103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  int64 instance_size;
133203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  bool return_value = parsed->GetContentRange(&first_byte_position,
133303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                              &last_byte_position,
133403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                              &instance_size);
133503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(test.expected_return_value, return_value);
133603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(test.expected_first_byte_position, first_byte_position);
133703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(test.expected_last_byte_position, last_byte_position);
133803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(test.expected_instance_size, instance_size);
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
134103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)const ContentRangeTestData content_range_tests[] = {
134203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 206 Partial Content",
134303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false,
134403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1,
134503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1,
134603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1
134703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
134803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 206 Partial Content\n"
134903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Range:",
135003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false,
135103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1,
135203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1,
135303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1
135403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
135503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 206 Partial Content\n"
135603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Range: megabytes 0-10/50",
135703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false,
135803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1,
135903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1,
136003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1
136103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
136203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 206 Partial Content\n"
136303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Range: 0-10/50",
136403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false,
136503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1,
136603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1,
136703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1
136803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
136903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 206 Partial Content\n"
137003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Range: Bytes 0-50/51",
137103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    true,
137203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    0,
137303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    50,
137403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    51
137503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
137603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 206 Partial Content\n"
137703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Range: bytes 0-50/51",
137803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    true,
137903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    0,
138003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    50,
138103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    51
138203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
138303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 206 Partial Content\n"
138403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Range: bytes\t0-50/51",
138503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false,
138603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1,
138703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1,
138803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1
138903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
139003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 206 Partial Content\n"
139103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Range:     bytes 0-50/51",
139203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    true,
139303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    0,
139403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    50,
139503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    51
139603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
139703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 206 Partial Content\n"
139803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Range:     bytes    0    -   50  \t / \t51",
139903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    true,
140003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    0,
140103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    50,
140203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    51
140303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
140403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 206 Partial Content\n"
140503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Range: bytes 0\t-\t50\t/\t51\t",
140603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    true,
140703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    0,
140803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    50,
140903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    51
141003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
141103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 206 Partial Content\n"
141203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Range:   \tbytes\t\t\t 0\t-\t50\t/\t51\t",
141303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    true,
141403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    0,
141503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    50,
141603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    51
141703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
141803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 206 Partial Content\n"
141903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Range: \t   bytes \t  0    -   50   /   5   1",
142003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false,
142103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    0,
142203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    50,
142303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1
142403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
142503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 206 Partial Content\n"
142603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Range: \t   bytes \t  0    -   5 0   /   51",
142703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false,
142803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1,
142903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1,
143003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1
143103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
143203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 206 Partial Content\n"
143303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Range: bytes 50-0/51",
143403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false,
143503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    50,
143603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    0,
143703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1
143803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
143903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 416 Requested range not satisfiable\n"
144003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Range: bytes * /*",
144103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false,
144203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1,
144303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1,
144403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1
144503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
144603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 416 Requested range not satisfiable\n"
144703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Range: bytes *   /    *   ",
144803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false,
144903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1,
145003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1,
145103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1
145203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
145303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 206 Partial Content\n"
145403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Range: bytes 0-50/*",
145503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false,
145603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    0,
145703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    50,
145803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1
145903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
146003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 206 Partial Content\n"
146103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Range: bytes 0-50  /    * ",
146203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false,
146303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    0,
146403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    50,
146503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1
146603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
146703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 206 Partial Content\n"
146803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Range: bytes 0-10000000000/10000000001",
146903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    true,
147003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    0,
147103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    10000000000ll,
147203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    10000000001ll
147303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
147403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 206 Partial Content\n"
147503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Range: bytes 0-10000000000/10000000000",
147603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false,
147703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    0,
147803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    10000000000ll,
147903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    10000000000ll
148003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
148103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // 64 bit wraparound.
148203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 206 Partial Content\n"
148303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Range: bytes 0 - 9223372036854775807 / 100",
148403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false,
148503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    0,
148603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    kint64max,
148703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    100
148803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
148903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // 64 bit wraparound.
149003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 206 Partial Content\n"
149103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Range: bytes 0 - 100 / -9223372036854775808",
149203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false,
149303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    0,
149403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    100,
149503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    kint64min
149603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
149703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 206 Partial Content\n"
149803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Range: bytes */50",
149903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false,
150003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1,
150103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1,
150203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    50
150303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
150403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 206 Partial Content\n"
150503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Range: bytes 0-50/10",
150603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false,
150703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    0,
150803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    50,
150903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    10
151003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
151103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 206 Partial Content\n"
151203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Range: bytes 40-50/45",
151303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false,
151403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    40,
151503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    50,
151603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    45
151703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
151803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 206 Partial Content\n"
151903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Range: bytes 0-50/-10",
152003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false,
152103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    0,
152203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    50,
152303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -10
152403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
152503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 206 Partial Content\n"
152603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Range: bytes 0-0/1",
152703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    true,
152803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    0,
152903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    0,
153003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    1
153103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
153203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 206 Partial Content\n"
153303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Range: bytes 0-40000000000000000000/40000000000000000001",
153403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false,
153503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1,
153603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1,
153703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1
153803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
153903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 206 Partial Content\n"
154003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Range: bytes 1-/100",
154103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false,
154203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1,
154303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1,
154403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1
154503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
154603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 206 Partial Content\n"
154703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Range: bytes -/100",
154803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false,
154903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1,
155003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1,
155103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1
155203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
155303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 206 Partial Content\n"
155403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Range: bytes -1/100",
155503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false,
155603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1,
155703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1,
155803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1
155903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
156003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 206 Partial Content\n"
156103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Range: bytes 0-1233/*",
156203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false,
156303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    0,
156403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    1233,
156503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1
156603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
156703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 206 Partial Content\n"
156803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Range: bytes -123 - -1/100",
156903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false,
157003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1,
157103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1,
157203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    -1
157303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
157403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
157603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(HttpResponseHeaders,
157703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        ContentRangeTest,
157803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        testing::ValuesIn(content_range_tests));
157903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
158003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)struct KeepAliveTestData {
158103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const char* headers;
158203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  bool expected_keep_alive;
158303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
158403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
158503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class IsKeepAliveTest
158603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    : public HttpResponseHeadersTest,
158703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      public ::testing::WithParamInterface<KeepAliveTestData> {
158803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
158903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
159003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_P(IsKeepAliveTest, IsKeepAlive) {
159103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const KeepAliveTestData test = GetParam();
159203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
159303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string headers(test.headers);
159403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  HeadersToRaw(&headers);
159503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_refptr<net::HttpResponseHeaders> parsed(
159603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      new net::HttpResponseHeaders(headers));
159703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
159803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(test.expected_keep_alive, parsed->IsKeepAlive());
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
160103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)const KeepAliveTestData keepalive_tests[] = {
160203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // The status line fabricated by HttpNetworkTransaction for a 0.9 response.
160303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Treated as 0.9.
160403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/0.9 200 OK",
160503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false
160603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
160703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // This could come from a broken server.  Treated as 1.0 because it has a
160803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // header.
160903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/0.9 200 OK\n"
161003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "connection: keep-alive\n",
161103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    true
161203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
161303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n",
161403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    true
161503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
161603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.0 200 OK\n",
161703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false
161803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
161903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.0 200 OK\n"
162003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "connection: close\n",
162103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false
162203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
162303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.0 200 OK\n"
162403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "connection: keep-alive\n",
162503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    true
162603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
162703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.0 200 OK\n"
162803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "connection: kEeP-AliVe\n",
162903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    true
163003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
163103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.0 200 OK\n"
163203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "connection: keep-aliveX\n",
163303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false
163403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
163503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
163603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "connection: close\n",
163703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false
163803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
163903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
164003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "connection: keep-alive\n",
164103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    true
164203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
164303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.0 200 OK\n"
164403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "proxy-connection: close\n",
164503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false
164603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
164703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.0 200 OK\n"
164803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "proxy-connection: keep-alive\n",
164903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    true
165003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
165103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
165203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "proxy-connection: close\n",
165303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false
165403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
165503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
165603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "proxy-connection: keep-alive\n",
165703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    true
165803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
165903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
166103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(HttpResponseHeaders,
166203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        IsKeepAliveTest,
166303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        testing::ValuesIn(keepalive_tests));
166403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
166503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)struct HasStrongValidatorsTestData {
166603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const char* headers;
166703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  bool expected_result;
166803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
166903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
167003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class HasStrongValidatorsTest
167103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    : public HttpResponseHeadersTest,
167203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      public ::testing::WithParamInterface<HasStrongValidatorsTestData> {
167303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
167403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
167503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_P(HasStrongValidatorsTest, HasStrongValidators) {
167603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const HasStrongValidatorsTestData test = GetParam();
167703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
167803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string headers(test.headers);
167903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  HeadersToRaw(&headers);
168003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_refptr<net::HttpResponseHeaders> parsed(
168103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      new net::HttpResponseHeaders(headers));
168203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
168303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(test.expected_result, parsed->HasStrongValidators());
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
168603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)const HasStrongValidatorsTestData strong_validators_tests[] = {
168703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/0.9 200 OK",
168803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false
168903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
169003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.0 200 OK\n"
169103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Date: Wed, 28 Nov 2007 01:40:10 GMT\n"
169203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Last-Modified: Wed, 28 Nov 2007 00:40:10 GMT\n"
169303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "ETag: \"foo\"\n",
169403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false
169503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
169603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
169703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Date: Wed, 28 Nov 2007 01:40:10 GMT\n"
169803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Last-Modified: Wed, 28 Nov 2007 00:40:10 GMT\n"
169903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "ETag: \"foo\"\n",
170003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    true
170103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
170203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
170303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Date: Wed, 28 Nov 2007 00:41:10 GMT\n"
170403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Last-Modified: Wed, 28 Nov 2007 00:40:10 GMT\n",
170503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    true
170603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
170703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
170803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Date: Wed, 28 Nov 2007 00:41:09 GMT\n"
170903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Last-Modified: Wed, 28 Nov 2007 00:40:10 GMT\n",
171003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false
171103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
171203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
171303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "ETag: \"foo\"\n",
171403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    true
171503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
171603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // This is not really a weak etag:
171703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
171803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "etag: \"w/foo\"\n",
171903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    true
172003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
172103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // This is a weak etag:
172203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
172303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "etag: w/\"foo\"\n",
172403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false
172503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
172603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
172703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "etag:    W  /   \"foo\"\n",
172803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    false
172903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
173003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
173103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
173203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(HttpResponseHeaders,
173303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        HasStrongValidatorsTest,
173403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        testing::ValuesIn(strong_validators_tests));
173503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpResponseHeadersTest, GetStatusText) {
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string headers("HTTP/1.1 404 Not Found");
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HeadersToRaw(&headers);
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<net::HttpResponseHeaders> parsed(
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new net::HttpResponseHeaders(headers));
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string("Not Found"), parsed->GetStatusText());
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpResponseHeadersTest, GetStatusTextMissing) {
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string headers("HTTP/1.1 404");
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HeadersToRaw(&headers);
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<net::HttpResponseHeaders> parsed(
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new net::HttpResponseHeaders(headers));
174903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Since the status line gets normalized, we have OK.
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string("OK"), parsed->GetStatusText());
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpResponseHeadersTest, GetStatusTextMultiSpace) {
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string headers("HTTP/1.0     404     Not   Found");
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HeadersToRaw(&headers);
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<net::HttpResponseHeaders> parsed(
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new net::HttpResponseHeaders(headers));
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string("Not   Found"), parsed->GetStatusText());
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpResponseHeadersTest, GetStatusBadStatusLine) {
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string headers("Foo bar.");
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HeadersToRaw(&headers);
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<net::HttpResponseHeaders> parsed(
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new net::HttpResponseHeaders(headers));
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The bad status line would have gotten rewritten as
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HTTP/1.0 200 OK.
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string("OK"), parsed->GetStatusText());
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
177103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)struct AddHeaderTestData {
177203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const char* orig_headers;
177303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const char* new_header;
177403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const char* expected_headers;
177503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
177703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class AddHeaderTest
177803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    : public HttpResponseHeadersTest,
177903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      public ::testing::WithParamInterface<AddHeaderTestData> {
178003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
178203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_P(AddHeaderTest, AddHeader) {
178303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const AddHeaderTestData test = GetParam();
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
178503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string orig_headers(test.orig_headers);
178603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  HeadersToRaw(&orig_headers);
178703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_refptr<net::HttpResponseHeaders> parsed(
178803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      new net::HttpResponseHeaders(orig_headers));
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
179003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string new_header(test.new_header);
179103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  parsed->AddHeader(new_header);
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
179303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string resulting_headers;
179403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  parsed->GetNormalizedHeaders(&resulting_headers);
179503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(std::string(test.expected_headers), resulting_headers);
179603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
179803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)const AddHeaderTestData add_header_tests[] = {
179903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
180003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "connection: keep-alive\n"
180103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-control: max-age=10000\n",
180203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
180303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length: 450",
180403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
180503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
180603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "connection: keep-alive\n"
180703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-control: max-age=10000\n"
180803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length: 450\n"
180903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
181003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
181103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "connection: keep-alive\n"
181203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-control: max-age=10000    \n",
181303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
181403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length: 450  ",
181503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
181603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
181703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "connection: keep-alive\n"
181803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-control: max-age=10000\n"
181903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length: 450\n"
182003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
182103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
182203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
182303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(HttpResponseHeaders,
182403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        AddHeaderTest,
182503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        testing::ValuesIn(add_header_tests));
182603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
182703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)struct RemoveHeaderTestData {
182803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const char* orig_headers;
182903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const char* to_remove;
183003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const char* expected_headers;
183103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
183203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
183303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class RemoveHeaderTest
183403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    : public HttpResponseHeadersTest,
183503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      public ::testing::WithParamInterface<RemoveHeaderTestData> {
183603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
183703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
183803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_P(RemoveHeaderTest, RemoveHeader) {
183903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const RemoveHeaderTestData test = GetParam();
184003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
184103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string orig_headers(test.orig_headers);
184203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  HeadersToRaw(&orig_headers);
184303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_refptr<net::HttpResponseHeaders> parsed(
184403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      new net::HttpResponseHeaders(orig_headers));
184503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
184603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string name(test.to_remove);
184703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  parsed->RemoveHeader(name);
184803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
184903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string resulting_headers;
185003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  parsed->GetNormalizedHeaders(&resulting_headers);
185103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(std::string(test.expected_headers), resulting_headers);
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)const RemoveHeaderTestData remove_header_tests[] = {
185503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
185603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "connection: keep-alive\n"
185703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-control: max-age=10000\n"
185803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length: 450\n",
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
186003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length",
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
186203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
186303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "connection: keep-alive\n"
186403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-control: max-age=10000\n"
186503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
186603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
186703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "connection: keep-alive  \n"
186803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length  : 450  \n"
186903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-control: max-age=10000\n",
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
187103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length",
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
187303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
187403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "connection: keep-alive\n"
187503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-control: max-age=10000\n"
187603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
187703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
187903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(HttpResponseHeaders,
188003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        RemoveHeaderTest,
188103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        testing::ValuesIn(remove_header_tests));
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
188303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)struct RemoveIndividualHeaderTestData {
188403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const char* orig_headers;
188503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const char* to_remove_name;
188603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const char* to_remove_value;
188703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const char* expected_headers;
188803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
188903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
189003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class RemoveIndividualHeaderTest
189103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    : public HttpResponseHeadersTest,
189203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      public ::testing::WithParamInterface<RemoveIndividualHeaderTestData> {
189303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
189403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
189503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_P(RemoveIndividualHeaderTest, RemoveIndividualHeader) {
189603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const RemoveIndividualHeaderTestData test = GetParam();
189703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
189803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string orig_headers(test.orig_headers);
189903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  HeadersToRaw(&orig_headers);
190003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_refptr<net::HttpResponseHeaders> parsed(
190103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      new net::HttpResponseHeaders(orig_headers));
190203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
190303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string name(test.to_remove_name);
190403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string value(test.to_remove_value);
190503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  parsed->RemoveHeaderLine(name, value);
190603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
190703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string resulting_headers;
190803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  parsed->GetNormalizedHeaders(&resulting_headers);
190903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(std::string(test.expected_headers), resulting_headers);
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
191203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)const RemoveIndividualHeaderTestData remove_individual_header_tests[] = {
191303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
191403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "connection: keep-alive\n"
191503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-control: max-age=10000\n"
191603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length: 450\n",
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
191803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length",
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
192003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "450",
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
192203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
192303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "connection: keep-alive\n"
192403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-control: max-age=10000\n"
192503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
192603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
192703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "connection: keep-alive  \n"
192803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length  : 450  \n"
192903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-control: max-age=10000\n",
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
193103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length",
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
193303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "450",
19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
193503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
193603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "connection: keep-alive\n"
193703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-control: max-age=10000\n"
193803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
193903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
194003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "connection: keep-alive  \n"
194103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length: 450\n"
194203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-control: max-age=10000\n",
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
194403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length",  // Matching name.
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
194603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "999",  // Mismatching value.
19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
194803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
194903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "connection: keep-alive\n"
195003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length: 450\n"
195103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-control: max-age=10000\n"
195203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
195303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
195403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "connection: keep-alive  \n"
195503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Foo: bar, baz\n"
195603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Foo: bar\n"
195703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-control: max-age=10000\n",
19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Foo",
19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
196103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "bar, baz",  // Space in value.
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
196303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
196403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "connection: keep-alive\n"
196503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Foo: bar\n"
196603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-control: max-age=10000\n"
196703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
196803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
196903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "connection: keep-alive  \n"
197003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Foo: bar, baz\n"
197103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-control: max-age=10000\n",
19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
197303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Foo",
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
197503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "baz",  // Only partial match -> ignored.
19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
197703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
197803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "connection: keep-alive\n"
197903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Foo: bar, baz\n"
198003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-control: max-age=10000\n"
198103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
198203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
198403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(HttpResponseHeaders,
198503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        RemoveIndividualHeaderTest,
198603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        testing::ValuesIn(remove_individual_header_tests));
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
198803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)struct ReplaceStatusTestData {
198903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const char* orig_headers;
199003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const char* new_status;
199103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const char* expected_headers;
199203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
199403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class ReplaceStatusTest
199503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    : public HttpResponseHeadersTest,
199603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      public ::testing::WithParamInterface<ReplaceStatusTestData> {
199703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
199903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_P(ReplaceStatusTest, ReplaceStatus) {
200003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const ReplaceStatusTestData test = GetParam();
20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
200203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string orig_headers(test.orig_headers);
200303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  HeadersToRaw(&orig_headers);
200403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_refptr<net::HttpResponseHeaders> parsed(
200503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      new net::HttpResponseHeaders(orig_headers));
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
200703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string name(test.new_status);
200803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  parsed->ReplaceStatusLine(name);
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
201003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string resulting_headers;
201103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  parsed->GetNormalizedHeaders(&resulting_headers);
201203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(std::string(test.expected_headers), resulting_headers);
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
201503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)const ReplaceStatusTestData replace_status_tests[] = {
201603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 206 Partial Content\n"
201703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "connection: keep-alive\n"
201803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-control: max-age=10000\n"
201903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length: 450\n",
2020a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
202103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK",
2022a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
202303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
202403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "connection: keep-alive\n"
202503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-control: max-age=10000\n"
202603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length: 450\n"
202703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
202803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
202903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "connection: keep-alive\n",
203003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
203103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 304 Not Modified",
203203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
203303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 304 Not Modified\n"
203403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "connection: keep-alive\n"
203503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
203603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
203703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "connection: keep-alive  \n"
203803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length  : 450   \n"
203903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-control: max-age=10000\n",
204003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
204103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1//1 304 Not Modified",
204203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
204303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.0 304 Not Modified\n"
204403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "connection: keep-alive\n"
204503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length: 450\n"
204603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Cache-control: max-age=10000\n"
204703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
204803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
204903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
205003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(HttpResponseHeaders,
205103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        ReplaceStatusTest,
205203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        testing::ValuesIn(replace_status_tests));
205303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
205403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)struct UpdateWithNewRangeTestData {
205503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const char* orig_headers;
205603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const char* expected_headers;
205703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const char* expected_headers_with_replaced_status;
205803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
205903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
206003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class UpdateWithNewRangeTest
206103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    : public HttpResponseHeadersTest,
206203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      public ::testing::WithParamInterface<UpdateWithNewRangeTestData> {
206303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
206403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
206503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_P(UpdateWithNewRangeTest, UpdateWithNewRange) {
206603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const UpdateWithNewRangeTestData test = GetParam();
2067a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2068a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const net::HttpByteRange range = net::HttpByteRange::Bounded(3, 5);
2069a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
207003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string orig_headers(test.orig_headers);
207103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::replace(orig_headers.begin(), orig_headers.end(), '\n', '\0');
207203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_refptr<net::HttpResponseHeaders> parsed(
207303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      new net::HttpResponseHeaders(orig_headers + '\0'));
207403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  int64 content_size = parsed->GetContentLength();
207503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string resulting_headers;
207603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
207703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Update headers without replacing status line.
207803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  parsed->UpdateWithNewRange(range, content_size, false);
207903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  parsed->GetNormalizedHeaders(&resulting_headers);
208003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(std::string(test.expected_headers), resulting_headers);
208103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
208203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Replace status line too.
208303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  parsed->UpdateWithNewRange(range, content_size, true);
208403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  parsed->GetNormalizedHeaders(&resulting_headers);
208503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(std::string(test.expected_headers_with_replaced_status),
208603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)            resulting_headers);
2087a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
2088a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
208903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)const UpdateWithNewRangeTestData update_range_tests[] = {
209003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
209103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length: 450\n",
209203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
209303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
209403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Range: bytes 3-5/450\n"
209503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length: 3\n",
209603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
209703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 206 Partial Content\n"
209803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Range: bytes 3-5/450\n"
209903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length: 3\n",
210003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
210103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  { "HTTP/1.1 200 OK\n"
210203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length: 5\n",
210303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
210403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 200 OK\n"
210503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Range: bytes 3-5/5\n"
210603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length: 3\n",
210703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
210803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "HTTP/1.1 206 Partial Content\n"
210903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Range: bytes 3-5/5\n"
211003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "Content-Length: 3\n",
211103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
211203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
211303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
211403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(HttpResponseHeaders,
211503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        UpdateWithNewRangeTest,
211603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        testing::ValuesIn(update_range_tests));
211703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpResponseHeadersTest, ToNetLogParamAndBackAgain) {
21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string headers("HTTP/1.1 404\n"
21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      "Content-Length: 450\n"
21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      "Connection: keep-alive\n");
21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HeadersToRaw(&headers);
21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::HttpResponseHeaders> parsed(
21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new net::HttpResponseHeaders(headers));
21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> event_param(
21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      parsed->NetLogCallback(net::NetLog::LOG_ALL_BUT_BYTES));
21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::HttpResponseHeaders> recreated;
21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(net::HttpResponseHeaders::FromNetLogParam(event_param.get(),
21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                        &recreated));
21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(recreated.get());
21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(parsed->GetHttpVersion(), recreated->GetHttpVersion());
21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(parsed->response_code(), recreated->response_code());
21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(parsed->GetContentLength(), recreated->GetContentLength());
21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(parsed->IsKeepAlive(), recreated->IsKeepAlive());
21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string normalized_parsed;
21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  parsed->GetNormalizedHeaders(&normalized_parsed);
21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string normalized_recreated;
21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  parsed->GetNormalizedHeaders(&normalized_recreated);
21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(normalized_parsed, normalized_recreated);
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
21455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(HttpResponseHeadersCacheControlTest, AbsentMaxAgeReturnsFalse) {
21465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  InitializeHeadersWithCacheControl("nocache");
21475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(headers()->GetMaxAgeValue(TimeDeltaPointer()));
21485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
21495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
21505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(HttpResponseHeadersCacheControlTest, MaxAgeWithNoParameterRejected) {
21515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  InitializeHeadersWithCacheControl("max-age=,private");
21525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(headers()->GetMaxAgeValue(TimeDeltaPointer()));
21535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
21545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
21555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(HttpResponseHeadersCacheControlTest, MaxAgeWithSpaceParameterRejected) {
21565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  InitializeHeadersWithCacheControl("max-age= ,private");
21575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(headers()->GetMaxAgeValue(TimeDeltaPointer()));
21585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
21595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
21605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(HttpResponseHeadersCacheControlTest,
21615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)       MaxAgeWithSpaceBeforeEqualsIsRejected) {
21625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  InitializeHeadersWithCacheControl("max-age = 7");
21635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(headers()->GetMaxAgeValue(TimeDeltaPointer()));
21645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
21655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
21665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(HttpResponseHeadersCacheControlTest, MaxAgeFirstMatchUsed) {
21675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  InitializeHeadersWithCacheControl("max-age=10, max-age=20");
21685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(TimeDelta::FromSeconds(10), GetMaxAgeValue());
21695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
21705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
21715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(HttpResponseHeadersCacheControlTest, MaxAgeBogusFirstMatchUsed) {
217203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // "max-age10" isn't parsed as "max-age"; "max-age=now" is parsed as
217303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // "max-age=0" and so "max-age=20" is not used.
21745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  InitializeHeadersWithCacheControl("max-age10, max-age=now, max-age=20");
21755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(TimeDelta::FromSeconds(0), GetMaxAgeValue());
21765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
21775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
21785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(HttpResponseHeadersCacheControlTest, MaxAgeCaseInsensitive) {
21795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  InitializeHeadersWithCacheControl("Max-aGe=15");
21805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(TimeDelta::FromSeconds(15), GetMaxAgeValue());
21815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
21825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
218303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)struct MaxAgeTestData {
218403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const char* max_age_string;
218503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const int64 expected_seconds;
218603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
218703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
218803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class MaxAgeEdgeCasesTest
218903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    : public HttpResponseHeadersCacheControlTest,
219003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      public ::testing::WithParamInterface<MaxAgeTestData> {
219103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
219203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
219303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_P(MaxAgeEdgeCasesTest, MaxAgeEdgeCases) {
219403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const MaxAgeTestData test = GetParam();
219503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
21965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::string max_age = "max-age=";
219703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  InitializeHeadersWithCacheControl(
219803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      (max_age + test.max_age_string).c_str());
219903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(test.expected_seconds, GetMaxAgeValue().InSeconds())
220003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      << " for max-age=" << test.max_age_string;
22015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
22025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
220303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)const MaxAgeTestData max_age_tests[] = {
220403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  {" 1 ", 1},    // Spaces are ignored.
220503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  {"-1", -1},    // Negative numbers are passed through.
220603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  {"--1", 0},    // Leading junk gives 0.
220703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  {"2s", 2},     // Trailing junk is ignored.
220803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  {"3 days", 3},
220903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  {"'4'", 0},    // Single quotes don't work.
221003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  {"\"5\"", 0},  // Double quotes don't work.
221103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  {"0x6", 0},    // Hex not parsed as hex.
221203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  {"7F", 7},     // Hex without 0x still not parsed as hex.
221303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  {"010", 10},   // Octal not parsed as octal.
221403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  {"9223372036854", 9223372036854},
221503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  //  {"9223372036855", -9223372036854},  // Undefined behaviour.
221603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  //  {"9223372036854775806", -2},        // Undefined behaviour.
221703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  {"9223372036854775807", 9223372036854775807},
221803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  {"20000000000000000000",
221903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::numeric_limits<int64>::max()},  // Overflow int64.
222003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
222103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
222203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(HttpResponseHeadersCacheControl,
222303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        MaxAgeEdgeCasesTest,
222403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        testing::ValuesIn(max_age_tests));
222503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
22265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(HttpResponseHeadersCacheControlTest,
22275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)       AbsentStaleWhileRevalidateReturnsFalse) {
22285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  InitializeHeadersWithCacheControl("max-age=3600");
22295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(headers()->GetStaleWhileRevalidateValue(TimeDeltaPointer()));
22305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
22315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
22325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(HttpResponseHeadersCacheControlTest,
22335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)       StaleWhileRevalidateWithoutValueRejected) {
22345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  InitializeHeadersWithCacheControl("max-age=3600,stale-while-revalidate=");
22355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(headers()->GetStaleWhileRevalidateValue(TimeDeltaPointer()));
22365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
22375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
22385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(HttpResponseHeadersCacheControlTest,
22395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)       StaleWhileRevalidateWithInvalidValueTreatedAsZero) {
22405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  InitializeHeadersWithCacheControl("max-age=3600,stale-while-revalidate=true");
22415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(TimeDelta(), GetStaleWhileRevalidateValue());
22425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
22435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
22445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(HttpResponseHeadersCacheControlTest, StaleWhileRevalidateValueReturned) {
22455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  InitializeHeadersWithCacheControl("max-age=3600,stale-while-revalidate=7200");
22465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(TimeDelta::FromSeconds(7200), GetStaleWhileRevalidateValue());
22475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
22485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
22495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(HttpResponseHeadersCacheControlTest,
22505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)       FirstStaleWhileRevalidateValueUsed) {
22515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  InitializeHeadersWithCacheControl(
22525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "stale-while-revalidate=1,stale-while-revalidate=7200");
22535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(TimeDelta::FromSeconds(1), GetStaleWhileRevalidateValue());
22545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
225503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
225603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} // end namespace
2257