| Index: net/http/http_response_headers_unittest.cc
|
| diff --git a/net/http/http_response_headers_unittest.cc b/net/http/http_response_headers_unittest.cc
|
| index fe656e63360f11c9a9a4fc0a9e34a66bb3b54402..94c6022f71eaeb37e8329004bb5b617c1e4527d2 100644
|
| --- a/net/http/http_response_headers_unittest.cc
|
| +++ b/net/http/http_response_headers_unittest.cc
|
| @@ -36,8 +36,7 @@ struct ContentTypeTestData {
|
| const std::string all_content_type;
|
| };
|
|
|
| -class HttpResponseHeadersTest : public testing::Test {
|
| -};
|
| +class HttpResponseHeadersTest : public testing::Test {};
|
|
|
| // Transform "normal"-looking headers (\n-separated) to the appropriate
|
| // input format for ParseRawHeaders (\0-separated).
|
| @@ -71,24 +70,19 @@ void TestCommon(const TestData& test) {
|
| EXPECT_TRUE(test.expected_version == parsed->GetHttpVersion());
|
| }
|
|
|
| -} // end namespace
|
| +} // end namespace
|
|
|
| // Check that we normalize headers properly.
|
| TEST(HttpResponseHeadersTest, NormalizeHeadersWhitespace) {
|
| TestData test = {
|
| - "HTTP/1.1 202 Accepted \n"
|
| - "Content-TYPE : text/html; charset=utf-8 \n"
|
| - "Set-Cookie: a \n"
|
| - "Set-Cookie: b \n",
|
| -
|
| - "HTTP/1.1 202 Accepted\n"
|
| - "Content-TYPE: text/html; charset=utf-8\n"
|
| - "Set-Cookie: a, b\n",
|
| -
|
| - 202,
|
| - net::HttpVersion(1,1),
|
| - net::HttpVersion(1,1)
|
| - };
|
| + "HTTP/1.1 202 Accepted \n"
|
| + "Content-TYPE : text/html; charset=utf-8 \n"
|
| + "Set-Cookie: a \n"
|
| + "Set-Cookie: b \n",
|
| + "HTTP/1.1 202 Accepted\n"
|
| + "Content-TYPE: text/html; charset=utf-8\n"
|
| + "Set-Cookie: a, b\n",
|
| + 202, net::HttpVersion(1, 1), net::HttpVersion(1, 1)};
|
| TestCommon(test);
|
| }
|
|
|
| @@ -96,197 +90,132 @@ TEST(HttpResponseHeadersTest, NormalizeHeadersWhitespace) {
|
| // with LWS).
|
| TEST(HttpResponseHeadersTest, NormalizeHeadersLeadingWhitespace) {
|
| TestData test = {
|
| - "HTTP/1.1 202 Accepted \n"
|
| - // Starts with space -- will be skipped as invalid.
|
| - " Content-TYPE : text/html; charset=utf-8 \n"
|
| - "Set-Cookie: a \n"
|
| - "Set-Cookie: b \n",
|
| -
|
| - "HTTP/1.1 202 Accepted\n"
|
| - "Set-Cookie: a, b\n",
|
| -
|
| - 202,
|
| - net::HttpVersion(1,1),
|
| - net::HttpVersion(1,1)
|
| - };
|
| + "HTTP/1.1 202 Accepted \n"
|
| + // Starts with space -- will be skipped as invalid.
|
| + " Content-TYPE : text/html; charset=utf-8 \n"
|
| + "Set-Cookie: a \n"
|
| + "Set-Cookie: b \n",
|
| + "HTTP/1.1 202 Accepted\n"
|
| + "Set-Cookie: a, b\n",
|
| + 202, net::HttpVersion(1, 1), net::HttpVersion(1, 1)};
|
| TestCommon(test);
|
| }
|
|
|
| TEST(HttpResponseHeadersTest, BlankHeaders) {
|
| TestData test = {
|
| - "HTTP/1.1 200 OK\n"
|
| - "Header1 : \n"
|
| - "Header2: \n"
|
| - "Header3:\n"
|
| - "Header4\n"
|
| - "Header5 :\n",
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - "Header1: \n"
|
| - "Header2: \n"
|
| - "Header3: \n"
|
| - "Header5: \n",
|
| -
|
| - 200,
|
| - net::HttpVersion(1,1),
|
| - net::HttpVersion(1,1)
|
| - };
|
| + "HTTP/1.1 200 OK\n"
|
| + "Header1 : \n"
|
| + "Header2: \n"
|
| + "Header3:\n"
|
| + "Header4\n"
|
| + "Header5 :\n",
|
| + "HTTP/1.1 200 OK\n"
|
| + "Header1: \n"
|
| + "Header2: \n"
|
| + "Header3: \n"
|
| + "Header5: \n",
|
| + 200, net::HttpVersion(1, 1), net::HttpVersion(1, 1)};
|
| TestCommon(test);
|
| }
|
|
|
| TEST(HttpResponseHeadersTest, NormalizeHeadersVersion) {
|
| // Don't believe the http/0.9 version if there are headers!
|
| TestData test = {
|
| - "hTtP/0.9 201\n"
|
| - "Content-TYPE: text/html; charset=utf-8\n",
|
| -
|
| - "HTTP/1.0 201 OK\n"
|
| - "Content-TYPE: text/html; charset=utf-8\n",
|
| -
|
| - 201,
|
| - net::HttpVersion(0,9),
|
| - net::HttpVersion(1,0)
|
| - };
|
| + "hTtP/0.9 201\n"
|
| + "Content-TYPE: text/html; charset=utf-8\n",
|
| + "HTTP/1.0 201 OK\n"
|
| + "Content-TYPE: text/html; charset=utf-8\n",
|
| + 201, net::HttpVersion(0, 9), net::HttpVersion(1, 0)};
|
| TestCommon(test);
|
| }
|
|
|
| TEST(HttpResponseHeadersTest, PreserveHttp09) {
|
| // Accept the HTTP/0.9 version number if there are no headers.
|
| // This is how HTTP/0.9 responses get constructed from HttpNetworkTransaction.
|
| - TestData test = {
|
| - "hTtP/0.9 200 OK\n",
|
| -
|
| - "HTTP/0.9 200 OK\n",
|
| -
|
| - 200,
|
| - net::HttpVersion(0,9),
|
| - net::HttpVersion(0,9)
|
| - };
|
| + TestData test = {"hTtP/0.9 200 OK\n", "HTTP/0.9 200 OK\n", 200,
|
| + net::HttpVersion(0, 9), net::HttpVersion(0, 9)};
|
| TestCommon(test);
|
| }
|
|
|
| TEST(HttpResponseHeadersTest, NormalizeHeadersMissingOK) {
|
| TestData test = {
|
| - "HTTP/1.1 201\n"
|
| - "Content-TYPE: text/html; charset=utf-8\n",
|
| -
|
| - "HTTP/1.1 201 OK\n"
|
| - "Content-TYPE: text/html; charset=utf-8\n",
|
| -
|
| - 201,
|
| - net::HttpVersion(1,1),
|
| - net::HttpVersion(1,1)
|
| - };
|
| + "HTTP/1.1 201\n"
|
| + "Content-TYPE: text/html; charset=utf-8\n",
|
| + "HTTP/1.1 201 OK\n"
|
| + "Content-TYPE: text/html; charset=utf-8\n",
|
| + 201, net::HttpVersion(1, 1), net::HttpVersion(1, 1)};
|
| TestCommon(test);
|
| }
|
|
|
| TEST(HttpResponseHeadersTest, NormalizeHeadersBadStatus) {
|
| TestData test = {
|
| - "SCREWED_UP_STATUS_LINE\n"
|
| - "Content-TYPE: text/html; charset=utf-8\n",
|
| -
|
| - "HTTP/1.0 200 OK\n"
|
| - "Content-TYPE: text/html; charset=utf-8\n",
|
| -
|
| - 200,
|
| - net::HttpVersion(0,0), // Parse error
|
| - net::HttpVersion(1,0)
|
| - };
|
| + "SCREWED_UP_STATUS_LINE\n"
|
| + "Content-TYPE: text/html; charset=utf-8\n",
|
| + "HTTP/1.0 200 OK\n"
|
| + "Content-TYPE: text/html; charset=utf-8\n",
|
| + 200, net::HttpVersion(0, 0), // Parse error
|
| + net::HttpVersion(1, 0)};
|
| TestCommon(test);
|
| }
|
|
|
| TEST(HttpResponseHeadersTest, NormalizeHeadersInvalidStatusCode) {
|
| - TestData test = {
|
| - "HTTP/1.1 -1 Unknown\n",
|
| -
|
| - "HTTP/1.1 200 OK\n",
|
| -
|
| - 200,
|
| - net::HttpVersion(1,1),
|
| - net::HttpVersion(1,1)
|
| - };
|
| + TestData test = {"HTTP/1.1 -1 Unknown\n", "HTTP/1.1 200 OK\n", 200,
|
| + net::HttpVersion(1, 1), net::HttpVersion(1, 1)};
|
| TestCommon(test);
|
| }
|
|
|
| TEST(HttpResponseHeadersTest, NormalizeHeadersEmpty) {
|
| - TestData test = {
|
| - "",
|
| -
|
| - "HTTP/1.0 200 OK\n",
|
| -
|
| - 200,
|
| - net::HttpVersion(0,0), // Parse Error
|
| - net::HttpVersion(1,0)
|
| - };
|
| + TestData test = {"", "HTTP/1.0 200 OK\n", 200,
|
| + net::HttpVersion(0, 0), // Parse Error
|
| + net::HttpVersion(1, 0)};
|
| TestCommon(test);
|
| }
|
|
|
| TEST(HttpResponseHeadersTest, NormalizeHeadersStartWithColon) {
|
| TestData test = {
|
| - "HTTP/1.1 202 Accepted \n"
|
| - "foo: bar\n"
|
| - ": a \n"
|
| - " : b\n"
|
| - "baz: blat \n",
|
| -
|
| - "HTTP/1.1 202 Accepted\n"
|
| - "foo: bar\n"
|
| - "baz: blat\n",
|
| -
|
| - 202,
|
| - net::HttpVersion(1,1),
|
| - net::HttpVersion(1,1)
|
| - };
|
| + "HTTP/1.1 202 Accepted \n"
|
| + "foo: bar\n"
|
| + ": a \n"
|
| + " : b\n"
|
| + "baz: blat \n",
|
| + "HTTP/1.1 202 Accepted\n"
|
| + "foo: bar\n"
|
| + "baz: blat\n",
|
| + 202, net::HttpVersion(1, 1), net::HttpVersion(1, 1)};
|
| TestCommon(test);
|
| }
|
|
|
| TEST(HttpResponseHeadersTest, NormalizeHeadersStartWithColonAtEOL) {
|
| TestData test = {
|
| - "HTTP/1.1 202 Accepted \n"
|
| - "foo: \n"
|
| - "bar:\n"
|
| - "baz: blat \n"
|
| - "zip:\n",
|
| -
|
| - "HTTP/1.1 202 Accepted\n"
|
| - "foo: \n"
|
| - "bar: \n"
|
| - "baz: blat\n"
|
| - "zip: \n",
|
| -
|
| - 202,
|
| - net::HttpVersion(1,1),
|
| - net::HttpVersion(1,1)
|
| - };
|
| + "HTTP/1.1 202 Accepted \n"
|
| + "foo: \n"
|
| + "bar:\n"
|
| + "baz: blat \n"
|
| + "zip:\n",
|
| + "HTTP/1.1 202 Accepted\n"
|
| + "foo: \n"
|
| + "bar: \n"
|
| + "baz: blat\n"
|
| + "zip: \n",
|
| + 202, net::HttpVersion(1, 1), net::HttpVersion(1, 1)};
|
| TestCommon(test);
|
| }
|
|
|
| TEST(HttpResponseHeadersTest, NormalizeHeadersOfWhitepace) {
|
| - TestData test = {
|
| - "\n \n",
|
| -
|
| - "HTTP/1.0 200 OK\n",
|
| -
|
| - 200,
|
| - net::HttpVersion(0,0), // Parse error
|
| - net::HttpVersion(1,0)
|
| - };
|
| + TestData test = {"\n \n", "HTTP/1.0 200 OK\n", 200,
|
| + net::HttpVersion(0, 0), // Parse error
|
| + net::HttpVersion(1, 0)};
|
| TestCommon(test);
|
| }
|
|
|
| TEST(HttpResponseHeadersTest, RepeatedSetCookie) {
|
| TestData test = {
|
| - "HTTP/1.1 200 OK\n"
|
| - "Set-Cookie: x=1\n"
|
| - "Set-Cookie: y=2\n",
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - "Set-Cookie: x=1, y=2\n",
|
| -
|
| - 200,
|
| - net::HttpVersion(1,1),
|
| - net::HttpVersion(1,1)
|
| - };
|
| + "HTTP/1.1 200 OK\n"
|
| + "Set-Cookie: x=1\n"
|
| + "Set-Cookie: y=2\n",
|
| + "HTTP/1.1 200 OK\n"
|
| + "Set-Cookie: x=1, y=2\n",
|
| + 200, net::HttpVersion(1, 1), net::HttpVersion(1, 1)};
|
| TestCommon(test);
|
| }
|
|
|
| @@ -310,168 +239,136 @@ TEST(HttpResponseHeadersTest, Persist) {
|
| const char* raw_headers;
|
| const char* expected_headers;
|
| } tests[] = {
|
| - { net::HttpResponseHeaders::PERSIST_ALL,
|
| - "HTTP/1.1 200 OK\n"
|
| - "Cache-control:private\n"
|
| - "cache-Control:no-store\n",
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - "Cache-control: private, no-store\n"
|
| - },
|
| - { net::HttpResponseHeaders::PERSIST_SANS_HOP_BY_HOP,
|
| - "HTTP/1.1 200 OK\n"
|
| - "connection: keep-alive\n"
|
| - "server: blah\n",
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - "server: blah\n"
|
| - },
|
| - { net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE |
|
| - net::HttpResponseHeaders::PERSIST_SANS_HOP_BY_HOP,
|
| - "HTTP/1.1 200 OK\n"
|
| - "fOo: 1\n"
|
| - "Foo: 2\n"
|
| - "Transfer-Encoding: chunked\n"
|
| - "CoNnection: keep-alive\n"
|
| - "cache-control: private, no-cache=\"foo\"\n",
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - "cache-control: private, no-cache=\"foo\"\n"
|
| - },
|
| - { net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE,
|
| - "HTTP/1.1 200 OK\n"
|
| - "Foo: 2\n"
|
| - "Cache-Control: private,no-cache=\"foo, bar\"\n"
|
| - "bar",
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - "Cache-Control: private,no-cache=\"foo, bar\"\n"
|
| - },
|
| - // ignore bogus no-cache value
|
| - { net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE,
|
| - "HTTP/1.1 200 OK\n"
|
| - "Foo: 2\n"
|
| - "Cache-Control: private,no-cache=foo\n",
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - "Foo: 2\n"
|
| - "Cache-Control: private,no-cache=foo\n"
|
| - },
|
| - // ignore bogus no-cache value
|
| - { net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE,
|
| - "HTTP/1.1 200 OK\n"
|
| - "Foo: 2\n"
|
| - "Cache-Control: private, no-cache=\n",
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - "Foo: 2\n"
|
| - "Cache-Control: private, no-cache=\n"
|
| - },
|
| - // ignore empty no-cache value
|
| - { net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE,
|
| - "HTTP/1.1 200 OK\n"
|
| - "Foo: 2\n"
|
| - "Cache-Control: private, no-cache=\"\"\n",
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - "Foo: 2\n"
|
| - "Cache-Control: private, no-cache=\"\"\n"
|
| - },
|
| - // ignore wrong quotes no-cache value
|
| - { net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE,
|
| - "HTTP/1.1 200 OK\n"
|
| - "Foo: 2\n"
|
| - "Cache-Control: private, no-cache=\'foo\'\n",
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - "Foo: 2\n"
|
| - "Cache-Control: private, no-cache=\'foo\'\n"
|
| - },
|
| - // ignore unterminated quotes no-cache value
|
| - { net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE,
|
| - "HTTP/1.1 200 OK\n"
|
| - "Foo: 2\n"
|
| - "Cache-Control: private, no-cache=\"foo\n",
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - "Foo: 2\n"
|
| - "Cache-Control: private, no-cache=\"foo\n"
|
| - },
|
| - // accept sloppy LWS
|
| - { net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE,
|
| - "HTTP/1.1 200 OK\n"
|
| - "Foo: 2\n"
|
| - "Cache-Control: private, no-cache=\" foo\t, bar\"\n",
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - "Cache-Control: private, no-cache=\" foo\t, bar\"\n"
|
| - },
|
| - // header name appears twice, separated by another header
|
| - { net::HttpResponseHeaders::PERSIST_ALL,
|
| - "HTTP/1.1 200 OK\n"
|
| - "Foo: 1\n"
|
| - "Bar: 2\n"
|
| - "Foo: 3\n",
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - "Foo: 1, 3\n"
|
| - "Bar: 2\n"
|
| - },
|
| - // header name appears twice, separated by another header (type 2)
|
| - { net::HttpResponseHeaders::PERSIST_ALL,
|
| - "HTTP/1.1 200 OK\n"
|
| - "Foo: 1, 3\n"
|
| - "Bar: 2\n"
|
| - "Foo: 4\n",
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - "Foo: 1, 3, 4\n"
|
| - "Bar: 2\n"
|
| - },
|
| - // Test filtering of cookie headers.
|
| - { net::HttpResponseHeaders::PERSIST_SANS_COOKIES,
|
| - "HTTP/1.1 200 OK\n"
|
| - "Set-Cookie: foo=bar; httponly\n"
|
| - "Set-Cookie: bar=foo\n"
|
| - "Bar: 1\n"
|
| - "Set-Cookie2: bar2=foo2\n",
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - "Bar: 1\n"
|
| - },
|
| - // Test LWS at the end of a header.
|
| - { net::HttpResponseHeaders::PERSIST_ALL,
|
| - "HTTP/1.1 200 OK\n"
|
| - "Content-Length: 450 \n"
|
| - "Content-Encoding: gzip\n",
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - "Content-Length: 450\n"
|
| - "Content-Encoding: gzip\n"
|
| - },
|
| - // Test LWS at the end of a header.
|
| - { net::HttpResponseHeaders::PERSIST_RAW,
|
| - "HTTP/1.1 200 OK\n"
|
| - "Content-Length: 450 \n"
|
| - "Content-Encoding: gzip\n",
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - "Content-Length: 450\n"
|
| - "Content-Encoding: gzip\n"
|
| - },
|
| - // Test filtering of transport security state headers.
|
| - { net::HttpResponseHeaders::PERSIST_SANS_SECURITY_STATE,
|
| - "HTTP/1.1 200 OK\n"
|
| - "Strict-Transport-Security: max-age=1576800\n"
|
| - "Bar: 1\n"
|
| - "Public-Key-Pins: max-age=100000; "
|
| - "pin-sha1=\"ObT42aoSpAqWdY9WfRfL7i0HsVk=\";"
|
| - "pin-sha1=\"7kW49EVwZG0hSNx41ZO/fUPN0ek=\"",
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - "Bar: 1\n"
|
| - },
|
| - };
|
| + {net::HttpResponseHeaders::PERSIST_ALL,
|
| + "HTTP/1.1 200 OK\n"
|
| + "Cache-control:private\n"
|
| + "cache-Control:no-store\n",
|
| + "HTTP/1.1 200 OK\n"
|
| + "Cache-control: private, no-store\n"},
|
| + {net::HttpResponseHeaders::PERSIST_SANS_HOP_BY_HOP,
|
| + "HTTP/1.1 200 OK\n"
|
| + "connection: keep-alive\n"
|
| + "server: blah\n",
|
| + "HTTP/1.1 200 OK\n"
|
| + "server: blah\n"},
|
| + {net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE |
|
| + net::HttpResponseHeaders::PERSIST_SANS_HOP_BY_HOP,
|
| + "HTTP/1.1 200 OK\n"
|
| + "fOo: 1\n"
|
| + "Foo: 2\n"
|
| + "Transfer-Encoding: chunked\n"
|
| + "CoNnection: keep-alive\n"
|
| + "cache-control: private, no-cache=\"foo\"\n",
|
| + "HTTP/1.1 200 OK\n"
|
| + "cache-control: private, no-cache=\"foo\"\n"},
|
| + {net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE,
|
| + "HTTP/1.1 200 OK\n"
|
| + "Foo: 2\n"
|
| + "Cache-Control: private,no-cache=\"foo, bar\"\n"
|
| + "bar",
|
| + "HTTP/1.1 200 OK\n"
|
| + "Cache-Control: private,no-cache=\"foo, bar\"\n"},
|
| + // ignore bogus no-cache value
|
| + {net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE,
|
| + "HTTP/1.1 200 OK\n"
|
| + "Foo: 2\n"
|
| + "Cache-Control: private,no-cache=foo\n",
|
| + "HTTP/1.1 200 OK\n"
|
| + "Foo: 2\n"
|
| + "Cache-Control: private,no-cache=foo\n"},
|
| + // ignore bogus no-cache value
|
| + {net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE,
|
| + "HTTP/1.1 200 OK\n"
|
| + "Foo: 2\n"
|
| + "Cache-Control: private, no-cache=\n",
|
| + "HTTP/1.1 200 OK\n"
|
| + "Foo: 2\n"
|
| + "Cache-Control: private, no-cache=\n"},
|
| + // ignore empty no-cache value
|
| + {net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE,
|
| + "HTTP/1.1 200 OK\n"
|
| + "Foo: 2\n"
|
| + "Cache-Control: private, no-cache=\"\"\n",
|
| + "HTTP/1.1 200 OK\n"
|
| + "Foo: 2\n"
|
| + "Cache-Control: private, no-cache=\"\"\n"},
|
| + // ignore wrong quotes no-cache value
|
| + {net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE,
|
| + "HTTP/1.1 200 OK\n"
|
| + "Foo: 2\n"
|
| + "Cache-Control: private, no-cache=\'foo\'\n",
|
| + "HTTP/1.1 200 OK\n"
|
| + "Foo: 2\n"
|
| + "Cache-Control: private, no-cache=\'foo\'\n"},
|
| + // ignore unterminated quotes no-cache value
|
| + {net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE,
|
| + "HTTP/1.1 200 OK\n"
|
| + "Foo: 2\n"
|
| + "Cache-Control: private, no-cache=\"foo\n",
|
| + "HTTP/1.1 200 OK\n"
|
| + "Foo: 2\n"
|
| + "Cache-Control: private, no-cache=\"foo\n"},
|
| + // accept sloppy LWS
|
| + {net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE,
|
| + "HTTP/1.1 200 OK\n"
|
| + "Foo: 2\n"
|
| + "Cache-Control: private, no-cache=\" foo\t, bar\"\n",
|
| + "HTTP/1.1 200 OK\n"
|
| + "Cache-Control: private, no-cache=\" foo\t, bar\"\n"},
|
| + // header name appears twice, separated by another header
|
| + {net::HttpResponseHeaders::PERSIST_ALL,
|
| + "HTTP/1.1 200 OK\n"
|
| + "Foo: 1\n"
|
| + "Bar: 2\n"
|
| + "Foo: 3\n",
|
| + "HTTP/1.1 200 OK\n"
|
| + "Foo: 1, 3\n"
|
| + "Bar: 2\n"},
|
| + // header name appears twice, separated by another header (type 2)
|
| + {net::HttpResponseHeaders::PERSIST_ALL,
|
| + "HTTP/1.1 200 OK\n"
|
| + "Foo: 1, 3\n"
|
| + "Bar: 2\n"
|
| + "Foo: 4\n",
|
| + "HTTP/1.1 200 OK\n"
|
| + "Foo: 1, 3, 4\n"
|
| + "Bar: 2\n"},
|
| + // Test filtering of cookie headers.
|
| + {net::HttpResponseHeaders::PERSIST_SANS_COOKIES,
|
| + "HTTP/1.1 200 OK\n"
|
| + "Set-Cookie: foo=bar; httponly\n"
|
| + "Set-Cookie: bar=foo\n"
|
| + "Bar: 1\n"
|
| + "Set-Cookie2: bar2=foo2\n",
|
| + "HTTP/1.1 200 OK\n"
|
| + "Bar: 1\n"},
|
| + // Test LWS at the end of a header.
|
| + {net::HttpResponseHeaders::PERSIST_ALL,
|
| + "HTTP/1.1 200 OK\n"
|
| + "Content-Length: 450 \n"
|
| + "Content-Encoding: gzip\n",
|
| + "HTTP/1.1 200 OK\n"
|
| + "Content-Length: 450\n"
|
| + "Content-Encoding: gzip\n"},
|
| + // Test LWS at the end of a header.
|
| + {net::HttpResponseHeaders::PERSIST_RAW,
|
| + "HTTP/1.1 200 OK\n"
|
| + "Content-Length: 450 \n"
|
| + "Content-Encoding: gzip\n",
|
| + "HTTP/1.1 200 OK\n"
|
| + "Content-Length: 450\n"
|
| + "Content-Encoding: gzip\n"},
|
| + // Test filtering of transport security state headers.
|
| + {net::HttpResponseHeaders::PERSIST_SANS_SECURITY_STATE,
|
| + "HTTP/1.1 200 OK\n"
|
| + "Strict-Transport-Security: max-age=1576800\n"
|
| + "Bar: 1\n"
|
| + "Public-Key-Pins: max-age=100000; "
|
| + "pin-sha1=\"ObT42aoSpAqWdY9WfRfL7i0HsVk=\";"
|
| + "pin-sha1=\"7kW49EVwZG0hSNx41ZO/fUPN0ek=\"",
|
| + "HTTP/1.1 200 OK\n"
|
| + "Bar: 1\n"},
|
| + };
|
|
|
| for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
|
| std::string headers = tests[i].raw_headers;
|
| @@ -564,8 +461,8 @@ TEST(HttpResponseHeadersTest, DefaultDateToGMT) {
|
| scoped_refptr<net::HttpResponseHeaders> parsed(
|
| new net::HttpResponseHeaders(headers));
|
| base::Time expected_value;
|
| - ASSERT_TRUE(base::Time::FromString("Tue, 07 Aug 2007 23:10:55 GMT",
|
| - &expected_value));
|
| + ASSERT_TRUE(
|
| + base::Time::FromString("Tue, 07 Aug 2007 23:10:55 GMT", &expected_value));
|
|
|
| base::Time value;
|
| // When the timezone is missing, GMT is a good guess as its what RFC2616
|
| @@ -584,134 +481,103 @@ TEST(HttpResponseHeadersTest, DefaultDateToGMT) {
|
|
|
| TEST(HttpResponseHeadersTest, GetMimeType) {
|
| const ContentTypeTestData tests[] = {
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-type: text/html\n",
|
| - "text/html", true,
|
| - "", false,
|
| - "text/html" },
|
| - // Multiple content-type headers should give us the last one.
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-type: text/html\n"
|
| - "Content-type: text/html\n",
|
| - "text/html", true,
|
| - "", false,
|
| - "text/html, text/html" },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-type: text/plain\n"
|
| - "Content-type: text/html\n"
|
| - "Content-type: text/plain\n"
|
| - "Content-type: text/html\n",
|
| - "text/html", true,
|
| - "", false,
|
| - "text/plain, text/html, text/plain, text/html" },
|
| - // Test charset parsing.
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-type: text/html\n"
|
| - "Content-type: text/html; charset=ISO-8859-1\n",
|
| - "text/html", true,
|
| - "iso-8859-1", true,
|
| - "text/html, text/html; charset=ISO-8859-1" },
|
| - // Test charset in double quotes.
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-type: text/html\n"
|
| - "Content-type: text/html; charset=\"ISO-8859-1\"\n",
|
| - "text/html", true,
|
| - "iso-8859-1", true,
|
| - "text/html, text/html; charset=\"ISO-8859-1\"" },
|
| - // If there are multiple matching content-type headers, we carry
|
| - // over the charset value.
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-type: text/html;charset=utf-8\n"
|
| - "Content-type: text/html\n",
|
| - "text/html", true,
|
| - "utf-8", true,
|
| - "text/html;charset=utf-8, text/html" },
|
| - // Test single quotes.
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-type: text/html;charset='utf-8'\n"
|
| - "Content-type: text/html\n",
|
| - "text/html", true,
|
| - "utf-8", true,
|
| - "text/html;charset='utf-8', text/html" },
|
| - // Last charset wins if matching content-type.
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-type: text/html;charset=utf-8\n"
|
| - "Content-type: text/html;charset=iso-8859-1\n",
|
| - "text/html", true,
|
| - "iso-8859-1", true,
|
| - "text/html;charset=utf-8, text/html;charset=iso-8859-1" },
|
| - // Charset is ignored if the content types change.
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-type: text/plain;charset=utf-8\n"
|
| - "Content-type: text/html\n",
|
| - "text/html", true,
|
| - "", false,
|
| - "text/plain;charset=utf-8, text/html" },
|
| - // Empty content-type
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-type: \n",
|
| - "", false,
|
| - "", false,
|
| - "" },
|
| - // Emtpy charset
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-type: text/html;charset=\n",
|
| - "text/html", true,
|
| - "", false,
|
| - "text/html;charset=" },
|
| - // Multiple charsets, last one wins.
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-type: text/html;charset=utf-8; charset=iso-8859-1\n",
|
| - "text/html", true,
|
| - "iso-8859-1", true,
|
| - "text/html;charset=utf-8; charset=iso-8859-1" },
|
| - // Multiple params.
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-type: text/html; foo=utf-8; charset=iso-8859-1\n",
|
| - "text/html", true,
|
| - "iso-8859-1", true,
|
| - "text/html; foo=utf-8; charset=iso-8859-1" },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-type: text/html ; charset=utf-8 ; bar=iso-8859-1\n",
|
| - "text/html", true,
|
| - "utf-8", true,
|
| - "text/html ; charset=utf-8 ; bar=iso-8859-1" },
|
| - // Comma embeded in quotes.
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-type: text/html ; charset='utf-8,text/plain' ;\n",
|
| - "text/html", true,
|
| - "utf-8,text/plain", true,
|
| - "text/html ; charset='utf-8,text/plain' ;" },
|
| - // Charset with leading spaces.
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-type: text/html ; charset= 'utf-8' ;\n",
|
| - "text/html", true,
|
| - "utf-8", true,
|
| - "text/html ; charset= 'utf-8' ;" },
|
| - // Media type comments in mime-type.
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-type: text/html (html)\n",
|
| - "text/html", true,
|
| - "", false,
|
| - "text/html (html)" },
|
| - // Incomplete charset= param
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-type: text/html; char=\n",
|
| - "text/html", true,
|
| - "", false,
|
| - "text/html; char=" },
|
| - // Invalid media type: no slash
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-type: texthtml\n",
|
| - "", false,
|
| - "", false,
|
| - "texthtml" },
|
| - // Invalid media type: */*
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-type: */*\n",
|
| - "", false,
|
| - "", false,
|
| - "*/*" },
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Content-type: text/html\n",
|
| + "text/html", true, "", false, "text/html"},
|
| + // Multiple content-type headers should give us the last one.
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Content-type: text/html\n"
|
| + "Content-type: text/html\n",
|
| + "text/html", true, "", false, "text/html, text/html"},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Content-type: text/plain\n"
|
| + "Content-type: text/html\n"
|
| + "Content-type: text/plain\n"
|
| + "Content-type: text/html\n",
|
| + "text/html", true, "", false,
|
| + "text/plain, text/html, text/plain, text/html"},
|
| + // Test charset parsing.
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Content-type: text/html\n"
|
| + "Content-type: text/html; charset=ISO-8859-1\n",
|
| + "text/html", true, "iso-8859-1", true,
|
| + "text/html, text/html; charset=ISO-8859-1"},
|
| + // Test charset in double quotes.
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Content-type: text/html\n"
|
| + "Content-type: text/html; charset=\"ISO-8859-1\"\n",
|
| + "text/html", true, "iso-8859-1", true,
|
| + "text/html, text/html; charset=\"ISO-8859-1\""},
|
| + // If there are multiple matching content-type headers, we carry
|
| + // over the charset value.
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Content-type: text/html;charset=utf-8\n"
|
| + "Content-type: text/html\n",
|
| + "text/html", true, "utf-8", true, "text/html;charset=utf-8, text/html"},
|
| + // Test single quotes.
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Content-type: text/html;charset='utf-8'\n"
|
| + "Content-type: text/html\n",
|
| + "text/html", true, "utf-8", true,
|
| + "text/html;charset='utf-8', text/html"},
|
| + // Last charset wins if matching content-type.
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Content-type: text/html;charset=utf-8\n"
|
| + "Content-type: text/html;charset=iso-8859-1\n",
|
| + "text/html", true, "iso-8859-1", true,
|
| + "text/html;charset=utf-8, text/html;charset=iso-8859-1"},
|
| + // Charset is ignored if the content types change.
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Content-type: text/plain;charset=utf-8\n"
|
| + "Content-type: text/html\n",
|
| + "text/html", true, "", false, "text/plain;charset=utf-8, text/html"},
|
| + // Empty content-type
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Content-type: \n",
|
| + "", false, "", false, ""},
|
| + // Emtpy charset
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Content-type: text/html;charset=\n",
|
| + "text/html", true, "", false, "text/html;charset="},
|
| + // Multiple charsets, last one wins.
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Content-type: text/html;charset=utf-8; charset=iso-8859-1\n",
|
| + "text/html", true, "iso-8859-1", true,
|
| + "text/html;charset=utf-8; charset=iso-8859-1"},
|
| + // Multiple params.
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Content-type: text/html; foo=utf-8; charset=iso-8859-1\n",
|
| + "text/html", true, "iso-8859-1", true,
|
| + "text/html; foo=utf-8; charset=iso-8859-1"},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Content-type: text/html ; charset=utf-8 ; bar=iso-8859-1\n",
|
| + "text/html", true, "utf-8", true,
|
| + "text/html ; charset=utf-8 ; bar=iso-8859-1"},
|
| + // Comma embeded in quotes.
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Content-type: text/html ; charset='utf-8,text/plain' ;\n",
|
| + "text/html", true, "utf-8,text/plain", true,
|
| + "text/html ; charset='utf-8,text/plain' ;"},
|
| + // Charset with leading spaces.
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Content-type: text/html ; charset= 'utf-8' ;\n",
|
| + "text/html", true, "utf-8", true, "text/html ; charset= 'utf-8' ;"},
|
| + // Media type comments in mime-type.
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Content-type: text/html (html)\n",
|
| + "text/html", true, "", false, "text/html (html)"},
|
| + // Incomplete charset= param
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Content-type: text/html; char=\n",
|
| + "text/html", true, "", false, "text/html; char="},
|
| + // Invalid media type: no slash
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Content-type: texthtml\n",
|
| + "", false, "", false, "texthtml"},
|
| + // Invalid media type: */*
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Content-type: */*\n",
|
| + "", false, "", false, "*/*"},
|
| };
|
|
|
| for (size_t i = 0; i < arraysize(tests); ++i) {
|
| @@ -736,135 +602,115 @@ TEST(HttpResponseHeadersTest, RequiresValidation) {
|
| const char* headers;
|
| bool requires_validation;
|
| } tests[] = {
|
| - // no expiry info: expires immediately
|
| - { "HTTP/1.1 200 OK\n"
|
| - "\n",
|
| - true
|
| - },
|
| - // valid for a little while
|
| - { "HTTP/1.1 200 OK\n"
|
| - "cache-control: max-age=10000\n"
|
| - "\n",
|
| - false
|
| - },
|
| - // expires in the future
|
| - { "HTTP/1.1 200 OK\n"
|
| - "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
|
| - "expires: Wed, 28 Nov 2007 01:00:00 GMT\n"
|
| - "\n",
|
| - false
|
| - },
|
| - // expired already
|
| - { "HTTP/1.1 200 OK\n"
|
| - "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
|
| - "expires: Wed, 28 Nov 2007 00:00:00 GMT\n"
|
| - "\n",
|
| - true
|
| - },
|
| - // max-age trumps expires
|
| - { "HTTP/1.1 200 OK\n"
|
| - "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
|
| - "expires: Wed, 28 Nov 2007 00:00:00 GMT\n"
|
| - "cache-control: max-age=10000\n"
|
| - "\n",
|
| - false
|
| - },
|
| - // last-modified heuristic: modified a while ago
|
| - { "HTTP/1.1 200 OK\n"
|
| - "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
|
| - "last-modified: Wed, 27 Nov 2007 08:00:00 GMT\n"
|
| - "\n",
|
| - false
|
| - },
|
| - { "HTTP/1.1 203 Non-Authoritative Information\n"
|
| - "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
|
| - "last-modified: Wed, 27 Nov 2007 08:00:00 GMT\n"
|
| - "\n",
|
| - false
|
| - },
|
| - { "HTTP/1.1 206 Partial Content\n"
|
| - "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
|
| - "last-modified: Wed, 27 Nov 2007 08:00:00 GMT\n"
|
| - "\n",
|
| - false
|
| - },
|
| - // last-modified heuristic: modified recently
|
| - { "HTTP/1.1 200 OK\n"
|
| - "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
|
| - "last-modified: Wed, 28 Nov 2007 00:40:10 GMT\n"
|
| - "\n",
|
| - true
|
| - },
|
| - { "HTTP/1.1 203 Non-Authoritative Information\n"
|
| - "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
|
| - "last-modified: Wed, 28 Nov 2007 00:40:10 GMT\n"
|
| - "\n",
|
| - true
|
| - },
|
| - { "HTTP/1.1 206 Partial Content\n"
|
| - "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
|
| - "last-modified: Wed, 28 Nov 2007 00:40:10 GMT\n"
|
| - "\n",
|
| - true
|
| - },
|
| - // cached permanent redirect
|
| - { "HTTP/1.1 301 Moved Permanently\n"
|
| - "\n",
|
| - false
|
| - },
|
| - // another cached permanent redirect
|
| - { "HTTP/1.1 308 Permanent Redirect\n"
|
| - "\n",
|
| - false
|
| - },
|
| - // cached redirect: not reusable even though by default it would be
|
| - { "HTTP/1.1 300 Multiple Choices\n"
|
| - "Cache-Control: no-cache\n"
|
| - "\n",
|
| - true
|
| - },
|
| - // cached forever by default
|
| - { "HTTP/1.1 410 Gone\n"
|
| - "\n",
|
| - false
|
| - },
|
| - // cached temporary redirect: not reusable
|
| - { "HTTP/1.1 302 Found\n"
|
| - "\n",
|
| - true
|
| - },
|
| - // cached temporary redirect: reusable
|
| - { "HTTP/1.1 302 Found\n"
|
| - "cache-control: max-age=10000\n"
|
| - "\n",
|
| - false
|
| - },
|
| - // cache-control: max-age=N overrides expires: date in the past
|
| - { "HTTP/1.1 200 OK\n"
|
| - "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
|
| - "expires: Wed, 28 Nov 2007 00:20:11 GMT\n"
|
| - "cache-control: max-age=10000\n"
|
| - "\n",
|
| - false
|
| - },
|
| - // cache-control: no-store overrides expires: in the future
|
| - { "HTTP/1.1 200 OK\n"
|
| - "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
|
| - "expires: Wed, 29 Nov 2007 00:40:11 GMT\n"
|
| - "cache-control: no-store,private,no-cache=\"foo\"\n"
|
| - "\n",
|
| - true
|
| - },
|
| - // pragma: no-cache overrides last-modified heuristic
|
| - { "HTTP/1.1 200 OK\n"
|
| - "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
|
| - "last-modified: Wed, 27 Nov 2007 08:00:00 GMT\n"
|
| - "pragma: no-cache\n"
|
| - "\n",
|
| - true
|
| - },
|
| - // TODO(darin): add many many more tests here
|
| - };
|
| + // no expiry info: expires immediately
|
| + {"HTTP/1.1 200 OK\n"
|
| + "\n",
|
| + true},
|
| + // valid for a little while
|
| + {"HTTP/1.1 200 OK\n"
|
| + "cache-control: max-age=10000\n"
|
| + "\n",
|
| + false},
|
| + // expires in the future
|
| + {"HTTP/1.1 200 OK\n"
|
| + "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
|
| + "expires: Wed, 28 Nov 2007 01:00:00 GMT\n"
|
| + "\n",
|
| + false},
|
| + // expired already
|
| + {"HTTP/1.1 200 OK\n"
|
| + "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
|
| + "expires: Wed, 28 Nov 2007 00:00:00 GMT\n"
|
| + "\n",
|
| + true},
|
| + // max-age trumps expires
|
| + {"HTTP/1.1 200 OK\n"
|
| + "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
|
| + "expires: Wed, 28 Nov 2007 00:00:00 GMT\n"
|
| + "cache-control: max-age=10000\n"
|
| + "\n",
|
| + false},
|
| + // last-modified heuristic: modified a while ago
|
| + {"HTTP/1.1 200 OK\n"
|
| + "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
|
| + "last-modified: Wed, 27 Nov 2007 08:00:00 GMT\n"
|
| + "\n",
|
| + false},
|
| + {"HTTP/1.1 203 Non-Authoritative Information\n"
|
| + "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
|
| + "last-modified: Wed, 27 Nov 2007 08:00:00 GMT\n"
|
| + "\n",
|
| + false},
|
| + {"HTTP/1.1 206 Partial Content\n"
|
| + "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
|
| + "last-modified: Wed, 27 Nov 2007 08:00:00 GMT\n"
|
| + "\n",
|
| + false},
|
| + // last-modified heuristic: modified recently
|
| + {"HTTP/1.1 200 OK\n"
|
| + "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
|
| + "last-modified: Wed, 28 Nov 2007 00:40:10 GMT\n"
|
| + "\n",
|
| + true},
|
| + {"HTTP/1.1 203 Non-Authoritative Information\n"
|
| + "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
|
| + "last-modified: Wed, 28 Nov 2007 00:40:10 GMT\n"
|
| + "\n",
|
| + true},
|
| + {"HTTP/1.1 206 Partial Content\n"
|
| + "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
|
| + "last-modified: Wed, 28 Nov 2007 00:40:10 GMT\n"
|
| + "\n",
|
| + true},
|
| + // cached permanent redirect
|
| + {"HTTP/1.1 301 Moved Permanently\n"
|
| + "\n",
|
| + false},
|
| + // another cached permanent redirect
|
| + {"HTTP/1.1 308 Permanent Redirect\n"
|
| + "\n",
|
| + false},
|
| + // cached redirect: not reusable even though by default it would be
|
| + {"HTTP/1.1 300 Multiple Choices\n"
|
| + "Cache-Control: no-cache\n"
|
| + "\n",
|
| + true},
|
| + // cached forever by default
|
| + {"HTTP/1.1 410 Gone\n"
|
| + "\n",
|
| + false},
|
| + // cached temporary redirect: not reusable
|
| + {"HTTP/1.1 302 Found\n"
|
| + "\n",
|
| + true},
|
| + // cached temporary redirect: reusable
|
| + {"HTTP/1.1 302 Found\n"
|
| + "cache-control: max-age=10000\n"
|
| + "\n",
|
| + false},
|
| + // cache-control: max-age=N overrides expires: date in the past
|
| + {"HTTP/1.1 200 OK\n"
|
| + "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
|
| + "expires: Wed, 28 Nov 2007 00:20:11 GMT\n"
|
| + "cache-control: max-age=10000\n"
|
| + "\n",
|
| + false},
|
| + // cache-control: no-store overrides expires: in the future
|
| + {"HTTP/1.1 200 OK\n"
|
| + "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
|
| + "expires: Wed, 29 Nov 2007 00:40:11 GMT\n"
|
| + "cache-control: no-store,private,no-cache=\"foo\"\n"
|
| + "\n",
|
| + true},
|
| + // pragma: no-cache overrides last-modified heuristic
|
| + {"HTTP/1.1 200 OK\n"
|
| + "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
|
| + "last-modified: Wed, 27 Nov 2007 08:00:00 GMT\n"
|
| + "pragma: no-cache\n"
|
| + "\n",
|
| + true},
|
| + // TODO(darin): add many many more tests here
|
| + };
|
| base::Time request_time, response_time, current_time;
|
| base::Time::FromString("Wed, 28 Nov 2007 00:40:09 GMT", &request_time);
|
| base::Time::FromString("Wed, 28 Nov 2007 00:40:12 GMT", &response_time);
|
| @@ -888,85 +734,67 @@ TEST(HttpResponseHeadersTest, Update) {
|
| const char* new_headers;
|
| const char* expected_headers;
|
| } tests[] = {
|
| - { "HTTP/1.1 200 OK\n",
|
| -
|
| - "HTTP/1/1 304 Not Modified\n"
|
| - "connection: keep-alive\n"
|
| - "Cache-control: max-age=10000\n",
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - "Cache-control: max-age=10000\n"
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Foo: 1\n"
|
| - "Cache-control: private\n",
|
| -
|
| - "HTTP/1/1 304 Not Modified\n"
|
| - "connection: keep-alive\n"
|
| - "Cache-control: max-age=10000\n",
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - "Cache-control: max-age=10000\n"
|
| - "Foo: 1\n"
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Foo: 1\n"
|
| - "Cache-control: private\n",
|
| -
|
| - "HTTP/1/1 304 Not Modified\n"
|
| - "connection: keep-alive\n"
|
| - "Cache-CONTROL: max-age=10000\n",
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - "Cache-CONTROL: max-age=10000\n"
|
| - "Foo: 1\n"
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-Length: 450\n",
|
| -
|
| - "HTTP/1/1 304 Not Modified\n"
|
| - "connection: keep-alive\n"
|
| - "Cache-control: max-age=10001 \n",
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - "Cache-control: max-age=10001\n"
|
| - "Content-Length: 450\n"
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "X-Frame-Options: DENY\n",
|
| -
|
| - "HTTP/1/1 304 Not Modified\n"
|
| - "X-Frame-Options: ALLOW\n",
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - "X-Frame-Options: DENY\n",
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "X-WebKit-CSP: default-src 'none'\n",
|
| -
|
| - "HTTP/1/1 304 Not Modified\n"
|
| - "X-WebKit-CSP: default-src *\n",
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - "X-WebKit-CSP: default-src 'none'\n",
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "X-XSS-Protection: 1\n",
|
| -
|
| - "HTTP/1/1 304 Not Modified\n"
|
| - "X-XSS-Protection: 0\n",
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - "X-XSS-Protection: 1\n",
|
| - },
|
| - { "HTTP/1.1 200 OK\n",
|
| -
|
| - "HTTP/1/1 304 Not Modified\n"
|
| - "X-Content-Type-Options: nosniff\n",
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - },
|
| - };
|
| + {"HTTP/1.1 200 OK\n",
|
| + "HTTP/1/1 304 Not Modified\n"
|
| + "connection: keep-alive\n"
|
| + "Cache-control: max-age=10000\n",
|
| + "HTTP/1.1 200 OK\n"
|
| + "Cache-control: max-age=10000\n"},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Foo: 1\n"
|
| + "Cache-control: private\n",
|
| + "HTTP/1/1 304 Not Modified\n"
|
| + "connection: keep-alive\n"
|
| + "Cache-control: max-age=10000\n",
|
| + "HTTP/1.1 200 OK\n"
|
| + "Cache-control: max-age=10000\n"
|
| + "Foo: 1\n"},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Foo: 1\n"
|
| + "Cache-control: private\n",
|
| + "HTTP/1/1 304 Not Modified\n"
|
| + "connection: keep-alive\n"
|
| + "Cache-CONTROL: max-age=10000\n",
|
| + "HTTP/1.1 200 OK\n"
|
| + "Cache-CONTROL: max-age=10000\n"
|
| + "Foo: 1\n"},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Content-Length: 450\n",
|
| + "HTTP/1/1 304 Not Modified\n"
|
| + "connection: keep-alive\n"
|
| + "Cache-control: max-age=10001 \n",
|
| + "HTTP/1.1 200 OK\n"
|
| + "Cache-control: max-age=10001\n"
|
| + "Content-Length: 450\n"},
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "X-Frame-Options: DENY\n",
|
| + "HTTP/1/1 304 Not Modified\n"
|
| + "X-Frame-Options: ALLOW\n",
|
| + "HTTP/1.1 200 OK\n"
|
| + "X-Frame-Options: DENY\n",
|
| + },
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "X-WebKit-CSP: default-src 'none'\n",
|
| + "HTTP/1/1 304 Not Modified\n"
|
| + "X-WebKit-CSP: default-src *\n",
|
| + "HTTP/1.1 200 OK\n"
|
| + "X-WebKit-CSP: default-src 'none'\n",
|
| + },
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "X-XSS-Protection: 1\n",
|
| + "HTTP/1/1 304 Not Modified\n"
|
| + "X-XSS-Protection: 0\n",
|
| + "HTTP/1.1 200 OK\n"
|
| + "X-XSS-Protection: 1\n",
|
| + },
|
| + {"HTTP/1.1 200 OK\n",
|
| + "HTTP/1/1 304 Not Modified\n"
|
| + "X-Content-Type-Options: nosniff\n",
|
| + "HTTP/1.1 200 OK\n"},
|
| + };
|
|
|
| for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
|
| std::string orig_headers(tests[i].orig_headers);
|
| @@ -992,28 +820,19 @@ TEST(HttpResponseHeadersTest, EnumerateHeaderLines) {
|
| const char* headers;
|
| const char* expected_lines;
|
| } tests[] = {
|
| - { "HTTP/1.1 200 OK\n",
|
| -
|
| - ""
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Foo: 1\n",
|
| -
|
| - "Foo: 1\n"
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Foo: 1\n"
|
| - "Bar: 2\n"
|
| - "Foo: 3\n",
|
| -
|
| - "Foo: 1\nBar: 2\nFoo: 3\n"
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Foo: 1, 2, 3\n",
|
| -
|
| - "Foo: 1, 2, 3\n"
|
| - },
|
| - };
|
| + {"HTTP/1.1 200 OK\n", ""},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Foo: 1\n",
|
| + "Foo: 1\n"},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Foo: 1\n"
|
| + "Bar: 2\n"
|
| + "Foo: 3\n",
|
| + "Foo: 1\nBar: 2\nFoo: 3\n"},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Foo: 1, 2, 3\n",
|
| + "Foo: 1, 2, 3\n"},
|
| + };
|
| for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
|
| std::string headers(tests[i].headers);
|
| HeadersToRaw(&headers);
|
| @@ -1040,64 +859,45 @@ TEST(HttpResponseHeadersTest, IsRedirect) {
|
| const char* location;
|
| bool is_redirect;
|
| } tests[] = {
|
| - { "HTTP/1.1 200 OK\n",
|
| - "",
|
| - false
|
| - },
|
| - { "HTTP/1.1 301 Moved\n"
|
| - "Location: http://foopy/\n",
|
| - "http://foopy/",
|
| - true
|
| - },
|
| - { "HTTP/1.1 301 Moved\n"
|
| - "Location: \t \n",
|
| - "",
|
| - false
|
| - },
|
| - // we use the first location header as the target of the redirect
|
| - { "HTTP/1.1 301 Moved\n"
|
| - "Location: http://foo/\n"
|
| - "Location: http://bar/\n",
|
| - "http://foo/",
|
| - true
|
| - },
|
| - // we use the first _valid_ location header as the target of the redirect
|
| - { "HTTP/1.1 301 Moved\n"
|
| - "Location: \n"
|
| - "Location: http://bar/\n",
|
| - "http://bar/",
|
| - true
|
| - },
|
| - // bug 1050541 (location header w/ an unescaped comma)
|
| - { "HTTP/1.1 301 Moved\n"
|
| - "Location: http://foo/bar,baz.html\n",
|
| - "http://foo/bar,baz.html",
|
| - true
|
| - },
|
| - // bug 1224617 (location header w/ non-ASCII bytes)
|
| - { "HTTP/1.1 301 Moved\n"
|
| - "Location: http://foo/bar?key=\xE4\xF6\xFC\n",
|
| - "http://foo/bar?key=%E4%F6%FC",
|
| - true
|
| - },
|
| - // Shift_JIS, Big5, and GBK contain multibyte characters with the trailing
|
| - // byte falling in the ASCII range.
|
| - { "HTTP/1.1 301 Moved\n"
|
| - "Location: http://foo/bar?key=\x81\x5E\xD8\xBF\n",
|
| - "http://foo/bar?key=%81^%D8%BF",
|
| - true
|
| - },
|
| - { "HTTP/1.1 301 Moved\n"
|
| - "Location: http://foo/bar?key=\x82\x40\xBD\xC4\n",
|
| - "http://foo/bar?key=%82@%BD%C4",
|
| - true
|
| - },
|
| - { "HTTP/1.1 301 Moved\n"
|
| - "Location: http://foo/bar?key=\x83\x5C\x82\x5D\xCB\xD7\n",
|
| - "http://foo/bar?key=%83\\%82]%CB%D7",
|
| - true
|
| - },
|
| - };
|
| + {"HTTP/1.1 200 OK\n", "", false},
|
| + {"HTTP/1.1 301 Moved\n"
|
| + "Location: http://foopy/\n",
|
| + "http://foopy/", true},
|
| + {"HTTP/1.1 301 Moved\n"
|
| + "Location: \t \n",
|
| + "", false},
|
| + // we use the first location header as the target of the redirect
|
| + {"HTTP/1.1 301 Moved\n"
|
| + "Location: http://foo/\n"
|
| + "Location: http://bar/\n",
|
| + "http://foo/", true},
|
| + // we use the first _valid_ location header as the target of the
|
| + // redirect
|
| + {"HTTP/1.1 301 Moved\n"
|
| + "Location: \n"
|
| + "Location: http://bar/\n",
|
| + "http://bar/", true},
|
| + // bug 1050541 (location header w/ an unescaped comma)
|
| + {"HTTP/1.1 301 Moved\n"
|
| + "Location: http://foo/bar,baz.html\n",
|
| + "http://foo/bar,baz.html", true},
|
| + // bug 1224617 (location header w/ non-ASCII bytes)
|
| + {"HTTP/1.1 301 Moved\n"
|
| + "Location: http://foo/bar?key=\xE4\xF6\xFC\n",
|
| + "http://foo/bar?key=%E4%F6%FC", true},
|
| + // Shift_JIS, Big5, and GBK contain multibyte characters with the
|
| + // trailing
|
| + // byte falling in the ASCII range.
|
| + {"HTTP/1.1 301 Moved\n"
|
| + "Location: http://foo/bar?key=\x81\x5E\xD8\xBF\n",
|
| + "http://foo/bar?key=%81^%D8%BF", true},
|
| + {"HTTP/1.1 301 Moved\n"
|
| + "Location: http://foo/bar?key=\x82\x40\xBD\xC4\n",
|
| + "http://foo/bar?key=%82@%BD%C4", true},
|
| + {"HTTP/1.1 301 Moved\n"
|
| + "Location: http://foo/bar?key=\x83\x5C\x82\x5D\xCB\xD7\n",
|
| + "http://foo/bar?key=%83\\%82]%CB%D7", true},
|
| + };
|
| for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
|
| std::string headers(tests[i].headers);
|
| HeadersToRaw(&headers);
|
| @@ -1115,75 +915,57 @@ TEST(HttpResponseHeadersTest, GetContentLength) {
|
| const char* headers;
|
| int64 expected_len;
|
| } tests[] = {
|
| - { "HTTP/1.1 200 OK\n",
|
| - -1
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-Length: 10\n",
|
| - 10
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-Length: \n",
|
| - -1
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-Length: abc\n",
|
| - -1
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-Length: -10\n",
|
| - -1
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-Length: +10\n",
|
| - -1
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-Length: 23xb5\n",
|
| - -1
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-Length: 0xA\n",
|
| - -1
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-Length: 010\n",
|
| - 10
|
| - },
|
| - // Content-Length too big, will overflow an int64
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-Length: 40000000000000000000\n",
|
| - -1
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-Length: 10\n",
|
| - 10
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-Length: 10 \n",
|
| - 10
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-Length: \t10\n",
|
| - 10
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-Length: \v10\n",
|
| - -1
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-Length: \f10\n",
|
| - -1
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "cOnTeNt-LENgth: 33\n",
|
| - 33
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-Length: 34\r\n",
|
| - -1
|
| - },
|
| - };
|
| + {"HTTP/1.1 200 OK\n", -1},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Content-Length: 10\n",
|
| + 10},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Content-Length: \n",
|
| + -1},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Content-Length: abc\n",
|
| + -1},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Content-Length: -10\n",
|
| + -1},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Content-Length: +10\n",
|
| + -1},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Content-Length: 23xb5\n",
|
| + -1},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Content-Length: 0xA\n",
|
| + -1},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Content-Length: 010\n",
|
| + 10},
|
| + // Content-Length too big, will overflow an int64
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Content-Length: 40000000000000000000\n",
|
| + -1},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Content-Length: 10\n",
|
| + 10},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Content-Length: 10 \n",
|
| + 10},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Content-Length: \t10\n",
|
| + 10},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Content-Length: \v10\n",
|
| + -1},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Content-Length: \f10\n",
|
| + -1},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "cOnTeNt-LENgth: 33\n",
|
| + 33},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Content-Length: 34\r\n",
|
| + -1},
|
| + };
|
| for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
|
| std::string headers(tests[i].headers);
|
| HeadersToRaw(&headers);
|
| @@ -1201,240 +983,107 @@ TEST(HttpResponseHeaders, GetContentRange) {
|
| int64 expected_first_byte_position;
|
| int64 expected_last_byte_position;
|
| int64 expected_instance_size;
|
| - } tests[] = {
|
| - { "HTTP/1.1 206 Partial Content",
|
| - false,
|
| - -1,
|
| - -1,
|
| - -1
|
| - },
|
| - { "HTTP/1.1 206 Partial Content\n"
|
| - "Content-Range:",
|
| - false,
|
| - -1,
|
| - -1,
|
| - -1
|
| - },
|
| - { "HTTP/1.1 206 Partial Content\n"
|
| - "Content-Range: megabytes 0-10/50",
|
| - false,
|
| - -1,
|
| - -1,
|
| - -1
|
| - },
|
| - { "HTTP/1.1 206 Partial Content\n"
|
| - "Content-Range: 0-10/50",
|
| - false,
|
| - -1,
|
| - -1,
|
| - -1
|
| - },
|
| - { "HTTP/1.1 206 Partial Content\n"
|
| - "Content-Range: Bytes 0-50/51",
|
| - true,
|
| - 0,
|
| - 50,
|
| - 51
|
| - },
|
| - { "HTTP/1.1 206 Partial Content\n"
|
| - "Content-Range: bytes 0-50/51",
|
| - true,
|
| - 0,
|
| - 50,
|
| - 51
|
| - },
|
| - { "HTTP/1.1 206 Partial Content\n"
|
| - "Content-Range: bytes\t0-50/51",
|
| - false,
|
| - -1,
|
| - -1,
|
| - -1
|
| - },
|
| - { "HTTP/1.1 206 Partial Content\n"
|
| - "Content-Range: bytes 0-50/51",
|
| - true,
|
| - 0,
|
| - 50,
|
| - 51
|
| - },
|
| - { "HTTP/1.1 206 Partial Content\n"
|
| - "Content-Range: bytes 0 - 50 \t / \t51",
|
| - true,
|
| - 0,
|
| - 50,
|
| - 51
|
| - },
|
| - { "HTTP/1.1 206 Partial Content\n"
|
| - "Content-Range: bytes 0\t-\t50\t/\t51\t",
|
| - true,
|
| - 0,
|
| - 50,
|
| - 51
|
| - },
|
| - { "HTTP/1.1 206 Partial Content\n"
|
| - "Content-Range: \tbytes\t\t\t 0\t-\t50\t/\t51\t",
|
| - true,
|
| - 0,
|
| - 50,
|
| - 51
|
| - },
|
| - { "HTTP/1.1 206 Partial Content\n"
|
| - "Content-Range: \t bytes \t 0 - 50 / 5 1",
|
| - false,
|
| - 0,
|
| - 50,
|
| - -1
|
| - },
|
| - { "HTTP/1.1 206 Partial Content\n"
|
| - "Content-Range: \t bytes \t 0 - 5 0 / 51",
|
| - false,
|
| - -1,
|
| - -1,
|
| - -1
|
| - },
|
| - { "HTTP/1.1 206 Partial Content\n"
|
| - "Content-Range: bytes 50-0/51",
|
| - false,
|
| - 50,
|
| - 0,
|
| - -1
|
| - },
|
| - { "HTTP/1.1 416 Requested range not satisfiable\n"
|
| - "Content-Range: bytes * /*",
|
| - false,
|
| - -1,
|
| - -1,
|
| - -1
|
| - },
|
| - { "HTTP/1.1 416 Requested range not satisfiable\n"
|
| - "Content-Range: bytes * / * ",
|
| - false,
|
| - -1,
|
| - -1,
|
| - -1
|
| - },
|
| - { "HTTP/1.1 206 Partial Content\n"
|
| - "Content-Range: bytes 0-50/*",
|
| - false,
|
| - 0,
|
| - 50,
|
| - -1
|
| - },
|
| - { "HTTP/1.1 206 Partial Content\n"
|
| - "Content-Range: bytes 0-50 / * ",
|
| - false,
|
| - 0,
|
| - 50,
|
| - -1
|
| - },
|
| - { "HTTP/1.1 206 Partial Content\n"
|
| - "Content-Range: bytes 0-10000000000/10000000001",
|
| - true,
|
| - 0,
|
| - 10000000000ll,
|
| - 10000000001ll
|
| - },
|
| - { "HTTP/1.1 206 Partial Content\n"
|
| - "Content-Range: bytes 0-10000000000/10000000000",
|
| - false,
|
| - 0,
|
| - 10000000000ll,
|
| - 10000000000ll
|
| - },
|
| - // 64 bits wraparound.
|
| - { "HTTP/1.1 206 Partial Content\n"
|
| - "Content-Range: bytes 0 - 9223372036854775807 / 100",
|
| - false,
|
| - 0,
|
| - kint64max,
|
| - 100
|
| - },
|
| - // 64 bits wraparound.
|
| - { "HTTP/1.1 206 Partial Content\n"
|
| - "Content-Range: bytes 0 - 100 / -9223372036854775808",
|
| - false,
|
| - 0,
|
| - 100,
|
| - kint64min
|
| - },
|
| - { "HTTP/1.1 206 Partial Content\n"
|
| - "Content-Range: bytes */50",
|
| - false,
|
| - -1,
|
| - -1,
|
| - 50
|
| - },
|
| - { "HTTP/1.1 206 Partial Content\n"
|
| - "Content-Range: bytes 0-50/10",
|
| - false,
|
| - 0,
|
| - 50,
|
| - 10
|
| - },
|
| - { "HTTP/1.1 206 Partial Content\n"
|
| - "Content-Range: bytes 40-50/45",
|
| - false,
|
| - 40,
|
| - 50,
|
| - 45
|
| - },
|
| - { "HTTP/1.1 206 Partial Content\n"
|
| - "Content-Range: bytes 0-50/-10",
|
| - false,
|
| - 0,
|
| - 50,
|
| - -10
|
| - },
|
| - { "HTTP/1.1 206 Partial Content\n"
|
| - "Content-Range: bytes 0-0/1",
|
| - true,
|
| - 0,
|
| - 0,
|
| - 1
|
| - },
|
| - { "HTTP/1.1 206 Partial Content\n"
|
| - "Content-Range: bytes 0-40000000000000000000/40000000000000000001",
|
| - false,
|
| - -1,
|
| - -1,
|
| - -1
|
| - },
|
| - { "HTTP/1.1 206 Partial Content\n"
|
| - "Content-Range: bytes 1-/100",
|
| - false,
|
| - -1,
|
| - -1,
|
| - -1
|
| - },
|
| - { "HTTP/1.1 206 Partial Content\n"
|
| - "Content-Range: bytes -/100",
|
| - false,
|
| - -1,
|
| - -1,
|
| - -1
|
| - },
|
| - { "HTTP/1.1 206 Partial Content\n"
|
| - "Content-Range: bytes -1/100",
|
| - false,
|
| - -1,
|
| - -1,
|
| - -1
|
| - },
|
| - { "HTTP/1.1 206 Partial Content\n"
|
| - "Content-Range: bytes 0-1233/*",
|
| - false,
|
| - 0,
|
| - 1233,
|
| - -1
|
| - },
|
| - { "HTTP/1.1 206 Partial Content\n"
|
| - "Content-Range: bytes -123 - -1/100",
|
| - false,
|
| - -1,
|
| - -1,
|
| - -1
|
| - },
|
| - };
|
| + } tests[] = {
|
| + {"HTTP/1.1 206 Partial Content", false, -1, -1, -1},
|
| + {"HTTP/1.1 206 Partial Content\n"
|
| + "Content-Range:",
|
| + false, -1, -1, -1},
|
| + {"HTTP/1.1 206 Partial Content\n"
|
| + "Content-Range: megabytes 0-10/50",
|
| + false, -1, -1, -1},
|
| + {"HTTP/1.1 206 Partial Content\n"
|
| + "Content-Range: 0-10/50",
|
| + false, -1, -1, -1},
|
| + {"HTTP/1.1 206 Partial Content\n"
|
| + "Content-Range: Bytes 0-50/51",
|
| + true, 0, 50, 51},
|
| + {"HTTP/1.1 206 Partial Content\n"
|
| + "Content-Range: bytes 0-50/51",
|
| + true, 0, 50, 51},
|
| + {"HTTP/1.1 206 Partial Content\n"
|
| + "Content-Range: bytes\t0-50/51",
|
| + false, -1, -1, -1},
|
| + {"HTTP/1.1 206 Partial Content\n"
|
| + "Content-Range: bytes 0-50/51",
|
| + true, 0, 50, 51},
|
| + {"HTTP/1.1 206 Partial Content\n"
|
| + "Content-Range: bytes 0 - 50 \t / \t51",
|
| + true, 0, 50, 51},
|
| + {"HTTP/1.1 206 Partial Content\n"
|
| + "Content-Range: bytes 0\t-\t50\t/\t51\t",
|
| + true, 0, 50, 51},
|
| + {"HTTP/1.1 206 Partial Content\n"
|
| + "Content-Range: \tbytes\t\t\t 0\t-\t50\t/\t51\t",
|
| + true, 0, 50, 51},
|
| + {"HTTP/1.1 206 Partial Content\n"
|
| + "Content-Range: \t bytes \t 0 - 50 / 5 1",
|
| + false, 0, 50, -1},
|
| + {"HTTP/1.1 206 Partial Content\n"
|
| + "Content-Range: \t bytes \t 0 - 5 0 / 51",
|
| + false, -1, -1, -1},
|
| + {"HTTP/1.1 206 Partial Content\n"
|
| + "Content-Range: bytes 50-0/51",
|
| + false, 50, 0, -1},
|
| + {"HTTP/1.1 416 Requested range not satisfiable\n"
|
| + "Content-Range: bytes * /*",
|
| + false, -1, -1, -1},
|
| + {"HTTP/1.1 416 Requested range not satisfiable\n"
|
| + "Content-Range: bytes * / * ",
|
| + false, -1, -1, -1},
|
| + {"HTTP/1.1 206 Partial Content\n"
|
| + "Content-Range: bytes 0-50/*",
|
| + false, 0, 50, -1},
|
| + {"HTTP/1.1 206 Partial Content\n"
|
| + "Content-Range: bytes 0-50 / * ",
|
| + false, 0, 50, -1},
|
| + {"HTTP/1.1 206 Partial Content\n"
|
| + "Content-Range: bytes 0-10000000000/10000000001",
|
| + true, 0, 10000000000ll, 10000000001ll},
|
| + {"HTTP/1.1 206 Partial Content\n"
|
| + "Content-Range: bytes 0-10000000000/10000000000",
|
| + false, 0, 10000000000ll, 10000000000ll},
|
| + // 64 bits wraparound.
|
| + {"HTTP/1.1 206 Partial Content\n"
|
| + "Content-Range: bytes 0 - 9223372036854775807 / 100",
|
| + false, 0, kint64max, 100},
|
| + // 64 bits wraparound.
|
| + {"HTTP/1.1 206 Partial Content\n"
|
| + "Content-Range: bytes 0 - 100 / -9223372036854775808",
|
| + false, 0, 100, kint64min},
|
| + {"HTTP/1.1 206 Partial Content\n"
|
| + "Content-Range: bytes */50",
|
| + false, -1, -1, 50},
|
| + {"HTTP/1.1 206 Partial Content\n"
|
| + "Content-Range: bytes 0-50/10",
|
| + false, 0, 50, 10},
|
| + {"HTTP/1.1 206 Partial Content\n"
|
| + "Content-Range: bytes 40-50/45",
|
| + false, 40, 50, 45},
|
| + {"HTTP/1.1 206 Partial Content\n"
|
| + "Content-Range: bytes 0-50/-10",
|
| + false, 0, 50, -10},
|
| + {"HTTP/1.1 206 Partial Content\n"
|
| + "Content-Range: bytes 0-0/1",
|
| + true, 0, 0, 1},
|
| + {"HTTP/1.1 206 Partial Content\n"
|
| + "Content-Range: bytes 0-40000000000000000000/40000000000000000001",
|
| + false, -1, -1, -1},
|
| + {"HTTP/1.1 206 Partial Content\n"
|
| + "Content-Range: bytes 1-/100",
|
| + false, -1, -1, -1},
|
| + {"HTTP/1.1 206 Partial Content\n"
|
| + "Content-Range: bytes -/100",
|
| + false, -1, -1, -1},
|
| + {"HTTP/1.1 206 Partial Content\n"
|
| + "Content-Range: bytes -1/100",
|
| + false, -1, -1, -1},
|
| + {"HTTP/1.1 206 Partial Content\n"
|
| + "Content-Range: bytes 0-1233/*",
|
| + false, 0, 1233, -1},
|
| + {"HTTP/1.1 206 Partial Content\n"
|
| + "Content-Range: bytes -123 - -1/100",
|
| + false, -1, -1, -1},
|
| + };
|
| for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
|
| std::string headers(tests[i].headers);
|
| HeadersToRaw(&headers);
|
| @@ -1444,9 +1093,8 @@ TEST(HttpResponseHeaders, GetContentRange) {
|
| int64 first_byte_position;
|
| int64 last_byte_position;
|
| int64 instance_size;
|
| - bool return_value = parsed->GetContentRange(&first_byte_position,
|
| - &last_byte_position,
|
| - &instance_size);
|
| + bool return_value = parsed->GetContentRange(
|
| + &first_byte_position, &last_byte_position, &instance_size);
|
| EXPECT_EQ(tests[i].expected_return_value, return_value);
|
| EXPECT_EQ(tests[i].expected_first_byte_position, first_byte_position);
|
| EXPECT_EQ(tests[i].expected_last_byte_position, last_byte_position);
|
| @@ -1458,65 +1106,49 @@ TEST(HttpResponseHeadersTest, IsKeepAlive) {
|
| const struct {
|
| const char* headers;
|
| bool expected_keep_alive;
|
| - } tests[] = {
|
| - // The status line fabricated by HttpNetworkTransaction for a 0.9 response.
|
| - // Treated as 0.9.
|
| - { "HTTP/0.9 200 OK",
|
| - false
|
| - },
|
| - // This could come from a broken server. Treated as 1.0 because it has a
|
| - // header.
|
| - { "HTTP/0.9 200 OK\n"
|
| - "connection: keep-alive\n",
|
| - true
|
| - },
|
| - { "HTTP/1.1 200 OK\n",
|
| - true
|
| - },
|
| - { "HTTP/1.0 200 OK\n",
|
| - false
|
| - },
|
| - { "HTTP/1.0 200 OK\n"
|
| - "connection: close\n",
|
| - false
|
| - },
|
| - { "HTTP/1.0 200 OK\n"
|
| - "connection: keep-alive\n",
|
| - true
|
| - },
|
| - { "HTTP/1.0 200 OK\n"
|
| - "connection: kEeP-AliVe\n",
|
| - true
|
| - },
|
| - { "HTTP/1.0 200 OK\n"
|
| - "connection: keep-aliveX\n",
|
| - false
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "connection: close\n",
|
| - false
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "connection: keep-alive\n",
|
| - true
|
| - },
|
| - { "HTTP/1.0 200 OK\n"
|
| - "proxy-connection: close\n",
|
| - false
|
| - },
|
| - { "HTTP/1.0 200 OK\n"
|
| - "proxy-connection: keep-alive\n",
|
| - true
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "proxy-connection: close\n",
|
| - false
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "proxy-connection: keep-alive\n",
|
| - true
|
| - },
|
| - };
|
| + } tests[] = {// The status line fabricated by HttpNetworkTransaction for a 0.9
|
| + // response.
|
| + // Treated as 0.9.
|
| + {"HTTP/0.9 200 OK", false},
|
| + // This could come from a broken server. Treated as 1.0 because
|
| + // it has a
|
| + // header.
|
| + {"HTTP/0.9 200 OK\n"
|
| + "connection: keep-alive\n",
|
| + true},
|
| + {"HTTP/1.1 200 OK\n", true},
|
| + {"HTTP/1.0 200 OK\n", false},
|
| + {"HTTP/1.0 200 OK\n"
|
| + "connection: close\n",
|
| + false},
|
| + {"HTTP/1.0 200 OK\n"
|
| + "connection: keep-alive\n",
|
| + true},
|
| + {"HTTP/1.0 200 OK\n"
|
| + "connection: kEeP-AliVe\n",
|
| + true},
|
| + {"HTTP/1.0 200 OK\n"
|
| + "connection: keep-aliveX\n",
|
| + false},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "connection: close\n",
|
| + false},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "connection: keep-alive\n",
|
| + true},
|
| + {"HTTP/1.0 200 OK\n"
|
| + "proxy-connection: close\n",
|
| + false},
|
| + {"HTTP/1.0 200 OK\n"
|
| + "proxy-connection: keep-alive\n",
|
| + true},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "proxy-connection: close\n",
|
| + false},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "proxy-connection: keep-alive\n",
|
| + true},
|
| + };
|
| for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
|
| std::string headers(tests[i].headers);
|
| HeadersToRaw(&headers);
|
| @@ -1531,75 +1163,63 @@ TEST(HttpResponseHeadersTest, HasStrongValidators) {
|
| const struct {
|
| const char* headers;
|
| bool expected_result;
|
| - } tests[] = {
|
| - { "HTTP/0.9 200 OK",
|
| - false
|
| - },
|
| - { "HTTP/1.0 200 OK\n"
|
| - "Date: Wed, 28 Nov 2007 01:40:10 GMT\n"
|
| - "Last-Modified: Wed, 28 Nov 2007 00:40:10 GMT\n"
|
| - "ETag: \"foo\"\n",
|
| - false
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Date: Wed, 28 Nov 2007 01:40:10 GMT\n"
|
| - "Last-Modified: Wed, 28 Nov 2007 00:40:10 GMT\n"
|
| - "ETag: \"foo\"\n",
|
| - true
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Date: Wed, 28 Nov 2007 00:41:10 GMT\n"
|
| - "Last-Modified: Wed, 28 Nov 2007 00:40:10 GMT\n",
|
| - true
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Date: Wed, 28 Nov 2007 00:41:09 GMT\n"
|
| - "Last-Modified: Wed, 28 Nov 2007 00:40:10 GMT\n",
|
| - false
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "ETag: \"foo\"\n",
|
| - true
|
| - },
|
| - // This is not really a weak etag:
|
| - { "HTTP/1.1 200 OK\n"
|
| - "etag: \"w/foo\"\n",
|
| - true
|
| - },
|
| - // This is a weak etag:
|
| - { "HTTP/1.1 200 OK\n"
|
| - "etag: w/\"foo\"\n",
|
| - false
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "etag: W / \"foo\"\n",
|
| - false
|
| - }
|
| - };
|
| + } tests[] = {{"HTTP/0.9 200 OK", false},
|
| + {"HTTP/1.0 200 OK\n"
|
| + "Date: Wed, 28 Nov 2007 01:40:10 GMT\n"
|
| + "Last-Modified: Wed, 28 Nov 2007 00:40:10 GMT\n"
|
| + "ETag: \"foo\"\n",
|
| + false},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Date: Wed, 28 Nov 2007 01:40:10 GMT\n"
|
| + "Last-Modified: Wed, 28 Nov 2007 00:40:10 GMT\n"
|
| + "ETag: \"foo\"\n",
|
| + true},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Date: Wed, 28 Nov 2007 00:41:10 GMT\n"
|
| + "Last-Modified: Wed, 28 Nov 2007 00:40:10 GMT\n",
|
| + true},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "Date: Wed, 28 Nov 2007 00:41:09 GMT\n"
|
| + "Last-Modified: Wed, 28 Nov 2007 00:40:10 GMT\n",
|
| + false},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "ETag: \"foo\"\n",
|
| + true},
|
| + // This is not really a weak etag:
|
| + {"HTTP/1.1 200 OK\n"
|
| + "etag: \"w/foo\"\n",
|
| + true},
|
| + // This is a weak etag:
|
| + {"HTTP/1.1 200 OK\n"
|
| + "etag: w/\"foo\"\n",
|
| + false},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "etag: W / \"foo\"\n",
|
| + false}};
|
| for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
|
| std::string headers(tests[i].headers);
|
| HeadersToRaw(&headers);
|
| scoped_refptr<net::HttpResponseHeaders> parsed(
|
| new net::HttpResponseHeaders(headers));
|
|
|
| - EXPECT_EQ(tests[i].expected_result, parsed->HasStrongValidators()) <<
|
| - "Failed test case " << i;
|
| + EXPECT_EQ(tests[i].expected_result, parsed->HasStrongValidators())
|
| + << "Failed test case " << i;
|
| }
|
| }
|
|
|
| TEST(HttpResponseHeadersTest, GetStatusText) {
|
| std::string headers("HTTP/1.1 404 Not Found");
|
| HeadersToRaw(&headers);
|
| - scoped_refptr<net::HttpResponseHeaders> parsed(
|
| - new net::HttpResponseHeaders(headers));
|
| + scoped_refptr<net::HttpResponseHeaders> parsed(
|
| + new net::HttpResponseHeaders(headers));
|
| EXPECT_EQ(std::string("Not Found"), parsed->GetStatusText());
|
| }
|
|
|
| TEST(HttpResponseHeadersTest, GetStatusTextMissing) {
|
| std::string headers("HTTP/1.1 404");
|
| HeadersToRaw(&headers);
|
| - scoped_refptr<net::HttpResponseHeaders> parsed(
|
| - new net::HttpResponseHeaders(headers));
|
| + scoped_refptr<net::HttpResponseHeaders> parsed(
|
| + new net::HttpResponseHeaders(headers));
|
| // Since the status line gets normalized, we have OK
|
| EXPECT_EQ(std::string("OK"), parsed->GetStatusText());
|
| }
|
| @@ -1607,16 +1227,16 @@ TEST(HttpResponseHeadersTest, GetStatusTextMissing) {
|
| TEST(HttpResponseHeadersTest, GetStatusTextMultiSpace) {
|
| std::string headers("HTTP/1.0 404 Not Found");
|
| HeadersToRaw(&headers);
|
| - scoped_refptr<net::HttpResponseHeaders> parsed(
|
| - new net::HttpResponseHeaders(headers));
|
| + scoped_refptr<net::HttpResponseHeaders> parsed(
|
| + new net::HttpResponseHeaders(headers));
|
| EXPECT_EQ(std::string("Not Found"), parsed->GetStatusText());
|
| }
|
|
|
| TEST(HttpResponseHeadersTest, GetStatusBadStatusLine) {
|
| std::string headers("Foo bar.");
|
| HeadersToRaw(&headers);
|
| - scoped_refptr<net::HttpResponseHeaders> parsed(
|
| - new net::HttpResponseHeaders(headers));
|
| + scoped_refptr<net::HttpResponseHeaders> parsed(
|
| + new net::HttpResponseHeaders(headers));
|
| // The bad status line would have gotten rewritten as
|
| // HTTP/1.0 200 OK.
|
| EXPECT_EQ(std::string("OK"), parsed->GetStatusText());
|
| @@ -1628,29 +1248,23 @@ TEST(HttpResponseHeadersTest, AddHeader) {
|
| const char* new_header;
|
| const char* expected_headers;
|
| } tests[] = {
|
| - { "HTTP/1.1 200 OK\n"
|
| - "connection: keep-alive\n"
|
| - "Cache-control: max-age=10000\n",
|
| -
|
| - "Content-Length: 450",
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - "connection: keep-alive\n"
|
| - "Cache-control: max-age=10000\n"
|
| - "Content-Length: 450\n"
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "connection: keep-alive\n"
|
| - "Cache-control: max-age=10000 \n",
|
| -
|
| - "Content-Length: 450 ",
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - "connection: keep-alive\n"
|
| - "Cache-control: max-age=10000\n"
|
| - "Content-Length: 450\n"
|
| - },
|
| - };
|
| + {"HTTP/1.1 200 OK\n"
|
| + "connection: keep-alive\n"
|
| + "Cache-control: max-age=10000\n",
|
| + "Content-Length: 450",
|
| + "HTTP/1.1 200 OK\n"
|
| + "connection: keep-alive\n"
|
| + "Cache-control: max-age=10000\n"
|
| + "Content-Length: 450\n"},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "connection: keep-alive\n"
|
| + "Cache-control: max-age=10000 \n",
|
| + "Content-Length: 450 ",
|
| + "HTTP/1.1 200 OK\n"
|
| + "connection: keep-alive\n"
|
| + "Cache-control: max-age=10000\n"
|
| + "Content-Length: 450\n"},
|
| + };
|
|
|
| for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
|
| std::string orig_headers(tests[i].orig_headers);
|
| @@ -1673,29 +1287,23 @@ TEST(HttpResponseHeadersTest, RemoveHeader) {
|
| const char* to_remove;
|
| const char* expected_headers;
|
| } tests[] = {
|
| - { "HTTP/1.1 200 OK\n"
|
| - "connection: keep-alive\n"
|
| - "Cache-control: max-age=10000\n"
|
| - "Content-Length: 450\n",
|
| -
|
| - "Content-Length",
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - "connection: keep-alive\n"
|
| - "Cache-control: max-age=10000\n"
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "connection: keep-alive \n"
|
| - "Content-Length : 450 \n"
|
| - "Cache-control: max-age=10000\n",
|
| -
|
| - "Content-Length",
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - "connection: keep-alive\n"
|
| - "Cache-control: max-age=10000\n"
|
| - },
|
| - };
|
| + {"HTTP/1.1 200 OK\n"
|
| + "connection: keep-alive\n"
|
| + "Cache-control: max-age=10000\n"
|
| + "Content-Length: 450\n",
|
| + "Content-Length",
|
| + "HTTP/1.1 200 OK\n"
|
| + "connection: keep-alive\n"
|
| + "Cache-control: max-age=10000\n"},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "connection: keep-alive \n"
|
| + "Content-Length : 450 \n"
|
| + "Cache-control: max-age=10000\n",
|
| + "Content-Length",
|
| + "HTTP/1.1 200 OK\n"
|
| + "connection: keep-alive\n"
|
| + "Cache-control: max-age=10000\n"},
|
| + };
|
|
|
| for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
|
| std::string orig_headers(tests[i].orig_headers);
|
| @@ -1719,76 +1327,54 @@ TEST(HttpResponseHeadersTest, RemoveIndividualHeader) {
|
| const char* to_remove_value;
|
| const char* expected_headers;
|
| } tests[] = {
|
| - { "HTTP/1.1 200 OK\n"
|
| - "connection: keep-alive\n"
|
| - "Cache-control: max-age=10000\n"
|
| - "Content-Length: 450\n",
|
| -
|
| - "Content-Length",
|
| -
|
| - "450",
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - "connection: keep-alive\n"
|
| - "Cache-control: max-age=10000\n"
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "connection: keep-alive \n"
|
| - "Content-Length : 450 \n"
|
| - "Cache-control: max-age=10000\n",
|
| -
|
| - "Content-Length",
|
| -
|
| - "450",
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - "connection: keep-alive\n"
|
| - "Cache-control: max-age=10000\n"
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "connection: keep-alive \n"
|
| - "Content-Length: 450\n"
|
| - "Cache-control: max-age=10000\n",
|
| -
|
| - "Content-Length", // Matching name.
|
| -
|
| - "999", // Mismatching value.
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - "connection: keep-alive\n"
|
| - "Content-Length: 450\n"
|
| - "Cache-control: max-age=10000\n"
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "connection: keep-alive \n"
|
| - "Foo: bar, baz\n"
|
| - "Foo: bar\n"
|
| - "Cache-control: max-age=10000\n",
|
| -
|
| - "Foo",
|
| -
|
| - "bar, baz", // Space in value.
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - "connection: keep-alive\n"
|
| - "Foo: bar\n"
|
| - "Cache-control: max-age=10000\n"
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "connection: keep-alive \n"
|
| - "Foo: bar, baz\n"
|
| - "Cache-control: max-age=10000\n",
|
| -
|
| - "Foo",
|
| -
|
| - "baz", // Only partial match -> ignored.
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - "connection: keep-alive\n"
|
| - "Foo: bar, baz\n"
|
| - "Cache-control: max-age=10000\n"
|
| - },
|
| - };
|
| + {"HTTP/1.1 200 OK\n"
|
| + "connection: keep-alive\n"
|
| + "Cache-control: max-age=10000\n"
|
| + "Content-Length: 450\n",
|
| + "Content-Length", "450",
|
| + "HTTP/1.1 200 OK\n"
|
| + "connection: keep-alive\n"
|
| + "Cache-control: max-age=10000\n"},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "connection: keep-alive \n"
|
| + "Content-Length : 450 \n"
|
| + "Cache-control: max-age=10000\n",
|
| + "Content-Length", "450",
|
| + "HTTP/1.1 200 OK\n"
|
| + "connection: keep-alive\n"
|
| + "Cache-control: max-age=10000\n"},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "connection: keep-alive \n"
|
| + "Content-Length: 450\n"
|
| + "Cache-control: max-age=10000\n",
|
| + "Content-Length", // Matching name.
|
| + "999", // Mismatching value.
|
| + "HTTP/1.1 200 OK\n"
|
| + "connection: keep-alive\n"
|
| + "Content-Length: 450\n"
|
| + "Cache-control: max-age=10000\n"},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "connection: keep-alive \n"
|
| + "Foo: bar, baz\n"
|
| + "Foo: bar\n"
|
| + "Cache-control: max-age=10000\n",
|
| + "Foo",
|
| + "bar, baz", // Space in value.
|
| + "HTTP/1.1 200 OK\n"
|
| + "connection: keep-alive\n"
|
| + "Foo: bar\n"
|
| + "Cache-control: max-age=10000\n"},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "connection: keep-alive \n"
|
| + "Foo: bar, baz\n"
|
| + "Cache-control: max-age=10000\n",
|
| + "Foo",
|
| + "baz", // Only partial match -> ignored.
|
| + "HTTP/1.1 200 OK\n"
|
| + "connection: keep-alive\n"
|
| + "Foo: bar, baz\n"
|
| + "Cache-control: max-age=10000\n"},
|
| + };
|
|
|
| for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
|
| std::string orig_headers(tests[i].orig_headers);
|
| @@ -1812,39 +1398,30 @@ TEST(HttpResponseHeadersTest, ReplaceStatus) {
|
| const char* new_status;
|
| const char* expected_headers;
|
| } tests[] = {
|
| - { "HTTP/1.1 206 Partial Content\n"
|
| - "connection: keep-alive\n"
|
| - "Cache-control: max-age=10000\n"
|
| - "Content-Length: 450\n",
|
| -
|
| - "HTTP/1.1 200 OK",
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - "connection: keep-alive\n"
|
| - "Cache-control: max-age=10000\n"
|
| - "Content-Length: 450\n"
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "connection: keep-alive\n",
|
| -
|
| - "HTTP/1.1 304 Not Modified",
|
| -
|
| - "HTTP/1.1 304 Not Modified\n"
|
| - "connection: keep-alive\n"
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "connection: keep-alive \n"
|
| - "Content-Length : 450 \n"
|
| - "Cache-control: max-age=10000\n",
|
| -
|
| - "HTTP/1//1 304 Not Modified",
|
| -
|
| - "HTTP/1.0 304 Not Modified\n"
|
| - "connection: keep-alive\n"
|
| - "Content-Length: 450\n"
|
| - "Cache-control: max-age=10000\n"
|
| - },
|
| - };
|
| + {"HTTP/1.1 206 Partial Content\n"
|
| + "connection: keep-alive\n"
|
| + "Cache-control: max-age=10000\n"
|
| + "Content-Length: 450\n",
|
| + "HTTP/1.1 200 OK",
|
| + "HTTP/1.1 200 OK\n"
|
| + "connection: keep-alive\n"
|
| + "Cache-control: max-age=10000\n"
|
| + "Content-Length: 450\n"},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "connection: keep-alive\n",
|
| + "HTTP/1.1 304 Not Modified",
|
| + "HTTP/1.1 304 Not Modified\n"
|
| + "connection: keep-alive\n"},
|
| + {"HTTP/1.1 200 OK\n"
|
| + "connection: keep-alive \n"
|
| + "Content-Length : 450 \n"
|
| + "Cache-control: max-age=10000\n",
|
| + "HTTP/1//1 304 Not Modified",
|
| + "HTTP/1.0 304 Not Modified\n"
|
| + "connection: keep-alive\n"
|
| + "Content-Length: 450\n"
|
| + "Cache-control: max-age=10000\n"},
|
| + };
|
|
|
| for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
|
| std::string orig_headers(tests[i].orig_headers);
|
| @@ -1867,29 +1444,27 @@ TEST(HttpResponseHeadersTest, UpdateWithNewRange) {
|
| const char* expected_headers;
|
| const char* expected_headers_with_replaced_status;
|
| } tests[] = {
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-Length: 450\n",
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - "Content-Range: bytes 3-5/450\n"
|
| - "Content-Length: 3\n",
|
| -
|
| - "HTTP/1.1 206 Partial Content\n"
|
| - "Content-Range: bytes 3-5/450\n"
|
| - "Content-Length: 3\n",
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-Length: 5\n",
|
| -
|
| - "HTTP/1.1 200 OK\n"
|
| - "Content-Range: bytes 3-5/5\n"
|
| - "Content-Length: 3\n",
|
| -
|
| - "HTTP/1.1 206 Partial Content\n"
|
| - "Content-Range: bytes 3-5/5\n"
|
| - "Content-Length: 3\n",
|
| - },
|
| - };
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "Content-Length: 450\n",
|
| + "HTTP/1.1 200 OK\n"
|
| + "Content-Range: bytes 3-5/450\n"
|
| + "Content-Length: 3\n",
|
| + "HTTP/1.1 206 Partial Content\n"
|
| + "Content-Range: bytes 3-5/450\n"
|
| + "Content-Length: 3\n",
|
| + },
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "Content-Length: 5\n",
|
| + "HTTP/1.1 200 OK\n"
|
| + "Content-Range: bytes 3-5/5\n"
|
| + "Content-Length: 3\n",
|
| + "HTTP/1.1 206 Partial Content\n"
|
| + "Content-Range: bytes 3-5/5\n"
|
| + "Content-Length: 3\n",
|
| + },
|
| + };
|
| const net::HttpByteRange range = net::HttpByteRange::Bounded(3, 5);
|
|
|
| for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
|
| @@ -1914,9 +1489,10 @@ TEST(HttpResponseHeadersTest, UpdateWithNewRange) {
|
| }
|
|
|
| TEST(HttpResponseHeadersTest, ToNetLogParamAndBackAgain) {
|
| - std::string headers("HTTP/1.1 404\n"
|
| - "Content-Length: 450\n"
|
| - "Connection: keep-alive\n");
|
| + std::string headers(
|
| + "HTTP/1.1 404\n"
|
| + "Content-Length: 450\n"
|
| + "Connection: keep-alive\n");
|
| HeadersToRaw(&headers);
|
| scoped_refptr<net::HttpResponseHeaders> parsed(
|
| new net::HttpResponseHeaders(headers));
|
| @@ -1925,8 +1501,8 @@ TEST(HttpResponseHeadersTest, ToNetLogParamAndBackAgain) {
|
| parsed->NetLogCallback(net::NetLog::LOG_ALL_BUT_BYTES));
|
| scoped_refptr<net::HttpResponseHeaders> recreated;
|
|
|
| - ASSERT_TRUE(net::HttpResponseHeaders::FromNetLogParam(event_param.get(),
|
| - &recreated));
|
| + ASSERT_TRUE(
|
| + net::HttpResponseHeaders::FromNetLogParam(event_param.get(), &recreated));
|
| ASSERT_TRUE(recreated.get());
|
| EXPECT_EQ(parsed->GetHttpVersion(), recreated->GetHttpVersion());
|
| EXPECT_EQ(parsed->response_code(), recreated->response_code());
|
| @@ -1943,155 +1519,137 @@ TEST(HttpResponseHeadersTest, ToNetLogParamAndBackAgain) {
|
| #if defined(SPDY_PROXY_AUTH_ORIGIN)
|
| TEST(HttpResponseHeadersTest, GetProxyBypassInfo) {
|
| const struct {
|
| - const char* headers;
|
| - bool expected_result;
|
| - int64 expected_retry_delay;
|
| - bool expected_bypass_all;
|
| + const char* headers;
|
| + bool expected_result;
|
| + int64 expected_retry_delay;
|
| + bool expected_bypass_all;
|
| } tests[] = {
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Content-Length: 999\n",
|
| - false,
|
| - 0,
|
| - false,
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "connection: keep-alive\n"
|
| - "Content-Length: 999\n",
|
| - false,
|
| - 0,
|
| - false,
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "connection: keep-alive\n"
|
| - "Chrome-Proxy: bypass=86400\n"
|
| - "Content-Length: 999\n",
|
| - true,
|
| - 86400,
|
| - false,
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "connection: keep-alive\n"
|
| - "Chrome-Proxy: bypass=0\n"
|
| - "Content-Length: 999\n",
|
| - true,
|
| - 0,
|
| - false,
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "connection: keep-alive\n"
|
| - "Chrome-Proxy: bypass=-1\n"
|
| - "Content-Length: 999\n",
|
| - false,
|
| - 0,
|
| - false,
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "connection: keep-alive\n"
|
| - "Chrome-Proxy: bypass=xyz\n"
|
| - "Content-Length: 999\n",
|
| - false,
|
| - 0,
|
| - false,
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "connection: keep-alive\n"
|
| - "Chrome-Proxy: bypass\n"
|
| - "Content-Length: 999\n",
|
| - false,
|
| - 0,
|
| - false,
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "connection: keep-alive\n"
|
| - "Chrome-Proxy: foo=abc, bypass=86400\n"
|
| - "Content-Length: 999\n",
|
| - true,
|
| - 86400,
|
| - false,
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "connection: keep-alive\n"
|
| - "Chrome-Proxy: bypass=86400, bar=abc\n"
|
| - "Content-Length: 999\n",
|
| - true,
|
| - 86400,
|
| - false,
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "connection: keep-alive\n"
|
| - "Chrome-Proxy: bypass=3600\n"
|
| - "Chrome-Proxy: bypass=86400\n"
|
| - "Content-Length: 999\n",
|
| - true,
|
| - 3600,
|
| - false,
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "connection: keep-alive\n"
|
| - "Chrome-Proxy: bypass=3600, bypass=86400\n"
|
| - "Content-Length: 999\n",
|
| - true,
|
| - 3600,
|
| - false,
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "connection: keep-alive\n"
|
| - "Chrome-Proxy: bypass=, bypass=86400\n"
|
| - "Content-Length: 999\n",
|
| - true,
|
| - 86400,
|
| - false,
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "connection: keep-alive\n"
|
| - "Chrome-Proxy: bypass\n"
|
| - "Chrome-Proxy: bypass=86400\n"
|
| - "Content-Length: 999\n",
|
| - true,
|
| - 86400,
|
| - false,
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "connection: keep-alive\n"
|
| - "Chrome-Proxy: block=, block=3600\n"
|
| - "Content-Length: 999\n",
|
| - true,
|
| - 3600,
|
| - true,
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "connection: keep-alive\n"
|
| - "Chrome-Proxy: bypass=86400, block=3600\n"
|
| - "Content-Length: 999\n",
|
| - true,
|
| - 3600,
|
| - true,
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "connection: proxy-bypass\n"
|
| - "Chrome-Proxy: block=, bypass=86400\n"
|
| - "Content-Length: 999\n",
|
| - true,
|
| - 86400,
|
| - false,
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "connection: proxy-bypass\n"
|
| - "Chrome-Proxy: block=-1\n"
|
| - "Content-Length: 999\n",
|
| - false,
|
| - 0,
|
| - false,
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "connection: proxy-bypass\n"
|
| - "Chrome-Proxy: block=99999999999999999999\n"
|
| - "Content-Length: 999\n",
|
| - false,
|
| - 0,
|
| - false,
|
| - },
|
| - };
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "Content-Length: 999\n",
|
| + false, 0, false,
|
| + },
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "connection: keep-alive\n"
|
| + "Content-Length: 999\n",
|
| + false, 0, false,
|
| + },
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "connection: keep-alive\n"
|
| + "Chrome-Proxy: bypass=86400\n"
|
| + "Content-Length: 999\n",
|
| + true, 86400, false,
|
| + },
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "connection: keep-alive\n"
|
| + "Chrome-Proxy: bypass=0\n"
|
| + "Content-Length: 999\n",
|
| + true, 0, false,
|
| + },
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "connection: keep-alive\n"
|
| + "Chrome-Proxy: bypass=-1\n"
|
| + "Content-Length: 999\n",
|
| + false, 0, false,
|
| + },
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "connection: keep-alive\n"
|
| + "Chrome-Proxy: bypass=xyz\n"
|
| + "Content-Length: 999\n",
|
| + false, 0, false,
|
| + },
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "connection: keep-alive\n"
|
| + "Chrome-Proxy: bypass\n"
|
| + "Content-Length: 999\n",
|
| + false, 0, false,
|
| + },
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "connection: keep-alive\n"
|
| + "Chrome-Proxy: foo=abc, bypass=86400\n"
|
| + "Content-Length: 999\n",
|
| + true, 86400, false,
|
| + },
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "connection: keep-alive\n"
|
| + "Chrome-Proxy: bypass=86400, bar=abc\n"
|
| + "Content-Length: 999\n",
|
| + true, 86400, false,
|
| + },
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "connection: keep-alive\n"
|
| + "Chrome-Proxy: bypass=3600\n"
|
| + "Chrome-Proxy: bypass=86400\n"
|
| + "Content-Length: 999\n",
|
| + true, 3600, false,
|
| + },
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "connection: keep-alive\n"
|
| + "Chrome-Proxy: bypass=3600, bypass=86400\n"
|
| + "Content-Length: 999\n",
|
| + true, 3600, false,
|
| + },
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "connection: keep-alive\n"
|
| + "Chrome-Proxy: bypass=, bypass=86400\n"
|
| + "Content-Length: 999\n",
|
| + true, 86400, false,
|
| + },
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "connection: keep-alive\n"
|
| + "Chrome-Proxy: bypass\n"
|
| + "Chrome-Proxy: bypass=86400\n"
|
| + "Content-Length: 999\n",
|
| + true, 86400, false,
|
| + },
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "connection: keep-alive\n"
|
| + "Chrome-Proxy: block=, block=3600\n"
|
| + "Content-Length: 999\n",
|
| + true, 3600, true,
|
| + },
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "connection: keep-alive\n"
|
| + "Chrome-Proxy: bypass=86400, block=3600\n"
|
| + "Content-Length: 999\n",
|
| + true, 3600, true,
|
| + },
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "connection: proxy-bypass\n"
|
| + "Chrome-Proxy: block=, bypass=86400\n"
|
| + "Content-Length: 999\n",
|
| + true, 86400, false,
|
| + },
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "connection: proxy-bypass\n"
|
| + "Chrome-Proxy: block=-1\n"
|
| + "Content-Length: 999\n",
|
| + false, 0, false,
|
| + },
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "connection: proxy-bypass\n"
|
| + "Chrome-Proxy: block=99999999999999999999\n"
|
| + "Content-Length: 999\n",
|
| + false, 0, false,
|
| + },
|
| + };
|
| for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
|
| std::string headers(tests[i].headers);
|
| HeadersToRaw(&headers);
|
| @@ -2110,68 +1668,82 @@ TEST(HttpResponseHeadersTest, GetProxyBypassInfo) {
|
|
|
| TEST(HttpResponseHeadersTest, IsDataReductionProxyResponse) {
|
| const struct {
|
| - const char* headers;
|
| - bool expected_result;
|
| + const char* headers;
|
| + bool expected_result;
|
| } tests[] = {
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Via: 1.1 Chrome-Proxy\n",
|
| - false,
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Via: 1\n",
|
| - false,
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Via: 1.1 Chrome-Compression-Proxy\n",
|
| - true,
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Via: 1.0 Chrome-Compression-Proxy\n",
|
| - true,
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Via: 1.1 Foo-Bar, 1.1 Chrome-Compression-Proxy\n",
|
| - true,
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Via: 1.1 Chrome-Compression-Proxy, 1.1 Bar-Foo\n",
|
| - true,
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Via: 1.1 chrome-compression-proxy\n",
|
| - false,
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Via: 1.1 Foo-Bar\n"
|
| - "Via: 1.1 Chrome-Compression-Proxy\n",
|
| - true,
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Via: 1.1 Chrome-Proxy\n",
|
| - false,
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Via: 1.1 Chrome Compression Proxy\n",
|
| - true,
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Via: 1.1 Foo-Bar, 1.1 Chrome Compression Proxy\n",
|
| - true,
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Via: 1.1 Chrome Compression Proxy, 1.1 Bar-Foo\n",
|
| - true,
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Via: 1.1 chrome compression proxy\n",
|
| - false,
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Via: 1.1 Foo-Bar\n"
|
| - "Via: 1.1 Chrome Compression Proxy\n",
|
| - true,
|
| - },
|
| - };
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "Via: 1.1 Chrome-Proxy\n",
|
| + false,
|
| + },
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "Via: 1\n",
|
| + false,
|
| + },
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "Via: 1.1 Chrome-Compression-Proxy\n",
|
| + true,
|
| + },
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "Via: 1.0 Chrome-Compression-Proxy\n",
|
| + true,
|
| + },
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "Via: 1.1 Foo-Bar, 1.1 Chrome-Compression-Proxy\n",
|
| + true,
|
| + },
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "Via: 1.1 Chrome-Compression-Proxy, 1.1 Bar-Foo\n",
|
| + true,
|
| + },
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "Via: 1.1 chrome-compression-proxy\n",
|
| + false,
|
| + },
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "Via: 1.1 Foo-Bar\n"
|
| + "Via: 1.1 Chrome-Compression-Proxy\n",
|
| + true,
|
| + },
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "Via: 1.1 Chrome-Proxy\n",
|
| + false,
|
| + },
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "Via: 1.1 Chrome Compression Proxy\n",
|
| + true,
|
| + },
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "Via: 1.1 Foo-Bar, 1.1 Chrome Compression Proxy\n",
|
| + true,
|
| + },
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "Via: 1.1 Chrome Compression Proxy, 1.1 Bar-Foo\n",
|
| + true,
|
| + },
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "Via: 1.1 chrome compression proxy\n",
|
| + false,
|
| + },
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "Via: 1.1 Foo-Bar\n"
|
| + "Via: 1.1 Chrome Compression Proxy\n",
|
| + true,
|
| + },
|
| + };
|
| for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
|
| std::string headers(tests[i].headers);
|
| HeadersToRaw(&headers);
|
| @@ -2184,66 +1756,79 @@ TEST(HttpResponseHeadersTest, IsDataReductionProxyResponse) {
|
|
|
| TEST(HttpResponseHeadersTest, GetDataReductionProxyBypassEventType) {
|
| const struct {
|
| - const char* headers;
|
| - net::ProxyService::DataReductionProxyBypassEventType expected_result;
|
| + const char* headers;
|
| + net::ProxyService::DataReductionProxyBypassEventType expected_result;
|
| } tests[] = {
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Chrome-Proxy: bypass=0\n"
|
| - "Via: 1.1 Chrome-Compression-Proxy\n",
|
| - net::ProxyService::SHORT_BYPASS,
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Chrome-Proxy: bypass=1799\n"
|
| - "Via: 1.1 Chrome-Compression-Proxy\n",
|
| - net::ProxyService::SHORT_BYPASS,
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Chrome-Proxy: bypass=1800\n"
|
| - "Via: 1.1 Chrome-Compression-Proxy\n",
|
| - net::ProxyService::LONG_BYPASS,
|
| - },
|
| - { "HTTP/1.1 500 Internal Server Error\n"
|
| - "Via: 1.1 Chrome-Compression-Proxy\n",
|
| - net::ProxyService::INTERNAL_SERVER_ERROR_BYPASS,
|
| - },
|
| - { "HTTP/1.1 501 Not Implemented\n"
|
| - "Via: 1.1 Chrome-Compression-Proxy\n",
|
| - net::ProxyService::BYPASS_EVENT_TYPE_MAX,
|
| - },
|
| - { "HTTP/1.1 502 Bad Gateway\n"
|
| - "Via: 1.1 Chrome-Compression-Proxy\n",
|
| - net::ProxyService::INTERNAL_SERVER_ERROR_BYPASS,
|
| - },
|
| - { "HTTP/1.1 503 Service Unavailable\n"
|
| - "Via: 1.1 Chrome-Compression-Proxy\n",
|
| - net::ProxyService::INTERNAL_SERVER_ERROR_BYPASS,
|
| - },
|
| - { "HTTP/1.1 504 Gateway Timeout\n"
|
| - "Via: 1.1 Chrome-Compression-Proxy\n",
|
| - net::ProxyService::BYPASS_EVENT_TYPE_MAX,
|
| - },
|
| - { "HTTP/1.1 505 HTTP Version Not Supported\n"
|
| - "Via: 1.1 Chrome-Compression-Proxy\n",
|
| - net::ProxyService::BYPASS_EVENT_TYPE_MAX,
|
| - },
|
| - { "HTTP/1.1 304 Not Modified\n",
|
| - net::ProxyService::BYPASS_EVENT_TYPE_MAX,
|
| - },
|
| - { "HTTP/1.1 200 OK\n",
|
| - net::ProxyService::MISSING_VIA_HEADER,
|
| - },
|
| - { "HTTP/1.1 200 OK\n"
|
| - "Chrome-Proxy: bypass=1799\n",
|
| - net::ProxyService::SHORT_BYPASS,
|
| - },
|
| - { "HTTP/1.1 502 Bad Gateway\n",
|
| - net::ProxyService::INTERNAL_SERVER_ERROR_BYPASS,
|
| - },
|
| - { "HTTP/1.1 502 Bad Gateway\n"
|
| - "Chrome-Proxy: bypass=1799\n",
|
| - net::ProxyService::SHORT_BYPASS,
|
| - },
|
| - };
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "Chrome-Proxy: bypass=0\n"
|
| + "Via: 1.1 Chrome-Compression-Proxy\n",
|
| + net::ProxyService::SHORT_BYPASS,
|
| + },
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "Chrome-Proxy: bypass=1799\n"
|
| + "Via: 1.1 Chrome-Compression-Proxy\n",
|
| + net::ProxyService::SHORT_BYPASS,
|
| + },
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "Chrome-Proxy: bypass=1800\n"
|
| + "Via: 1.1 Chrome-Compression-Proxy\n",
|
| + net::ProxyService::LONG_BYPASS,
|
| + },
|
| + {
|
| + "HTTP/1.1 500 Internal Server Error\n"
|
| + "Via: 1.1 Chrome-Compression-Proxy\n",
|
| + net::ProxyService::INTERNAL_SERVER_ERROR_BYPASS,
|
| + },
|
| + {
|
| + "HTTP/1.1 501 Not Implemented\n"
|
| + "Via: 1.1 Chrome-Compression-Proxy\n",
|
| + net::ProxyService::BYPASS_EVENT_TYPE_MAX,
|
| + },
|
| + {
|
| + "HTTP/1.1 502 Bad Gateway\n"
|
| + "Via: 1.1 Chrome-Compression-Proxy\n",
|
| + net::ProxyService::INTERNAL_SERVER_ERROR_BYPASS,
|
| + },
|
| + {
|
| + "HTTP/1.1 503 Service Unavailable\n"
|
| + "Via: 1.1 Chrome-Compression-Proxy\n",
|
| + net::ProxyService::INTERNAL_SERVER_ERROR_BYPASS,
|
| + },
|
| + {
|
| + "HTTP/1.1 504 Gateway Timeout\n"
|
| + "Via: 1.1 Chrome-Compression-Proxy\n",
|
| + net::ProxyService::BYPASS_EVENT_TYPE_MAX,
|
| + },
|
| + {
|
| + "HTTP/1.1 505 HTTP Version Not Supported\n"
|
| + "Via: 1.1 Chrome-Compression-Proxy\n",
|
| + net::ProxyService::BYPASS_EVENT_TYPE_MAX,
|
| + },
|
| + {
|
| + "HTTP/1.1 304 Not Modified\n",
|
| + net::ProxyService::BYPASS_EVENT_TYPE_MAX,
|
| + },
|
| + {
|
| + "HTTP/1.1 200 OK\n", net::ProxyService::MISSING_VIA_HEADER,
|
| + },
|
| + {
|
| + "HTTP/1.1 200 OK\n"
|
| + "Chrome-Proxy: bypass=1799\n",
|
| + net::ProxyService::SHORT_BYPASS,
|
| + },
|
| + {
|
| + "HTTP/1.1 502 Bad Gateway\n",
|
| + net::ProxyService::INTERNAL_SERVER_ERROR_BYPASS,
|
| + },
|
| + {
|
| + "HTTP/1.1 502 Bad Gateway\n"
|
| + "Chrome-Proxy: bypass=1799\n",
|
| + net::ProxyService::SHORT_BYPASS,
|
| + },
|
| + };
|
| for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
|
| std::string headers(tests[i].headers);
|
| HeadersToRaw(&headers);
|
|
|