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", ¤t_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