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", &current_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