14a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <algorithm> 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/basictypes.h" 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/pickle.h" 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/time.h" 10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/http/http_response_headers.h" 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing/gtest/include/gtest/gtest.h" 12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace { 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct TestData { 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* raw_headers; 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* expected_headers; 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int expected_response_code; 194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch net::HttpVersion expected_parsed_version; 204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch net::HttpVersion expected_version; 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct ContentTypeTestData { 244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch const std::string raw_headers; 254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch const std::string mime_type; 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const bool has_mimetype; 274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch const std::string charset; 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const bool has_charset; 294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch const std::string all_content_type; 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass HttpResponseHeadersTest : public testing::Test { 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Transform "normal"-looking headers (\n-separated) to the appropriate 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// input format for ParseRawHeaders (\0-separated). 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid HeadersToRaw(std::string* headers) { 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott replace(headers->begin(), headers->end(), '\n', '\0'); 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!headers->empty()) 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *headers += '\0'; 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid TestCommon(const TestData& test) { 444a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::string raw_headers(test.raw_headers); 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HeadersToRaw(&raw_headers); 464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::string expected_headers(test.expected_headers); 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::string headers; 494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch scoped_refptr<net::HttpResponseHeaders> parsed( 504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch new net::HttpResponseHeaders(raw_headers)); 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott parsed->GetNormalizedHeaders(&headers); 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Transform to readable output format (so it's easier to see diffs). 54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott replace(headers.begin(), headers.end(), ' ', '_'); 55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott replace(headers.begin(), headers.end(), '\n', '\\'); 56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott replace(expected_headers.begin(), expected_headers.end(), ' ', '_'); 57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott replace(expected_headers.begin(), expected_headers.end(), '\n', '\\'); 58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(expected_headers, headers); 60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(test.expected_response_code, parsed->response_code()); 62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(test.expected_parsed_version == parsed->GetParsedHttpVersion()); 64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(test.expected_version == parsed->GetHttpVersion()); 65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // end namespace 68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Check that we normalize headers properly. 70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpResponseHeadersTest, NormalizeHeadersWhitespace) { 71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestData test = { 72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 202 Accepted \n" 73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-TYPE : text/html; charset=utf-8 \n" 74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Set-Cookie: a \n" 75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Set-Cookie: b \n", 76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 202 Accepted\n" 78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-TYPE: text/html; charset=utf-8\n" 79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Set-Cookie: a, b\n", 80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 202, 824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch net::HttpVersion(1,1), 834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch net::HttpVersion(1,1) 84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestCommon(test); 86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Check that we normalize headers properly (header name is invalid if starts 89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// with LWS). 90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpResponseHeadersTest, NormalizeHeadersLeadingWhitespace) { 91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestData test = { 92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 202 Accepted \n" 93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Starts with space -- will be skipped as invalid. 94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott " Content-TYPE : text/html; charset=utf-8 \n" 95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Set-Cookie: a \n" 96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Set-Cookie: b \n", 97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 202 Accepted\n" 99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Set-Cookie: a, b\n", 100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 202, 1024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch net::HttpVersion(1,1), 1034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch net::HttpVersion(1,1) 104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestCommon(test); 106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpResponseHeadersTest, BlankHeaders) { 109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestData test = { 110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Header1 : \n" 112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Header2: \n" 113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Header3:\n" 114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Header4\n" 115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Header5 :\n", 116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Header1: \n" 119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Header2: \n" 120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Header3: \n" 121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Header5: \n", 122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 200, 1244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch net::HttpVersion(1,1), 1254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch net::HttpVersion(1,1) 126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestCommon(test); 128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpResponseHeadersTest, NormalizeHeadersVersion) { 131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Don't believe the http/0.9 version if there are headers! 132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestData test = { 133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "hTtP/0.9 201\n" 134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-TYPE: text/html; charset=utf-8\n", 135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.0 201 OK\n" 137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-TYPE: text/html; charset=utf-8\n", 138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 201, 1404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch net::HttpVersion(0,9), 1414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch net::HttpVersion(1,0) 142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestCommon(test); 144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpResponseHeadersTest, PreserveHttp09) { 147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Accept the HTTP/0.9 version number if there are no headers. 148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // This is how HTTP/0.9 responses get constructed from HttpNetworkTransaction. 149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestData test = { 150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "hTtP/0.9 200 OK\n", 151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/0.9 200 OK\n", 153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 200, 1554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch net::HttpVersion(0,9), 1564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch net::HttpVersion(0,9) 157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestCommon(test); 159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpResponseHeadersTest, NormalizeHeadersMissingOK) { 162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestData test = { 163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 201\n" 164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-TYPE: text/html; charset=utf-8\n", 165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 201 OK\n" 167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-TYPE: text/html; charset=utf-8\n", 168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 201, 1704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch net::HttpVersion(1,1), 1714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch net::HttpVersion(1,1) 172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestCommon(test); 174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpResponseHeadersTest, NormalizeHeadersBadStatus) { 177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestData test = { 178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "SCREWED_UP_STATUS_LINE\n" 179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-TYPE: text/html; charset=utf-8\n", 180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.0 200 OK\n" 182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-TYPE: text/html; charset=utf-8\n", 183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 200, 1854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch net::HttpVersion(0,0), // Parse error 1864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch net::HttpVersion(1,0) 187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestCommon(test); 189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpResponseHeadersTest, NormalizeHeadersEmpty) { 192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestData test = { 193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "", 194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.0 200 OK\n", 196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 200, 1984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch net::HttpVersion(0,0), // Parse Error 1994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch net::HttpVersion(1,0) 200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestCommon(test); 202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpResponseHeadersTest, NormalizeHeadersStartWithColon) { 205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestData test = { 206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 202 Accepted \n" 207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "foo: bar\n" 208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ": a \n" 209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott " : b\n" 210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "baz: blat \n", 211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 202 Accepted\n" 213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "foo: bar\n" 214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "baz: blat\n", 215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 202, 2174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch net::HttpVersion(1,1), 2184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch net::HttpVersion(1,1) 219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestCommon(test); 221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpResponseHeadersTest, NormalizeHeadersStartWithColonAtEOL) { 224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestData test = { 225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 202 Accepted \n" 226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "foo: \n" 227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "bar:\n" 228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "baz: blat \n" 229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "zip:\n", 230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 202 Accepted\n" 232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "foo: \n" 233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "bar: \n" 234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "baz: blat\n" 235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "zip: \n", 236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 202, 2384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch net::HttpVersion(1,1), 2394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch net::HttpVersion(1,1) 240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestCommon(test); 242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpResponseHeadersTest, NormalizeHeadersOfWhitepace) { 245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestData test = { 246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "\n \n", 247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.0 200 OK\n", 249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 200, 2514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch net::HttpVersion(0,0), // Parse error 2524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch net::HttpVersion(1,0) 253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestCommon(test); 255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpResponseHeadersTest, RepeatedSetCookie) { 258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestData test = { 259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Set-Cookie: x=1\n" 261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Set-Cookie: y=2\n", 262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Set-Cookie: x=1, y=2\n", 265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 200, 2674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch net::HttpVersion(1,1), 2684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch net::HttpVersion(1,1) 269c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 270c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestCommon(test); 271c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpResponseHeadersTest, GetNormalizedHeader) { 274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string headers = 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "HTTP/1.1 200 OK\n" 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Cache-control: private\n" 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "cache-Control: no-store\n"; 278c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HeadersToRaw(&headers); 2794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch scoped_refptr<net::HttpResponseHeaders> parsed( 2804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch new net::HttpResponseHeaders(headers)); 281c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 282c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string value; 283c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(parsed->GetNormalizedHeader("cache-control", &value)); 284c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ("private, no-store", value); 285c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 286c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 287c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpResponseHeadersTest, Persist) { 288c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const struct { 289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott net::HttpResponseHeaders::PersistOptions options; 290c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* raw_headers; 291c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* expected_headers; 292c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } tests[] = { 293c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { net::HttpResponseHeaders::PERSIST_ALL, 294c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 295c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-control:private\n" 296c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "cache-Control:no-store\n", 297c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 298c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 299c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-control: private, no-store\n" 300c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 301c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { net::HttpResponseHeaders::PERSIST_SANS_HOP_BY_HOP, 302c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 303c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "connection: keep-alive\n" 304c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "server: blah\n", 305c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 306c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 307c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "server: blah\n" 308c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 309c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE | 310c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott net::HttpResponseHeaders::PERSIST_SANS_HOP_BY_HOP, 311c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 312c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "fOo: 1\n" 313c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Foo: 2\n" 314c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Transfer-Encoding: chunked\n" 315c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "CoNnection: keep-alive\n" 316c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "cache-control: private, no-cache=\"foo\"\n", 317c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 318c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 319c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "cache-control: private, no-cache=\"foo\"\n" 320c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 321c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE, 322c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 323c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Foo: 2\n" 324c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-Control: private,no-cache=\"foo, bar\"\n" 325c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "bar", 326c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 327c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 328c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-Control: private,no-cache=\"foo, bar\"\n" 329c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 330c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // ignore bogus no-cache value 331c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE, 332c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 333c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Foo: 2\n" 334c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-Control: private,no-cache=foo\n", 335c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 336c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 337c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Foo: 2\n" 338c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-Control: private,no-cache=foo\n" 339c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 340c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // ignore bogus no-cache value 341c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE, 342c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 343c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Foo: 2\n" 344c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-Control: private, no-cache=\n", 345c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 346c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 347c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Foo: 2\n" 348c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-Control: private, no-cache=\n" 349c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 350c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // ignore empty no-cache value 351c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE, 352c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 353c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Foo: 2\n" 354c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-Control: private, no-cache=\"\"\n", 355c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 356c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 357c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Foo: 2\n" 358c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-Control: private, no-cache=\"\"\n" 359c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 360c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // ignore wrong quotes no-cache value 361c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE, 362c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 363c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Foo: 2\n" 364c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-Control: private, no-cache=\'foo\'\n", 365c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 366c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 367c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Foo: 2\n" 368c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-Control: private, no-cache=\'foo\'\n" 369c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 370c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // ignore unterminated quotes no-cache value 371c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE, 372c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 373c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Foo: 2\n" 374c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-Control: private, no-cache=\"foo\n", 375c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 376c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 377c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Foo: 2\n" 378c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-Control: private, no-cache=\"foo\n" 379c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 380c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // accept sloppy LWS 381c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE, 382c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 383c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Foo: 2\n" 384c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-Control: private, no-cache=\" foo\t, bar\"\n", 385c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 386c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 387c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-Control: private, no-cache=\" foo\t, bar\"\n" 388c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 389c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // header name appears twice, separated by another header 390c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { net::HttpResponseHeaders::PERSIST_ALL, 391c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 392c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Foo: 1\n" 393c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Bar: 2\n" 394c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Foo: 3\n", 395c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 396c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 397c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Foo: 1, 3\n" 398c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Bar: 2\n" 399c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 400c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // header name appears twice, separated by another header (type 2) 401c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { net::HttpResponseHeaders::PERSIST_ALL, 402c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 403c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Foo: 1, 3\n" 404c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Bar: 2\n" 405c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Foo: 4\n", 406c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 407c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 408c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Foo: 1, 3, 4\n" 409c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Bar: 2\n" 410c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 411c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Test filtering of cookie headers. 412c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { net::HttpResponseHeaders::PERSIST_SANS_COOKIES, 413c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 414c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Set-Cookie: foo=bar; httponly\n" 415c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Set-Cookie: bar=foo\n" 416c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Bar: 1\n" 417c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Set-Cookie2: bar2=foo2\n", 418c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 419c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 420c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Bar: 1\n" 421c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 422c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Test LWS at the end of a header. 423c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { net::HttpResponseHeaders::PERSIST_ALL, 424c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 425c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Length: 450 \n" 426c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Encoding: gzip\n", 427c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 428c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 429c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Length: 450\n" 430c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Encoding: gzip\n" 431c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 432c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Test LWS at the end of a header. 433c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { net::HttpResponseHeaders::PERSIST_RAW, 434c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 435c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Length: 450 \n" 436c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Encoding: gzip\n", 437c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 438c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 439c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Length: 450\n" 440c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Encoding: gzip\n" 441c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 442c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 443c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 444c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 445c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string headers = tests[i].raw_headers; 446c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HeadersToRaw(&headers); 4474a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch scoped_refptr<net::HttpResponseHeaders> parsed1( 4484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch new net::HttpResponseHeaders(headers)); 449c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 450c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Pickle pickle; 451c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott parsed1->Persist(&pickle, tests[i].options); 452c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 453c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void* iter = NULL; 4544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch scoped_refptr<net::HttpResponseHeaders> parsed2( 4554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch new net::HttpResponseHeaders(pickle, &iter)); 456c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 457c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string h2; 458c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott parsed2->GetNormalizedHeaders(&h2); 4594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch EXPECT_EQ(std::string(tests[i].expected_headers), h2); 460c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 461c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 462c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 463c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpResponseHeadersTest, EnumerateHeader_Coalesced) { 464c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Ensure that commas in quoted strings are not regarded as value separators. 465c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Ensure that whitespace following a value is trimmed properly 466c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string headers = 467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "HTTP/1.1 200 OK\n" 468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Cache-control:private , no-cache=\"set-cookie,server\" \n" 469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "cache-Control: no-store\n"; 470c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HeadersToRaw(&headers); 4714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch scoped_refptr<net::HttpResponseHeaders> parsed( 4724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch new net::HttpResponseHeaders(headers)); 473c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 474c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void* iter = NULL; 475c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string value; 476c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(parsed->EnumerateHeader(&iter, "cache-control", &value)); 477c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ("private", value); 478c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(parsed->EnumerateHeader(&iter, "cache-control", &value)); 479c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ("no-cache=\"set-cookie,server\"", value); 480c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(parsed->EnumerateHeader(&iter, "cache-control", &value)); 481c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ("no-store", value); 482c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_FALSE(parsed->EnumerateHeader(&iter, "cache-control", &value)); 483c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 484c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 485c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpResponseHeadersTest, EnumerateHeader_Challenge) { 486c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Even though WWW-Authenticate has commas, it should not be treated as 487c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // coalesced values. 488c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string headers = 489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "HTTP/1.1 401 OK\n" 490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "WWW-Authenticate:Digest realm=foobar, nonce=x, domain=y\n" 491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "WWW-Authenticate:Basic realm=quatar\n"; 492c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HeadersToRaw(&headers); 4934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch scoped_refptr<net::HttpResponseHeaders> parsed( 4944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch new net::HttpResponseHeaders(headers)); 495c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 496c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void* iter = NULL; 497c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string value; 498c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(parsed->EnumerateHeader(&iter, "WWW-Authenticate", &value)); 499c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ("Digest realm=foobar, nonce=x, domain=y", value); 500c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(parsed->EnumerateHeader(&iter, "WWW-Authenticate", &value)); 501c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ("Basic realm=quatar", value); 502c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_FALSE(parsed->EnumerateHeader(&iter, "WWW-Authenticate", &value)); 503c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 504c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 505c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpResponseHeadersTest, EnumerateHeader_DateValued) { 506c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The comma in a date valued header should not be treated as a 507c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // field-value separator 508c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string headers = 509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "HTTP/1.1 200 OK\n" 510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Date: Tue, 07 Aug 2007 23:10:55 GMT\n" 511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Last-Modified: Wed, 01 Aug 2007 23:23:45 GMT\n"; 512c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HeadersToRaw(&headers); 5134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch scoped_refptr<net::HttpResponseHeaders> parsed( 5144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch new net::HttpResponseHeaders(headers)); 515c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 516c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string value; 517c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(parsed->EnumerateHeader(NULL, "date", &value)); 518c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ("Tue, 07 Aug 2007 23:10:55 GMT", value); 519c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(parsed->EnumerateHeader(NULL, "last-modified", &value)); 520c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ("Wed, 01 Aug 2007 23:23:45 GMT", value); 521c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 522c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 523c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpResponseHeadersTest, GetMimeType) { 524c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const ContentTypeTestData tests[] = { 525c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 526c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Content-type: text/html\n", 527c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "text/html", true, 528c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "", false, 529c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "text/html" }, 530c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Multiple content-type headers should give us the last one. 531c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 532c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Content-type: text/html\n" 533c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Content-type: text/html\n", 534c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "text/html", true, 535c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "", false, 536c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "text/html, text/html" }, 537c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 538c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Content-type: text/plain\n" 539c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Content-type: text/html\n" 540c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Content-type: text/plain\n" 541c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Content-type: text/html\n", 542c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "text/html", true, 543c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "", false, 544c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "text/plain, text/html, text/plain, text/html" }, 545c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Test charset parsing. 546c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 547c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Content-type: text/html\n" 548c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Content-type: text/html; charset=ISO-8859-1\n", 549c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "text/html", true, 550c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "iso-8859-1", true, 551c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "text/html, text/html; charset=ISO-8859-1" }, 552c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Test charset in double quotes. 553c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Content-type: text/html\n" 555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Content-type: text/html; charset=\"ISO-8859-1\"\n", 556c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "text/html", true, 557c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "iso-8859-1", true, 558c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "text/html, text/html; charset=\"ISO-8859-1\"" }, 559c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // If there are multiple matching content-type headers, we carry 560c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // over the charset value. 561c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 562c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Content-type: text/html;charset=utf-8\n" 563c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Content-type: text/html\n", 564c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "text/html", true, 565c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "utf-8", true, 566c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "text/html;charset=utf-8, text/html" }, 567c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Test single quotes. 568c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 569c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Content-type: text/html;charset='utf-8'\n" 570c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Content-type: text/html\n", 571c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "text/html", true, 572c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "utf-8", true, 573c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "text/html;charset='utf-8', text/html" }, 574c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Last charset wins if matching content-type. 575c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Content-type: text/html;charset=utf-8\n" 577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Content-type: text/html;charset=iso-8859-1\n", 578c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "text/html", true, 579c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "iso-8859-1", true, 580c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "text/html;charset=utf-8, text/html;charset=iso-8859-1" }, 581c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Charset is ignored if the content types change. 582c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 583c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Content-type: text/plain;charset=utf-8\n" 584c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Content-type: text/html\n", 585c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "text/html", true, 586c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "", false, 587c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "text/plain;charset=utf-8, text/html" }, 588c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Empty content-type 589c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 590c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Content-type: \n", 591c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "", false, 592c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "", false, 593c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "" }, 594c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Emtpy charset 595c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 596c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Content-type: text/html;charset=\n", 597c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "text/html", true, 598c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "", false, 599c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "text/html;charset=" }, 600c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Multiple charsets, last one wins. 601c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 602c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Content-type: text/html;charset=utf-8; charset=iso-8859-1\n", 603c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "text/html", true, 604c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "iso-8859-1", true, 605c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "text/html;charset=utf-8; charset=iso-8859-1" }, 606c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Multiple params. 607c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 608c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Content-type: text/html; foo=utf-8; charset=iso-8859-1\n", 609c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "text/html", true, 610c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "iso-8859-1", true, 611c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "text/html; foo=utf-8; charset=iso-8859-1" }, 612c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 613c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Content-type: text/html ; charset=utf-8 ; bar=iso-8859-1\n", 614c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "text/html", true, 615c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "utf-8", true, 616c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "text/html ; charset=utf-8 ; bar=iso-8859-1" }, 617c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Comma embeded in quotes. 618c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 619c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Content-type: text/html ; charset='utf-8,text/plain' ;\n", 620c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "text/html", true, 621c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "utf-8,text/plain", true, 622c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "text/html ; charset='utf-8,text/plain' ;" }, 623c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Charset with leading spaces. 624c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 625c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Content-type: text/html ; charset= 'utf-8' ;\n", 626c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "text/html", true, 627c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "utf-8", true, 628c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "text/html ; charset= 'utf-8' ;" }, 629c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Media type comments in mime-type. 630c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 631c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Content-type: text/html (html)\n", 632c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "text/html", true, 633c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "", false, 634c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "text/html (html)" }, 635c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Incomplete charset= param 636c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 637c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Content-type: text/html; char=\n", 638c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "text/html", true, 639c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "", false, 640c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "text/html; char=" }, 641c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Invalid media type: no slash 642c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 643c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Content-type: texthtml\n", 644c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "", false, 645c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "", false, 646c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "texthtml" }, 647c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Invalid media type: */* 648c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 649c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Content-type: */*\n", 650c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "", false, 651c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "", false, 652c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "*/*" }, 653c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 654c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 655c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (size_t i = 0; i < arraysize(tests); ++i) { 6564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::string headers(tests[i].raw_headers); 657c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HeadersToRaw(&headers); 6584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch scoped_refptr<net::HttpResponseHeaders> parsed( 6594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch new net::HttpResponseHeaders(headers)); 660c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 661c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string value; 662c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(tests[i].has_mimetype, parsed->GetMimeType(&value)); 663c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(tests[i].mime_type, value); 664c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott value.clear(); 665c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(tests[i].has_charset, parsed->GetCharset(&value)); 666c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(tests[i].charset, value); 667c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(parsed->GetNormalizedHeader("content-type", &value)); 668c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(tests[i].all_content_type, value); 669c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 670c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 671c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 672c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpResponseHeadersTest, RequiresValidation) { 673c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const struct { 674c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* headers; 675c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool requires_validation; 676c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } tests[] = { 677c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // no expiry info: expires immediately 678c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 679c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "\n", 680c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott true 681c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 682c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // valid for a little while 683c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 684c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "cache-control: max-age=10000\n" 685c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "\n", 686c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false 687c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 688c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // expires in the future 689c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 690c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "date: Wed, 28 Nov 2007 00:40:11 GMT\n" 691c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "expires: Wed, 28 Nov 2007 01:00:00 GMT\n" 692c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "\n", 693c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false 694c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 695c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // expired already 696c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 697c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "date: Wed, 28 Nov 2007 00:40:11 GMT\n" 698c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "expires: Wed, 28 Nov 2007 00:00:00 GMT\n" 699c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "\n", 700c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott true 701c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 702c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // max-age trumps expires 703c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 704c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "date: Wed, 28 Nov 2007 00:40:11 GMT\n" 705c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "expires: Wed, 28 Nov 2007 00:00:00 GMT\n" 706c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "cache-control: max-age=10000\n" 707c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "\n", 708c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false 709c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 710c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // last-modified heuristic: modified a while ago 711c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 712c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "date: Wed, 28 Nov 2007 00:40:11 GMT\n" 713c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "last-modified: Wed, 27 Nov 2007 08:00:00 GMT\n" 714c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "\n", 715c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false 716c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 717c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 203 Non-Authoritative Information\n" 718c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "date: Wed, 28 Nov 2007 00:40:11 GMT\n" 719c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "last-modified: Wed, 27 Nov 2007 08:00:00 GMT\n" 720c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "\n", 721c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false 722c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 723c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 206 Partial Content\n" 724c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "date: Wed, 28 Nov 2007 00:40:11 GMT\n" 725c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "last-modified: Wed, 27 Nov 2007 08:00:00 GMT\n" 726c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "\n", 727c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false 728c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 729c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // last-modified heuristic: modified recently 730c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 731c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "date: Wed, 28 Nov 2007 00:40:11 GMT\n" 732c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "last-modified: Wed, 28 Nov 2007 00:40:10 GMT\n" 733c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "\n", 734c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott true 735c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 736c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 203 Non-Authoritative Information\n" 737c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "date: Wed, 28 Nov 2007 00:40:11 GMT\n" 738c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "last-modified: Wed, 28 Nov 2007 00:40:10 GMT\n" 739c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "\n", 740c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott true 741c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 742c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 206 Partial Content\n" 743c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "date: Wed, 28 Nov 2007 00:40:11 GMT\n" 744c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "last-modified: Wed, 28 Nov 2007 00:40:10 GMT\n" 745c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "\n", 746c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott true 747c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 748c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // cached permanent redirect 749c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 301 Moved Permanently\n" 750c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "\n", 751c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false 752c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 753c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // cached redirect: not reusable even though by default it would be 754c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 300 Multiple Choices\n" 755c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-Control: no-cache\n" 756c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "\n", 757c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott true 758c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 759c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // cached forever by default 760c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 410 Gone\n" 761c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "\n", 762c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false 763c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 764c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // cached temporary redirect: not reusable 765c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 302 Found\n" 766c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "\n", 767c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott true 768c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 769c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // cached temporary redirect: reusable 770c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 302 Found\n" 771c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "cache-control: max-age=10000\n" 772c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "\n", 773c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false 774c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 775c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // cache-control: max-age=N overrides expires: date in the past 776c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 777c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "date: Wed, 28 Nov 2007 00:40:11 GMT\n" 778c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "expires: Wed, 28 Nov 2007 00:20:11 GMT\n" 779c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "cache-control: max-age=10000\n" 780c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "\n", 781c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false 782c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 783c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // cache-control: no-store overrides expires: in the future 784c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 785c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "date: Wed, 28 Nov 2007 00:40:11 GMT\n" 786c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "expires: Wed, 29 Nov 2007 00:40:11 GMT\n" 787c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "cache-control: no-store,private,no-cache=\"foo\"\n" 788c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "\n", 789c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott true 790c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 791c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // pragma: no-cache overrides last-modified heuristic 792c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 793c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "date: Wed, 28 Nov 2007 00:40:11 GMT\n" 794c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "last-modified: Wed, 27 Nov 2007 08:00:00 GMT\n" 795c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "pragma: no-cache\n" 796c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "\n", 797c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott true 798c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 799c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // TODO(darin): add many many more tests here 800c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 8014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch base::Time request_time, response_time, current_time; 8024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch base::Time::FromString(L"Wed, 28 Nov 2007 00:40:09 GMT", &request_time); 8034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch base::Time::FromString(L"Wed, 28 Nov 2007 00:40:12 GMT", &response_time); 8044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch base::Time::FromString(L"Wed, 28 Nov 2007 00:45:20 GMT", ¤t_time); 805c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 806c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 8074a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::string headers(tests[i].headers); 808c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HeadersToRaw(&headers); 8094a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch scoped_refptr<net::HttpResponseHeaders> parsed( 8104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch new net::HttpResponseHeaders(headers)); 811c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 812c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool requires_validation = 813c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott parsed->RequiresValidation(request_time, response_time, current_time); 814c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(tests[i].requires_validation, requires_validation); 815c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 816c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 817c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 818c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpResponseHeadersTest, Update) { 819c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const struct { 820c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* orig_headers; 821c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* new_headers; 822c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* expected_headers; 823c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } tests[] = { 824c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n", 825c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 826c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1/1 304 Not Modified\n" 827c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "connection: keep-alive\n" 828c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-control: max-age=10000\n", 829c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 830c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 831c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-control: max-age=10000\n" 832c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 833c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 834c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Foo: 1\n" 835c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-control: private\n", 836c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 837c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1/1 304 Not Modified\n" 838c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "connection: keep-alive\n" 839c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-control: max-age=10000\n", 840c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 841c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 842c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-control: max-age=10000\n" 843c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Foo: 1\n" 844c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 845c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 846c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Foo: 1\n" 847c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-control: private\n", 848c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 849c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1/1 304 Not Modified\n" 850c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "connection: keep-alive\n" 851c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-CONTROL: max-age=10000\n", 852c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 853c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 854c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-CONTROL: max-age=10000\n" 855c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Foo: 1\n" 856c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 857c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 858c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Length: 450\n", 859c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 860c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1/1 304 Not Modified\n" 861c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "connection: keep-alive\n" 862c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-control: max-age=10001 \n", 863c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 864c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 865c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-control: max-age=10001\n" 866c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Length: 450\n" 867c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 868c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 869c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 870c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 8714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::string orig_headers(tests[i].orig_headers); 872c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HeadersToRaw(&orig_headers); 8734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch scoped_refptr<net::HttpResponseHeaders> parsed( 8744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch new net::HttpResponseHeaders(orig_headers)); 875c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 8764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::string new_headers(tests[i].new_headers); 877c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HeadersToRaw(&new_headers); 8784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch scoped_refptr<net::HttpResponseHeaders> new_parsed( 8794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch new net::HttpResponseHeaders(new_headers)); 880c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 881c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott parsed->Update(*new_parsed); 882c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 8834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::string resulting_headers; 884c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott parsed->GetNormalizedHeaders(&resulting_headers); 8854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch EXPECT_EQ(std::string(tests[i].expected_headers), resulting_headers); 886c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 887c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 888c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 889c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpResponseHeadersTest, EnumerateHeaderLines) { 890c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const struct { 891c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* headers; 892c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* expected_lines; 893c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } tests[] = { 894c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n", 895c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 896c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "" 897c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 898c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 899c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Foo: 1\n", 900c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 901c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Foo: 1\n" 902c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 903c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 904c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Foo: 1\n" 905c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Bar: 2\n" 906c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Foo: 3\n", 907c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 908c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Foo: 1\nBar: 2\nFoo: 3\n" 909c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 910c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 911c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Foo: 1, 2, 3\n", 912c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 913c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Foo: 1, 2, 3\n" 914c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 915c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 916c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 9174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::string headers(tests[i].headers); 918c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HeadersToRaw(&headers); 9194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch scoped_refptr<net::HttpResponseHeaders> parsed( 9204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch new net::HttpResponseHeaders(headers)); 921c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 9224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::string name, value, lines; 923c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 924c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void* iter = NULL; 925c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while (parsed->EnumerateHeaderLines(&iter, &name, &value)) { 926c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott lines.append(name); 927c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott lines.append(": "); 928c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott lines.append(value); 929c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott lines.append("\n"); 930c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 931c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 9324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch EXPECT_EQ(std::string(tests[i].expected_lines), lines); 933c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 934c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 935c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 936c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpResponseHeadersTest, IsRedirect) { 937c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const struct { 938c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* headers; 939c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* location; 940c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool is_redirect; 941c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } tests[] = { 942c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n", 943c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "", 944c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false 945c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 946c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 301 Moved\n" 947c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Location: http://foopy/\n", 948c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "http://foopy/", 949c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott true 950c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 951c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 301 Moved\n" 952c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Location: \t \n", 953c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "", 954c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false 955c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 956c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // we use the first location header as the target of the redirect 957c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 301 Moved\n" 958c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Location: http://foo/\n" 959c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Location: http://bar/\n", 960c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "http://foo/", 961c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott true 962c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 963c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // we use the first _valid_ location header as the target of the redirect 964c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 301 Moved\n" 965c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Location: \n" 966c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Location: http://bar/\n", 967c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "http://bar/", 968c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott true 969c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 970c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // bug 1050541 (location header w/ an unescaped comma) 971c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 301 Moved\n" 972c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Location: http://foo/bar,baz.html\n", 973c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "http://foo/bar,baz.html", 974c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott true 975c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 976c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // bug 1224617 (location header w/ non-ASCII bytes) 977c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 301 Moved\n" 978c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Location: http://foo/bar?key=\xE4\xF6\xFC\n", 979c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "http://foo/bar?key=%E4%F6%FC", 980c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott true 981c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 982c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Shift_JIS, Big5, and GBK contain multibyte characters with the trailing 983c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // byte falling in the ASCII range. 984c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 301 Moved\n" 985c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Location: http://foo/bar?key=\x81\x5E\xD8\xBF\n", 986c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "http://foo/bar?key=%81^%D8%BF", 987c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott true 988c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 989c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 301 Moved\n" 990c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Location: http://foo/bar?key=\x82\x40\xBD\xC4\n", 991c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "http://foo/bar?key=%82@%BD%C4", 992c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott true 993c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 994c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 301 Moved\n" 995c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Location: http://foo/bar?key=\x83\x5C\x82\x5D\xCB\xD7\n", 996c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "http://foo/bar?key=%83\\%82]%CB%D7", 997c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott true 998c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 999c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 1000c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 10014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::string headers(tests[i].headers); 1002c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HeadersToRaw(&headers); 10034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch scoped_refptr<net::HttpResponseHeaders> parsed( 10044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch new net::HttpResponseHeaders(headers)); 1005c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1006c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string location; 1007c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(parsed->IsRedirect(&location), tests[i].is_redirect); 1008c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(location, tests[i].location); 1009c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1010c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1011c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1012c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpResponseHeadersTest, GetContentLength) { 1013c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const struct { 1014c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* headers; 1015c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int64 expected_len; 1016c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } tests[] = { 1017c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n", 1018c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1 1019c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1020c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 1021c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Length: 10\n", 1022c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 10 1023c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1024c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 1025c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Length: \n", 1026c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1 1027c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1028c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 1029c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Length: abc\n", 1030c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1 1031c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1032c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 1033c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Length: -10\n", 1034c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1 1035c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1036c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 1037c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Length: +10\n", 1038c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1 1039c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1040c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 1041c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Length: 23xb5\n", 1042c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1 1043c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1044c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 1045c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Length: 0xA\n", 1046c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1 1047c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1048c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 1049c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Length: 010\n", 1050c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 10 1051c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1052c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Content-Length too big, will overflow an int64 1053c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 1054c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Length: 40000000000000000000\n", 1055c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1 1056c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1057c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 1058c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Length: 10\n", 1059c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 10 1060c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1061c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 1062c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Length: 10 \n", 1063c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 10 1064c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1065c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 1066c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Length: \t10\n", 1067c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 10 1068c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1069c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 1070c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Length: \v10\n", 1071c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1 1072c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1073c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 1074c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Length: \f10\n", 1075c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1 1076c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1077c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 1078c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "cOnTeNt-LENgth: 33\n", 1079c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 33 1080c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1081c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 1082c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Length: 34\r\n", 1083c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1 1084c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1085c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 1086c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 10874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::string headers(tests[i].headers); 1088c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HeadersToRaw(&headers); 10894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch scoped_refptr<net::HttpResponseHeaders> parsed( 10904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch new net::HttpResponseHeaders(headers)); 1091c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1092c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(tests[i].expected_len, parsed->GetContentLength()); 1093c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1094c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1095c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1096c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpResponseHeaders, GetContentRange) { 1097c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const struct { 1098c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* headers; 1099c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool expected_return_value; 1100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int64 expected_first_byte_position; 1101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int64 expected_last_byte_position; 1102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int64 expected_instance_size; 1103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } tests[] = { 1104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 206 Partial Content", 1105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false, 1106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1, 1107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1, 1108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1 1109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 206 Partial Content\n" 1111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Range:", 1112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false, 1113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1, 1114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1, 1115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1 1116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 206 Partial Content\n" 1118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Range: megabytes 0-10/50", 1119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false, 1120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1, 1121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1, 1122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1 1123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 206 Partial Content\n" 1125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Range: 0-10/50", 1126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false, 1127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1, 1128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1, 1129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1 1130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 206 Partial Content\n" 1132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Range: Bytes 0-50/51", 1133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott true, 1134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0, 1135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 50, 1136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 51 1137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 206 Partial Content\n" 1139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Range: bytes 0-50/51", 1140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott true, 1141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0, 1142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 50, 1143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 51 1144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 206 Partial Content\n" 1146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Range: bytes\t0-50/51", 1147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false, 1148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1, 1149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1, 1150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1 1151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 206 Partial Content\n" 1153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Range: bytes 0-50/51", 1154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott true, 1155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0, 1156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 50, 1157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 51 1158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 206 Partial Content\n" 1160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Range: bytes 0 - 50 \t / \t51", 1161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott true, 1162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0, 1163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 50, 1164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 51 1165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 206 Partial Content\n" 1167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Range: bytes 0\t-\t50\t/\t51\t", 1168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott true, 1169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0, 1170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 50, 1171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 51 1172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 206 Partial Content\n" 1174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Range: \tbytes\t\t\t 0\t-\t50\t/\t51\t", 1175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott true, 1176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0, 1177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 50, 1178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 51 1179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 206 Partial Content\n" 1181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Range: \t bytes \t 0 - 50 / 5 1", 1182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false, 1183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0, 1184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 50, 1185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1 1186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 206 Partial Content\n" 1188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Range: \t bytes \t 0 - 5 0 / 51", 1189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false, 1190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1, 1191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1, 1192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1 1193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 206 Partial Content\n" 1195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Range: bytes 50-0/51", 1196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false, 1197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 50, 1198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0, 1199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1 1200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 416 Requested range not satisfiable\n" 1202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Range: bytes * /*", 1203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false, 1204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1, 1205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1, 1206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1 1207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 416 Requested range not satisfiable\n" 1209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Range: bytes * / * ", 1210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false, 1211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1, 1212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1, 1213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1 1214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 206 Partial Content\n" 1216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Range: bytes 0-50/*", 1217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false, 1218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0, 1219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 50, 1220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1 1221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 206 Partial Content\n" 1223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Range: bytes 0-50 / * ", 1224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false, 1225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0, 1226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 50, 1227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1 1228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 206 Partial Content\n" 1230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Range: bytes 0-10000000000/10000000001", 1231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott true, 1232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0, 1233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 10000000000ll, 1234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 10000000001ll 1235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 206 Partial Content\n" 1237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Range: bytes 0-10000000000/10000000000", 1238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false, 1239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0, 1240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 10000000000ll, 1241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 10000000000ll 1242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 64 bits wraparound. 1244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 206 Partial Content\n" 1245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Range: bytes 0 - 9223372036854775807 / 100", 1246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false, 1247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0, 1248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott kint64max, 1249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 100 1250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 64 bits wraparound. 1252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 206 Partial Content\n" 1253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Range: bytes 0 - 100 / -9223372036854775808", 1254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false, 1255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0, 1256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 100, 1257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott kint64min 1258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 206 Partial Content\n" 1260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Range: bytes */50", 1261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false, 1262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1, 1263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1, 1264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 50 1265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 206 Partial Content\n" 1267c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Range: bytes 0-50/10", 1268c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false, 1269c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0, 1270c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 50, 1271c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 10 1272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 206 Partial Content\n" 1274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Range: bytes 40-50/45", 1275c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false, 1276c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 40, 1277c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 50, 1278c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 45 1279c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 206 Partial Content\n" 1281c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Range: bytes 0-50/-10", 1282c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false, 1283c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0, 1284c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 50, 1285c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -10 1286c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1287c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 206 Partial Content\n" 1288c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Range: bytes 0-0/1", 1289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott true, 1290c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0, 1291c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0, 1292c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1 1293c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1294c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 206 Partial Content\n" 1295c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Range: bytes 0-40000000000000000000/40000000000000000001", 1296c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false, 1297c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1, 1298c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1, 1299c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1 1300c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1301c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 206 Partial Content\n" 1302c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Range: bytes 1-/100", 1303c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false, 1304c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1, 1305c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1, 1306c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1 1307c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1308c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 206 Partial Content\n" 1309c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Range: bytes -/100", 1310c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false, 1311c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1, 1312c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1, 1313c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1 1314c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1315c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 206 Partial Content\n" 1316c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Range: bytes -1/100", 1317c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false, 1318c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1, 1319c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1, 1320c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1 1321c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1322c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 206 Partial Content\n" 1323c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Range: bytes 0-1233/*", 1324c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false, 1325c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0, 1326c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1233, 1327c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1 1328c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1329c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 206 Partial Content\n" 1330c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Range: bytes -123 - -1/100", 1331c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false, 1332c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1, 1333c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1, 1334c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1 1335c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1336c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 1337c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 13384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::string headers(tests[i].headers); 1339c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HeadersToRaw(&headers); 13404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch scoped_refptr<net::HttpResponseHeaders> parsed( 13414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch new net::HttpResponseHeaders(headers)); 1342c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1343c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int64 first_byte_position; 1344c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int64 last_byte_position; 1345c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int64 instance_size; 1346c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool return_value = parsed->GetContentRange(&first_byte_position, 1347c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott &last_byte_position, 1348c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott &instance_size); 1349c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(tests[i].expected_return_value, return_value); 1350c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(tests[i].expected_first_byte_position, first_byte_position); 1351c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(tests[i].expected_last_byte_position, last_byte_position); 1352c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(tests[i].expected_instance_size, instance_size); 1353c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1354c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1355c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1356c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpResponseHeadersTest, IsKeepAlive) { 1357c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const struct { 1358c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* headers; 1359c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool expected_keep_alive; 1360c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } tests[] = { 1361c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The status line fabricated by HttpNetworkTransaction for a 0.9 response. 1362c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Treated as 0.9. 1363c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/0.9 200 OK", 1364c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false 1365c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1366c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // This could come from a broken server. Treated as 1.0 because it has a 1367c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // header. 1368c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/0.9 200 OK\n" 1369c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "connection: keep-alive\n", 1370c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott true 1371c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1372c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n", 1373c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott true 1374c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1375c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.0 200 OK\n", 1376c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false 1377c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1378c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.0 200 OK\n" 1379c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "connection: close\n", 1380c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false 1381c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1382c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.0 200 OK\n" 1383c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "connection: keep-alive\n", 1384c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott true 1385c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1386c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.0 200 OK\n" 1387c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "connection: kEeP-AliVe\n", 1388c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott true 1389c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1390c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.0 200 OK\n" 1391c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "connection: keep-aliveX\n", 1392c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false 1393c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1394c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 1395c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "connection: close\n", 1396c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false 1397c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1398c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 1399c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "connection: keep-alive\n", 1400c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott true 1401c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1402c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.0 200 OK\n" 1403c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "proxy-connection: close\n", 1404c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false 1405c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1406c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.0 200 OK\n" 1407c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "proxy-connection: keep-alive\n", 1408c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott true 1409c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1410c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 1411c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "proxy-connection: close\n", 1412c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false 1413c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1414c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 1415c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "proxy-connection: keep-alive\n", 1416c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott true 1417c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1418c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 1419c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 14204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::string headers(tests[i].headers); 1421c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HeadersToRaw(&headers); 14224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch scoped_refptr<net::HttpResponseHeaders> parsed( 14234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch new net::HttpResponseHeaders(headers)); 1424c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1425c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(tests[i].expected_keep_alive, parsed->IsKeepAlive()); 1426c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1427c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1428c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1429c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpResponseHeadersTest, HasStrongValidators) { 1430c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const struct { 1431c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* headers; 1432c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool expected_result; 1433c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } tests[] = { 1434c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/0.9 200 OK", 1435c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false 1436c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1437c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/0.9 200 OK\n" 1438c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Date: Wed, 28 Nov 2007 01:40:10 GMT\n" 1439c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Last-Modified: Wed, 28 Nov 2007 00:40:10 GMT\n" 1440c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "ETag: \"foo\"\n", 1441c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott true 1442c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1443c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 1444c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Date: Wed, 28 Nov 2007 00:41:10 GMT\n" 1445c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Last-Modified: Wed, 28 Nov 2007 00:40:10 GMT\n", 1446c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott true 1447c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1448c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 1449c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Date: Wed, 28 Nov 2007 00:41:09 GMT\n" 1450c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Last-Modified: Wed, 28 Nov 2007 00:40:10 GMT\n", 1451c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false 1452c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1453c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 1454c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "ETag: \"foo\"\n", 1455c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott true 1456c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1457c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // This is not really a weak etag: 1458c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 1459c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "etag: \"w/foo\"\n", 1460c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott true 1461c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1462c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // This is a weak etag: 1463c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 1464c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "etag: w/\"foo\"\n", 1465c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false 1466c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1467c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 1468c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "etag: W / \"foo\"\n", 1469c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false 1470c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1471c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 1472c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 14734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::string headers(tests[i].headers); 1474c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HeadersToRaw(&headers); 14754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch scoped_refptr<net::HttpResponseHeaders> parsed( 14764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch new net::HttpResponseHeaders(headers)); 1477c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1478c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(tests[i].expected_result, parsed->HasStrongValidators()) << 1479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Failed test case " << i; 1480c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1481c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1482c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1483c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpResponseHeadersTest, GetStatusText) { 1484c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string headers("HTTP/1.1 404 Not Found"); 1485c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HeadersToRaw(&headers); 14864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch scoped_refptr<net::HttpResponseHeaders> parsed( 14874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch new net::HttpResponseHeaders(headers)); 1488c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(std::string("Not Found"), parsed->GetStatusText()); 1489c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1490c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1491c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpResponseHeadersTest, GetStatusTextMissing) { 1492c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string headers("HTTP/1.1 404"); 1493c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HeadersToRaw(&headers); 14944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch scoped_refptr<net::HttpResponseHeaders> parsed( 14954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch new net::HttpResponseHeaders(headers)); 1496c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Since the status line gets normalized, we have OK 1497c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(std::string("OK"), parsed->GetStatusText()); 1498c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1499c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1500c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpResponseHeadersTest, GetStatusTextMultiSpace) { 1501c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string headers("HTTP/1.0 404 Not Found"); 1502c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HeadersToRaw(&headers); 15034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch scoped_refptr<net::HttpResponseHeaders> parsed( 15044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch new net::HttpResponseHeaders(headers)); 1505c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(std::string("Not Found"), parsed->GetStatusText()); 1506c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1507c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1508c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpResponseHeadersTest, GetStatusBadStatusLine) { 1509c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string headers("Foo bar."); 1510c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HeadersToRaw(&headers); 15114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch scoped_refptr<net::HttpResponseHeaders> parsed( 15124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch new net::HttpResponseHeaders(headers)); 1513c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The bad status line would have gotten rewritten as 1514c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // HTTP/1.0 200 OK. 1515c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(std::string("OK"), parsed->GetStatusText()); 1516c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1517c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1518c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpResponseHeadersTest, AddHeader) { 1519c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const struct { 1520c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* orig_headers; 1521c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* new_header; 1522c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* expected_headers; 1523c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } tests[] = { 1524c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 1525c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "connection: keep-alive\n" 1526c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-control: max-age=10000\n", 1527c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1528c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Length: 450", 1529c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1530c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 1531c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "connection: keep-alive\n" 1532c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-control: max-age=10000\n" 1533c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Length: 450\n" 1534c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1535c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 1536c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "connection: keep-alive\n" 1537c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-control: max-age=10000 \n", 1538c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1539c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Length: 450 ", 1540c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1541c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 1542c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "connection: keep-alive\n" 1543c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-control: max-age=10000\n" 1544c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Length: 450\n" 1545c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1546c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 1547c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1548c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 15494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::string orig_headers(tests[i].orig_headers); 1550c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HeadersToRaw(&orig_headers); 15514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch scoped_refptr<net::HttpResponseHeaders> parsed( 15524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch new net::HttpResponseHeaders(orig_headers)); 1553c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 15544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::string new_header(tests[i].new_header); 1555c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott parsed->AddHeader(new_header); 1556c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 15574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::string resulting_headers; 1558c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott parsed->GetNormalizedHeaders(&resulting_headers); 15594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch EXPECT_EQ(std::string(tests[i].expected_headers), resulting_headers); 1560c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1561c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1562c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1563c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpResponseHeadersTest, RemoveHeader) { 1564c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const struct { 1565c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* orig_headers; 1566c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* to_remove; 1567c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* expected_headers; 1568c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } tests[] = { 1569c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 1570c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "connection: keep-alive\n" 1571c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-control: max-age=10000\n" 1572c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Length: 450\n", 1573c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1574c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Length", 1575c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1576c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 1577c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "connection: keep-alive\n" 1578c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-control: max-age=10000\n" 1579c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1580c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 1581c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "connection: keep-alive \n" 1582c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Length : 450 \n" 1583c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-control: max-age=10000\n", 1584c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1585c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Length", 1586c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1587c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 1588c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "connection: keep-alive\n" 1589c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-control: max-age=10000\n" 1590c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1591c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 1592c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1593c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 15944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::string orig_headers(tests[i].orig_headers); 1595c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HeadersToRaw(&orig_headers); 15964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch scoped_refptr<net::HttpResponseHeaders> parsed( 15974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch new net::HttpResponseHeaders(orig_headers)); 1598c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 15994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::string name(tests[i].to_remove); 1600c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott parsed->RemoveHeader(name); 1601c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 16024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::string resulting_headers; 1603c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott parsed->GetNormalizedHeaders(&resulting_headers); 16044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch EXPECT_EQ(std::string(tests[i].expected_headers), resulting_headers); 1605c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1606c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1607c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1608c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpResponseHeadersTest, ReplaceStatus) { 1609c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const struct { 1610c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* orig_headers; 1611c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* new_status; 1612c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* expected_headers; 1613c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } tests[] = { 1614c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 206 Partial Content\n" 1615c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "connection: keep-alive\n" 1616c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-control: max-age=10000\n" 1617c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Length: 450\n", 1618c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1619c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK", 1620c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1621c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 200 OK\n" 1622c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "connection: keep-alive\n" 1623c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-control: max-age=10000\n" 1624c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Length: 450\n" 1625c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1626c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 1627c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "connection: keep-alive\n", 1628c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1629c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 304 Not Modified", 1630c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1631c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.1 304 Not Modified\n" 1632c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "connection: keep-alive\n" 1633c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1634c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "HTTP/1.1 200 OK\n" 1635c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "connection: keep-alive \n" 1636c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Length : 450 \n" 1637c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-control: max-age=10000\n", 1638c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1639c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1//1 304 Not Modified", 1640c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1641c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "HTTP/1.0 304 Not Modified\n" 1642c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "connection: keep-alive\n" 1643c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Content-Length: 450\n" 1644c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Cache-control: max-age=10000\n" 1645c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 1646c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 1647c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1648c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 16494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::string orig_headers(tests[i].orig_headers); 1650c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HeadersToRaw(&orig_headers); 16514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch scoped_refptr<net::HttpResponseHeaders> parsed( 16524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch new net::HttpResponseHeaders(orig_headers)); 1653c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 16544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::string name(tests[i].new_status); 1655c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott parsed->ReplaceStatusLine(name); 1656c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 16574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::string resulting_headers; 1658c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott parsed->GetNormalizedHeaders(&resulting_headers); 16594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch EXPECT_EQ(std::string(tests[i].expected_headers), resulting_headers); 1660c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1661c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1662