Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(136)

Unified Diff: net/http/http_response_headers_unittest.cc

Issue 992733002: Remove //net (except for Android test stuff) and sdch (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/http/http_response_headers.cc ('k') | net/http/http_response_info.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
deleted file mode 100644
index 355742351c3135d4348dcbfe1b6011e83bedd1e7..0000000000000000000000000000000000000000
--- a/net/http/http_response_headers_unittest.cc
+++ /dev/null
@@ -1,2399 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <algorithm>
-#include <iostream>
-#include <limits>
-
-#include "base/basictypes.h"
-#include "base/memory/scoped_ptr.h"
-#include "base/pickle.h"
-#include "base/time/time.h"
-#include "base/values.h"
-#include "net/http/http_byte_range.h"
-#include "net/http/http_response_headers.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace {
-
-struct TestData {
- const char* raw_headers;
- const char* expected_headers;
- int expected_response_code;
- net::HttpVersion expected_parsed_version;
- net::HttpVersion expected_version;
-};
-
-class HttpResponseHeadersTest : public testing::Test {
-};
-
-// Transform "normal"-looking headers (\n-separated) to the appropriate
-// input format for ParseRawHeaders (\0-separated).
-void HeadersToRaw(std::string* headers) {
- std::replace(headers->begin(), headers->end(), '\n', '\0');
- if (!headers->empty())
- *headers += '\0';
-}
-
-class HttpResponseHeadersCacheControlTest : public HttpResponseHeadersTest {
- protected:
- // Make tests less verbose.
- typedef base::TimeDelta TimeDelta;
-
- // Initilise the headers() value with a Cache-Control header set to
- // |cache_control|. |cache_control| is copied and so can safely be a
- // temporary.
- void InitializeHeadersWithCacheControl(const char* cache_control) {
- std::string raw_headers("HTTP/1.1 200 OK\n");
- raw_headers += "Cache-Control: ";
- raw_headers += cache_control;
- raw_headers += "\n";
- HeadersToRaw(&raw_headers);
- headers_ = new net::HttpResponseHeaders(raw_headers);
- }
-
- const scoped_refptr<net::HttpResponseHeaders>& headers() { return headers_; }
-
- // Return a pointer to a TimeDelta object. For use when the value doesn't
- // matter.
- TimeDelta* TimeDeltaPointer() { return &delta_; }
-
- // Get the max-age value. This should only be used in tests where a valid
- // max-age parameter is expected to be present.
- TimeDelta GetMaxAgeValue() {
- DCHECK(headers_.get()) << "Call InitializeHeadersWithCacheControl() first";
- TimeDelta max_age_value;
- EXPECT_TRUE(headers()->GetMaxAgeValue(&max_age_value));
- return max_age_value;
- }
-
- // Get the stale-while-revalidate value. This should only be used in tests
- // where a valid max-age parameter is expected to be present.
- TimeDelta GetStaleWhileRevalidateValue() {
- DCHECK(headers_.get()) << "Call InitializeHeadersWithCacheControl() first";
- TimeDelta stale_while_revalidate_value;
- EXPECT_TRUE(
- headers()->GetStaleWhileRevalidateValue(&stale_while_revalidate_value));
- return stale_while_revalidate_value;
- }
-
- private:
- scoped_refptr<net::HttpResponseHeaders> headers_;
- TimeDelta delta_;
-};
-
-class CommonHttpResponseHeadersTest
- : public HttpResponseHeadersTest,
- public ::testing::WithParamInterface<TestData> {
-};
-
-TEST_P(CommonHttpResponseHeadersTest, TestCommon) {
- const TestData test = GetParam();
-
- std::string raw_headers(test.raw_headers);
- HeadersToRaw(&raw_headers);
- std::string expected_headers(test.expected_headers);
-
- std::string headers;
- scoped_refptr<net::HttpResponseHeaders> parsed(
- new net::HttpResponseHeaders(raw_headers));
- parsed->GetNormalizedHeaders(&headers);
-
- // Transform to readable output format (so it's easier to see diffs).
- std::replace(headers.begin(), headers.end(), ' ', '_');
- std::replace(headers.begin(), headers.end(), '\n', '\\');
- std::replace(expected_headers.begin(), expected_headers.end(), ' ', '_');
- std::replace(expected_headers.begin(), expected_headers.end(), '\n', '\\');
-
- EXPECT_EQ(expected_headers, headers);
-
- EXPECT_EQ(test.expected_response_code, parsed->response_code());
-
- EXPECT_TRUE(test.expected_parsed_version == parsed->GetParsedHttpVersion());
- EXPECT_TRUE(test.expected_version == parsed->GetHttpVersion());
-}
-
-TestData response_headers_tests[] = {
- {
- // Normalise whitespace.
-
- "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)
- },
- {
- // Normalize leading whitespace.
-
- "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)
- },
- {
- // Normalize blank headers.
-
- "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)
- },
- {
- // Don't believe the http/0.9 version if there are headers!
-
- "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)
- },
- {
- // Accept the HTTP/0.9 version number if there are no headers.
- // This is how HTTP/0.9 responses get constructed from
- // HttpNetworkTransaction.
-
- "hTtP/0.9 200 OK\n",
-
- "HTTP/0.9 200 OK\n",
-
- 200,
- net::HttpVersion(0,9),
- net::HttpVersion(0,9)
- },
- {
- // Add missing OK.
-
- "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)
- },
- {
- // Normalize bad status line.
-
- "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)
- },
- {
- // Normalize invalid status code.
-
- "HTTP/1.1 -1 Unknown\n",
-
- "HTTP/1.1 200 OK\n",
-
- 200,
- net::HttpVersion(1,1),
- net::HttpVersion(1,1)
- },
- {
- // Normalize empty header.
-
- "",
-
- "HTTP/1.0 200 OK\n",
-
- 200,
- net::HttpVersion(0,0), // Parse Error.
- net::HttpVersion(1,0)
- },
- {
- // Normalize headers that start with a colon.
-
- "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)
- },
- {
- // Normalize headers that end with a colon.
-
- "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)
- },
- {
- // Normalize whitespace headers.
-
- "\n \n",
-
- "HTTP/1.0 200 OK\n",
-
- 200,
- net::HttpVersion(0,0), // Parse error.
- net::HttpVersion(1,0)
- },
- {
- // Consolidate Set-Cookie headers.
-
- "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)
- },
-};
-
-INSTANTIATE_TEST_CASE_P(HttpResponseHeaders,
- CommonHttpResponseHeadersTest,
- testing::ValuesIn(response_headers_tests));
-
-TEST(HttpResponseHeadersTest, GetNormalizedHeader) {
- std::string headers =
- "HTTP/1.1 200 OK\n"
- "Cache-control: private\n"
- "cache-Control: no-store\n";
- HeadersToRaw(&headers);
- scoped_refptr<net::HttpResponseHeaders> parsed(
- new net::HttpResponseHeaders(headers));
-
- std::string value;
- EXPECT_TRUE(parsed->GetNormalizedHeader("cache-control", &value));
- EXPECT_EQ("private, no-store", value);
-}
-
-struct PersistData {
- net::HttpResponseHeaders::PersistOptions options;
- const char* raw_headers;
- const char* expected_headers;
-};
-
-class PersistenceTest
- : public HttpResponseHeadersTest,
- public ::testing::WithParamInterface<PersistData> {
-};
-
-TEST_P(PersistenceTest, Persist) {
- const PersistData test = GetParam();
-
- std::string headers = test.raw_headers;
- HeadersToRaw(&headers);
- scoped_refptr<net::HttpResponseHeaders> parsed1(
- new net::HttpResponseHeaders(headers));
-
- Pickle pickle;
- parsed1->Persist(&pickle, test.options);
-
- PickleIterator iter(pickle);
- scoped_refptr<net::HttpResponseHeaders> parsed2(
- new net::HttpResponseHeaders(&iter));
-
- std::string h2;
- parsed2->GetNormalizedHeaders(&h2);
- EXPECT_EQ(std::string(test.expected_headers), h2);
-}
-
-const struct PersistData persistence_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"
- },
-};
-
-INSTANTIATE_TEST_CASE_P(HttpResponseHeaders,
- PersistenceTest,
- testing::ValuesIn(persistence_tests));
-
-TEST(HttpResponseHeadersTest, EnumerateHeader_Coalesced) {
- // Ensure that commas in quoted strings are not regarded as value separators.
- // Ensure that whitespace following a value is trimmed properly.
- std::string headers =
- "HTTP/1.1 200 OK\n"
- "Cache-control:private , no-cache=\"set-cookie,server\" \n"
- "cache-Control: no-store\n";
- HeadersToRaw(&headers);
- scoped_refptr<net::HttpResponseHeaders> parsed(
- new net::HttpResponseHeaders(headers));
-
- void* iter = NULL;
- std::string value;
- EXPECT_TRUE(parsed->EnumerateHeader(&iter, "cache-control", &value));
- EXPECT_EQ("private", value);
- EXPECT_TRUE(parsed->EnumerateHeader(&iter, "cache-control", &value));
- EXPECT_EQ("no-cache=\"set-cookie,server\"", value);
- EXPECT_TRUE(parsed->EnumerateHeader(&iter, "cache-control", &value));
- EXPECT_EQ("no-store", value);
- EXPECT_FALSE(parsed->EnumerateHeader(&iter, "cache-control", &value));
-}
-
-TEST(HttpResponseHeadersTest, EnumerateHeader_Challenge) {
- // Even though WWW-Authenticate has commas, it should not be treated as
- // coalesced values.
- std::string headers =
- "HTTP/1.1 401 OK\n"
- "WWW-Authenticate:Digest realm=foobar, nonce=x, domain=y\n"
- "WWW-Authenticate:Basic realm=quatar\n";
- HeadersToRaw(&headers);
- scoped_refptr<net::HttpResponseHeaders> parsed(
- new net::HttpResponseHeaders(headers));
-
- void* iter = NULL;
- std::string value;
- EXPECT_TRUE(parsed->EnumerateHeader(&iter, "WWW-Authenticate", &value));
- EXPECT_EQ("Digest realm=foobar, nonce=x, domain=y", value);
- EXPECT_TRUE(parsed->EnumerateHeader(&iter, "WWW-Authenticate", &value));
- EXPECT_EQ("Basic realm=quatar", value);
- EXPECT_FALSE(parsed->EnumerateHeader(&iter, "WWW-Authenticate", &value));
-}
-
-TEST(HttpResponseHeadersTest, EnumerateHeader_DateValued) {
- // The comma in a date valued header should not be treated as a
- // field-value separator.
- std::string headers =
- "HTTP/1.1 200 OK\n"
- "Date: Tue, 07 Aug 2007 23:10:55 GMT\n"
- "Last-Modified: Wed, 01 Aug 2007 23:23:45 GMT\n";
- HeadersToRaw(&headers);
- scoped_refptr<net::HttpResponseHeaders> parsed(
- new net::HttpResponseHeaders(headers));
-
- std::string value;
- EXPECT_TRUE(parsed->EnumerateHeader(NULL, "date", &value));
- EXPECT_EQ("Tue, 07 Aug 2007 23:10:55 GMT", value);
- EXPECT_TRUE(parsed->EnumerateHeader(NULL, "last-modified", &value));
- EXPECT_EQ("Wed, 01 Aug 2007 23:23:45 GMT", value);
-}
-
-TEST(HttpResponseHeadersTest, DefaultDateToGMT) {
- // Verify we make the best interpretation when parsing dates that incorrectly
- // do not end in "GMT" as RFC2616 requires.
- std::string headers =
- "HTTP/1.1 200 OK\n"
- "Date: Tue, 07 Aug 2007 23:10:55\n"
- "Last-Modified: Tue, 07 Aug 2007 19:10:55 EDT\n"
- "Expires: Tue, 07 Aug 2007 23:10:55 UTC\n";
- HeadersToRaw(&headers);
- 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));
-
- base::Time value;
- // When the timezone is missing, GMT is a good guess as its what RFC2616
- // requires.
- EXPECT_TRUE(parsed->GetDateValue(&value));
- EXPECT_EQ(expected_value, value);
- // If GMT is missing but an RFC822-conforming one is present, use that.
- EXPECT_TRUE(parsed->GetLastModifiedValue(&value));
- EXPECT_EQ(expected_value, value);
- // If an unknown timezone is present, treat like a missing timezone and
- // default to GMT. The only example of a web server not specifying "GMT"
- // used "UTC" which is equivalent to GMT.
- if (parsed->GetExpiresValue(&value))
- EXPECT_EQ(expected_value, value);
-}
-
-struct ContentTypeTestData {
- const std::string raw_headers;
- const std::string mime_type;
- const bool has_mimetype;
- const std::string charset;
- const bool has_charset;
- const std::string all_content_type;
-};
-
-class ContentTypeTest
- : public HttpResponseHeadersTest,
- public ::testing::WithParamInterface<ContentTypeTestData> {
-};
-
-TEST_P(ContentTypeTest, GetMimeType) {
- const ContentTypeTestData test = GetParam();
-
- std::string headers(test.raw_headers);
- HeadersToRaw(&headers);
- scoped_refptr<net::HttpResponseHeaders> parsed(
- new net::HttpResponseHeaders(headers));
-
- std::string value;
- EXPECT_EQ(test.has_mimetype, parsed->GetMimeType(&value));
- EXPECT_EQ(test.mime_type, value);
- value.clear();
- EXPECT_EQ(test.has_charset, parsed->GetCharset(&value));
- EXPECT_EQ(test.charset, value);
- EXPECT_TRUE(parsed->GetNormalizedHeader("content-type", &value));
- EXPECT_EQ(test.all_content_type, value);
-}
-
-const ContentTypeTestData mimetype_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,
- "*/*" },
-};
-
-INSTANTIATE_TEST_CASE_P(HttpResponseHeaders,
- ContentTypeTest,
- testing::ValuesIn(mimetype_tests));
-
-using net::ValidationType;
-using net::VALIDATION_NONE;
-using net::VALIDATION_SYNCHRONOUS;
-using net::VALIDATION_ASYNCHRONOUS;
-
-struct RequiresValidationTestData {
- const char* headers;
- ValidationType validation_type;
-};
-
-class RequiresValidationTest
- : public HttpResponseHeadersTest,
- public ::testing::WithParamInterface<RequiresValidationTestData> {
-};
-
-TEST_P(RequiresValidationTest, RequiresValidation) {
- const RequiresValidationTestData test = GetParam();
-
- 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);
- base::Time::FromString("Wed, 28 Nov 2007 00:45:20 GMT", &current_time);
-
- std::string headers(test.headers);
- HeadersToRaw(&headers);
- scoped_refptr<net::HttpResponseHeaders> parsed(
- new net::HttpResponseHeaders(headers));
-
- ValidationType validation_type =
- parsed->RequiresValidation(request_time, response_time, current_time);
- EXPECT_EQ(test.validation_type, validation_type);
-}
-
-const struct RequiresValidationTestData requires_validation_tests[] = {
- // No expiry info: expires immediately.
- { "HTTP/1.1 200 OK\n"
- "\n",
- VALIDATION_SYNCHRONOUS
- },
- // No expiry info: expires immediately.
- { "HTTP/1.1 200 OK\n"
- "\n",
- VALIDATION_SYNCHRONOUS
- },
- // Valid for a little while.
- { "HTTP/1.1 200 OK\n"
- "cache-control: max-age=10000\n"
- "\n",
- VALIDATION_NONE
- },
- // 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",
- VALIDATION_NONE
- },
- // Already expired.
- { "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",
- VALIDATION_SYNCHRONOUS
- },
- // 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",
- VALIDATION_NONE
- },
- // 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",
- VALIDATION_NONE
- },
- { "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",
- VALIDATION_NONE
- },
- { "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",
- VALIDATION_NONE
- },
- // 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",
- VALIDATION_SYNCHRONOUS
- },
- { "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",
- VALIDATION_SYNCHRONOUS
- },
- { "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",
- VALIDATION_SYNCHRONOUS
- },
- // Cached permanent redirect.
- { "HTTP/1.1 301 Moved Permanently\n"
- "\n",
- VALIDATION_NONE
- },
- // Another cached permanent redirect.
- { "HTTP/1.1 308 Permanent Redirect\n"
- "\n",
- VALIDATION_NONE
- },
- // Cached redirect: not reusable even though by default it would be.
- { "HTTP/1.1 300 Multiple Choices\n"
- "Cache-Control: no-cache\n"
- "\n",
- VALIDATION_SYNCHRONOUS
- },
- // Cached forever by default.
- { "HTTP/1.1 410 Gone\n"
- "\n",
- VALIDATION_NONE
- },
- // Cached temporary redirect: not reusable.
- { "HTTP/1.1 302 Found\n"
- "\n",
- VALIDATION_SYNCHRONOUS
- },
- // Cached temporary redirect: reusable.
- { "HTTP/1.1 302 Found\n"
- "cache-control: max-age=10000\n"
- "\n",
- VALIDATION_NONE
- },
- // 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",
- VALIDATION_NONE
- },
- // 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",
- VALIDATION_SYNCHRONOUS
- },
- // 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",
- VALIDATION_SYNCHRONOUS
- },
- // max-age has expired, needs synchronous revalidation
- { "HTTP/1.1 200 OK\n"
- "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
- "cache-control: max-age=300\n"
- "\n",
- VALIDATION_SYNCHRONOUS
- },
- // max-age has expired, stale-while-revalidate has not, eligible for
- // asynchronous revalidation
- { "HTTP/1.1 200 OK\n"
- "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
- "cache-control: max-age=300, stale-while-revalidate=3600\n"
- "\n",
- VALIDATION_ASYNCHRONOUS
- },
- // max-age and stale-while-revalidate have expired, needs synchronous
- // revalidation
- { "HTTP/1.1 200 OK\n"
- "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
- "cache-control: max-age=300, stale-while-revalidate=5\n"
- "\n",
- VALIDATION_SYNCHRONOUS
- },
- // max-age is 0, stale-while-revalidate is large enough to permit
- // asynchronous revalidation
- { "HTTP/1.1 200 OK\n"
- "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
- "cache-control: max-age=0, stale-while-revalidate=360\n"
- "\n",
- VALIDATION_ASYNCHRONOUS
- },
- // stale-while-revalidate must not override no-cache or similar directives.
- { "HTTP/1.1 200 OK\n"
- "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
- "cache-control: no-cache, stale-while-revalidate=360\n"
- "\n",
- VALIDATION_SYNCHRONOUS
- },
- // max-age has not expired, so no revalidation is needed.
- { "HTTP/1.1 200 OK\n"
- "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
- "cache-control: max-age=3600, stale-while-revalidate=3600\n"
- "\n",
- VALIDATION_NONE
- },
- // must-revalidate overrides stale-while-revalidate, so synchronous validation
- // is needed.
- { "HTTP/1.1 200 OK\n"
- "date: Wed, 28 Nov 2007 00:40:11 GMT\n"
- "cache-control: must-revalidate, max-age=300, stale-while-revalidate=3600\n"
- "\n",
- VALIDATION_SYNCHRONOUS
- },
-
- // TODO(darin): Add many many more tests here.
-};
-
-INSTANTIATE_TEST_CASE_P(HttpResponseHeaders,
- RequiresValidationTest,
- testing::ValuesIn(requires_validation_tests));
-
-struct UpdateTestData {
- const char* orig_headers;
- const char* new_headers;
- const char* expected_headers;
-};
-
-class UpdateTest
- : public HttpResponseHeadersTest,
- public ::testing::WithParamInterface<UpdateTestData> {
-};
-
-TEST_P(UpdateTest, Update) {
- const UpdateTestData test = GetParam();
-
- std::string orig_headers(test.orig_headers);
- HeadersToRaw(&orig_headers);
- scoped_refptr<net::HttpResponseHeaders> parsed(
- new net::HttpResponseHeaders(orig_headers));
-
- std::string new_headers(test.new_headers);
- HeadersToRaw(&new_headers);
- scoped_refptr<net::HttpResponseHeaders> new_parsed(
- new net::HttpResponseHeaders(new_headers));
-
- parsed->Update(*new_parsed.get());
-
- std::string resulting_headers;
- parsed->GetNormalizedHeaders(&resulting_headers);
- EXPECT_EQ(std::string(test.expected_headers), resulting_headers);
-}
-
-const UpdateTestData update_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"
- },
-};
-
-INSTANTIATE_TEST_CASE_P(HttpResponseHeaders,
- UpdateTest,
- testing::ValuesIn(update_tests));
-
-struct EnumerateHeaderTestData {
- const char* headers;
- const char* expected_lines;
-};
-
-class EnumerateHeaderLinesTest
- : public HttpResponseHeadersTest,
- public ::testing::WithParamInterface<EnumerateHeaderTestData> {
-};
-
-TEST_P(EnumerateHeaderLinesTest, EnumerateHeaderLines) {
- const EnumerateHeaderTestData test = GetParam();
-
- std::string headers(test.headers);
- HeadersToRaw(&headers);
- scoped_refptr<net::HttpResponseHeaders> parsed(
- new net::HttpResponseHeaders(headers));
-
- std::string name, value, lines;
-
- void* iter = NULL;
- while (parsed->EnumerateHeaderLines(&iter, &name, &value)) {
- lines.append(name);
- lines.append(": ");
- lines.append(value);
- lines.append("\n");
- }
-
- EXPECT_EQ(std::string(test.expected_lines), lines);
-}
-
-const EnumerateHeaderTestData enumerate_header_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"
- },
-};
-
-INSTANTIATE_TEST_CASE_P(HttpResponseHeaders,
- EnumerateHeaderLinesTest,
- testing::ValuesIn(enumerate_header_tests));
-
-struct IsRedirectTestData {
- const char* headers;
- const char* location;
- bool is_redirect;
-};
-
-class IsRedirectTest
- : public HttpResponseHeadersTest,
- public ::testing::WithParamInterface<IsRedirectTestData> {
-};
-
-TEST_P(IsRedirectTest, IsRedirect) {
- const IsRedirectTestData test = GetParam();
-
- std::string headers(test.headers);
- HeadersToRaw(&headers);
- scoped_refptr<net::HttpResponseHeaders> parsed(
- new net::HttpResponseHeaders(headers));
-
- std::string location;
- EXPECT_EQ(parsed->IsRedirect(&location), test.is_redirect);
- EXPECT_EQ(location, test.location);
-}
-
-const IsRedirectTestData 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 with 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 with 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
- },
-};
-
-INSTANTIATE_TEST_CASE_P(HttpResponseHeaders,
- IsRedirectTest,
- testing::ValuesIn(is_redirect_tests));
-
-struct ContentLengthTestData {
- const char* headers;
- int64 expected_len;
-};
-
-class GetContentLengthTest
- : public HttpResponseHeadersTest,
- public ::testing::WithParamInterface<ContentLengthTestData> {
-};
-
-TEST_P(GetContentLengthTest, GetContentLength) {
- const ContentLengthTestData test = GetParam();
-
- std::string headers(test.headers);
- HeadersToRaw(&headers);
- scoped_refptr<net::HttpResponseHeaders> parsed(
- new net::HttpResponseHeaders(headers));
-
- EXPECT_EQ(test.expected_len, parsed->GetContentLength());
-}
-
-const ContentLengthTestData content_length_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
- },
-};
-
-INSTANTIATE_TEST_CASE_P(HttpResponseHeaders,
- GetContentLengthTest,
- testing::ValuesIn(content_length_tests));
-
-struct ContentRangeTestData {
- const char* headers;
- bool expected_return_value;
- int64 expected_first_byte_position;
- int64 expected_last_byte_position;
- int64 expected_instance_size;
-};
-
-class ContentRangeTest
- : public HttpResponseHeadersTest,
- public ::testing::WithParamInterface<ContentRangeTestData> {
-};
-
-TEST_P(ContentRangeTest, GetContentRange) {
- const ContentRangeTestData test = GetParam();
-
- std::string headers(test.headers);
- HeadersToRaw(&headers);
- scoped_refptr<net::HttpResponseHeaders> parsed(
- new net::HttpResponseHeaders(headers));
-
- int64 first_byte_position;
- int64 last_byte_position;
- int64 instance_size;
- bool return_value = parsed->GetContentRange(&first_byte_position,
- &last_byte_position,
- &instance_size);
- EXPECT_EQ(test.expected_return_value, return_value);
- EXPECT_EQ(test.expected_first_byte_position, first_byte_position);
- EXPECT_EQ(test.expected_last_byte_position, last_byte_position);
- EXPECT_EQ(test.expected_instance_size, instance_size);
-}
-
-const ContentRangeTestData content_range_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 bit wraparound.
- { "HTTP/1.1 206 Partial Content\n"
- "Content-Range: bytes 0 - 9223372036854775807 / 100",
- false,
- 0,
- kint64max,
- 100
- },
- // 64 bit 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
- },
-};
-
-INSTANTIATE_TEST_CASE_P(HttpResponseHeaders,
- ContentRangeTest,
- testing::ValuesIn(content_range_tests));
-
-struct KeepAliveTestData {
- const char* headers;
- bool expected_keep_alive;
-};
-
-// Enable GTest to print KeepAliveTestData in an intelligible way if the test
-// fails.
-void PrintTo(const KeepAliveTestData& keep_alive_test_data,
- std::ostream* os) {
- *os << "{\"" << keep_alive_test_data.headers << "\", " << std::boolalpha
- << keep_alive_test_data.expected_keep_alive << "}";
-}
-
-class IsKeepAliveTest
- : public HttpResponseHeadersTest,
- public ::testing::WithParamInterface<KeepAliveTestData> {
-};
-
-TEST_P(IsKeepAliveTest, IsKeepAlive) {
- const KeepAliveTestData test = GetParam();
-
- std::string headers(test.headers);
- HeadersToRaw(&headers);
- scoped_refptr<net::HttpResponseHeaders> parsed(
- new net::HttpResponseHeaders(headers));
-
- EXPECT_EQ(test.expected_keep_alive, parsed->IsKeepAlive());
-}
-
-const KeepAliveTestData keepalive_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
- },
- { "HTTP/1.1 200 OK\n"
- "Connection: Upgrade, close\n",
- false
- },
- { "HTTP/1.1 200 OK\n"
- "Connection: Upgrade, keep-alive\n",
- true
- },
- { "HTTP/1.1 200 OK\n"
- "Connection: Upgrade\n"
- "Connection: close\n",
- false
- },
- { "HTTP/1.1 200 OK\n"
- "Connection: Upgrade\n"
- "Connection: keep-alive\n",
- true
- },
- { "HTTP/1.1 200 OK\n"
- "Connection: close, Upgrade\n",
- false
- },
- { "HTTP/1.1 200 OK\n"
- "Connection: keep-alive, Upgrade\n",
- true
- },
- { "HTTP/1.1 200 OK\n"
- "Connection: Upgrade\n"
- "Proxy-Connection: close\n",
- false
- },
- { "HTTP/1.1 200 OK\n"
- "Connection: Upgrade\n"
- "Proxy-Connection: keep-alive\n",
- true
- },
- // In situations where the response headers conflict with themselves, use the
- // first one for backwards-compatibility.
- { "HTTP/1.1 200 OK\n"
- "Connection: close\n"
- "Connection: keep-alive\n",
- false
- },
- { "HTTP/1.1 200 OK\n"
- "Connection: keep-alive\n"
- "Connection: close\n",
- true
- },
- { "HTTP/1.0 200 OK\n"
- "Connection: close\n"
- "Connection: keep-alive\n",
- false
- },
- { "HTTP/1.0 200 OK\n"
- "Connection: keep-alive\n"
- "Connection: close\n",
- true
- },
- // Ignore the Proxy-Connection header if at all possible.
- { "HTTP/1.0 200 OK\n"
- "Proxy-Connection: keep-alive\n"
- "Connection: close\n",
- false
- },
- { "HTTP/1.1 200 OK\n"
- "Proxy-Connection: close\n"
- "Connection: keep-alive\n",
- true
- },
- // Older versions of Chrome would have ignored Proxy-Connection in this case,
- // but it doesn't seem safe.
- { "HTTP/1.1 200 OK\n"
- "Proxy-Connection: close\n"
- "Connection: Transfer-Encoding\n",
- false
- },
-};
-
-INSTANTIATE_TEST_CASE_P(HttpResponseHeaders,
- IsKeepAliveTest,
- testing::ValuesIn(keepalive_tests));
-
-struct HasStrongValidatorsTestData {
- const char* headers;
- bool expected_result;
-};
-
-class HasStrongValidatorsTest
- : public HttpResponseHeadersTest,
- public ::testing::WithParamInterface<HasStrongValidatorsTestData> {
-};
-
-TEST_P(HasStrongValidatorsTest, HasStrongValidators) {
- const HasStrongValidatorsTestData test = GetParam();
-
- std::string headers(test.headers);
- HeadersToRaw(&headers);
- scoped_refptr<net::HttpResponseHeaders> parsed(
- new net::HttpResponseHeaders(headers));
-
- EXPECT_EQ(test.expected_result, parsed->HasStrongValidators());
-}
-
-const HasStrongValidatorsTestData strong_validators_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
- }
-};
-
-INSTANTIATE_TEST_CASE_P(HttpResponseHeaders,
- HasStrongValidatorsTest,
- testing::ValuesIn(strong_validators_tests));
-
-TEST(HttpResponseHeadersTest, GetStatusText) {
- std::string headers("HTTP/1.1 404 Not Found");
- HeadersToRaw(&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));
- // Since the status line gets normalized, we have OK.
- EXPECT_EQ(std::string("OK"), parsed->GetStatusText());
-}
-
-TEST(HttpResponseHeadersTest, GetStatusTextMultiSpace) {
- std::string headers("HTTP/1.0 404 Not Found");
- HeadersToRaw(&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));
- // The bad status line would have gotten rewritten as
- // HTTP/1.0 200 OK.
- EXPECT_EQ(std::string("OK"), parsed->GetStatusText());
-}
-
-struct AddHeaderTestData {
- const char* orig_headers;
- const char* new_header;
- const char* expected_headers;
-};
-
-class AddHeaderTest
- : public HttpResponseHeadersTest,
- public ::testing::WithParamInterface<AddHeaderTestData> {
-};
-
-TEST_P(AddHeaderTest, AddHeader) {
- const AddHeaderTestData test = GetParam();
-
- std::string orig_headers(test.orig_headers);
- HeadersToRaw(&orig_headers);
- scoped_refptr<net::HttpResponseHeaders> parsed(
- new net::HttpResponseHeaders(orig_headers));
-
- std::string new_header(test.new_header);
- parsed->AddHeader(new_header);
-
- std::string resulting_headers;
- parsed->GetNormalizedHeaders(&resulting_headers);
- EXPECT_EQ(std::string(test.expected_headers), resulting_headers);
-}
-
-const AddHeaderTestData add_header_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"
- },
-};
-
-INSTANTIATE_TEST_CASE_P(HttpResponseHeaders,
- AddHeaderTest,
- testing::ValuesIn(add_header_tests));
-
-struct RemoveHeaderTestData {
- const char* orig_headers;
- const char* to_remove;
- const char* expected_headers;
-};
-
-class RemoveHeaderTest
- : public HttpResponseHeadersTest,
- public ::testing::WithParamInterface<RemoveHeaderTestData> {
-};
-
-TEST_P(RemoveHeaderTest, RemoveHeader) {
- const RemoveHeaderTestData test = GetParam();
-
- std::string orig_headers(test.orig_headers);
- HeadersToRaw(&orig_headers);
- scoped_refptr<net::HttpResponseHeaders> parsed(
- new net::HttpResponseHeaders(orig_headers));
-
- std::string name(test.to_remove);
- parsed->RemoveHeader(name);
-
- std::string resulting_headers;
- parsed->GetNormalizedHeaders(&resulting_headers);
- EXPECT_EQ(std::string(test.expected_headers), resulting_headers);
-}
-
-const RemoveHeaderTestData remove_header_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"
- },
-};
-
-INSTANTIATE_TEST_CASE_P(HttpResponseHeaders,
- RemoveHeaderTest,
- testing::ValuesIn(remove_header_tests));
-
-struct RemoveIndividualHeaderTestData {
- const char* orig_headers;
- const char* to_remove_name;
- const char* to_remove_value;
- const char* expected_headers;
-};
-
-class RemoveIndividualHeaderTest
- : public HttpResponseHeadersTest,
- public ::testing::WithParamInterface<RemoveIndividualHeaderTestData> {
-};
-
-TEST_P(RemoveIndividualHeaderTest, RemoveIndividualHeader) {
- const RemoveIndividualHeaderTestData test = GetParam();
-
- std::string orig_headers(test.orig_headers);
- HeadersToRaw(&orig_headers);
- scoped_refptr<net::HttpResponseHeaders> parsed(
- new net::HttpResponseHeaders(orig_headers));
-
- std::string name(test.to_remove_name);
- std::string value(test.to_remove_value);
- parsed->RemoveHeaderLine(name, value);
-
- std::string resulting_headers;
- parsed->GetNormalizedHeaders(&resulting_headers);
- EXPECT_EQ(std::string(test.expected_headers), resulting_headers);
-}
-
-const RemoveIndividualHeaderTestData remove_individual_header_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"
- },
-};
-
-INSTANTIATE_TEST_CASE_P(HttpResponseHeaders,
- RemoveIndividualHeaderTest,
- testing::ValuesIn(remove_individual_header_tests));
-
-struct ReplaceStatusTestData {
- const char* orig_headers;
- const char* new_status;
- const char* expected_headers;
-};
-
-class ReplaceStatusTest
- : public HttpResponseHeadersTest,
- public ::testing::WithParamInterface<ReplaceStatusTestData> {
-};
-
-TEST_P(ReplaceStatusTest, ReplaceStatus) {
- const ReplaceStatusTestData test = GetParam();
-
- std::string orig_headers(test.orig_headers);
- HeadersToRaw(&orig_headers);
- scoped_refptr<net::HttpResponseHeaders> parsed(
- new net::HttpResponseHeaders(orig_headers));
-
- std::string name(test.new_status);
- parsed->ReplaceStatusLine(name);
-
- std::string resulting_headers;
- parsed->GetNormalizedHeaders(&resulting_headers);
- EXPECT_EQ(std::string(test.expected_headers), resulting_headers);
-}
-
-const ReplaceStatusTestData replace_status_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"
- },
-};
-
-INSTANTIATE_TEST_CASE_P(HttpResponseHeaders,
- ReplaceStatusTest,
- testing::ValuesIn(replace_status_tests));
-
-struct UpdateWithNewRangeTestData {
- const char* orig_headers;
- const char* expected_headers;
- const char* expected_headers_with_replaced_status;
-};
-
-class UpdateWithNewRangeTest
- : public HttpResponseHeadersTest,
- public ::testing::WithParamInterface<UpdateWithNewRangeTestData> {
-};
-
-TEST_P(UpdateWithNewRangeTest, UpdateWithNewRange) {
- const UpdateWithNewRangeTestData test = GetParam();
-
- const net::HttpByteRange range = net::HttpByteRange::Bounded(3, 5);
-
- std::string orig_headers(test.orig_headers);
- std::replace(orig_headers.begin(), orig_headers.end(), '\n', '\0');
- scoped_refptr<net::HttpResponseHeaders> parsed(
- new net::HttpResponseHeaders(orig_headers + '\0'));
- int64 content_size = parsed->GetContentLength();
- std::string resulting_headers;
-
- // Update headers without replacing status line.
- parsed->UpdateWithNewRange(range, content_size, false);
- parsed->GetNormalizedHeaders(&resulting_headers);
- EXPECT_EQ(std::string(test.expected_headers), resulting_headers);
-
- // Replace status line too.
- parsed->UpdateWithNewRange(range, content_size, true);
- parsed->GetNormalizedHeaders(&resulting_headers);
- EXPECT_EQ(std::string(test.expected_headers_with_replaced_status),
- resulting_headers);
-}
-
-const UpdateWithNewRangeTestData update_range_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",
- },
-};
-
-INSTANTIATE_TEST_CASE_P(HttpResponseHeaders,
- UpdateWithNewRangeTest,
- testing::ValuesIn(update_range_tests));
-
-TEST(HttpResponseHeadersTest, ToNetLogParamAndBackAgain) {
- 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));
-
- scoped_ptr<base::Value> event_param(
- parsed->NetLogCallback(net::NetLog::LOG_ALL_BUT_BYTES));
- scoped_refptr<net::HttpResponseHeaders> 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());
- EXPECT_EQ(parsed->GetContentLength(), recreated->GetContentLength());
- EXPECT_EQ(parsed->IsKeepAlive(), recreated->IsKeepAlive());
-
- std::string normalized_parsed;
- parsed->GetNormalizedHeaders(&normalized_parsed);
- std::string normalized_recreated;
- parsed->GetNormalizedHeaders(&normalized_recreated);
- EXPECT_EQ(normalized_parsed, normalized_recreated);
-}
-
-TEST_F(HttpResponseHeadersCacheControlTest, AbsentMaxAgeReturnsFalse) {
- InitializeHeadersWithCacheControl("nocache");
- EXPECT_FALSE(headers()->GetMaxAgeValue(TimeDeltaPointer()));
-}
-
-TEST_F(HttpResponseHeadersCacheControlTest, MaxAgeWithNoParameterRejected) {
- InitializeHeadersWithCacheControl("max-age=,private");
- EXPECT_FALSE(headers()->GetMaxAgeValue(TimeDeltaPointer()));
-}
-
-TEST_F(HttpResponseHeadersCacheControlTest, MaxAgeWithSpaceParameterRejected) {
- InitializeHeadersWithCacheControl("max-age= ,private");
- EXPECT_FALSE(headers()->GetMaxAgeValue(TimeDeltaPointer()));
-}
-
-TEST_F(HttpResponseHeadersCacheControlTest,
- MaxAgeWithSpaceBeforeEqualsIsRejected) {
- InitializeHeadersWithCacheControl("max-age = 7");
- EXPECT_FALSE(headers()->GetMaxAgeValue(TimeDeltaPointer()));
-}
-
-TEST_F(HttpResponseHeadersCacheControlTest, MaxAgeFirstMatchUsed) {
- InitializeHeadersWithCacheControl("max-age=10, max-age=20");
- EXPECT_EQ(TimeDelta::FromSeconds(10), GetMaxAgeValue());
-}
-
-TEST_F(HttpResponseHeadersCacheControlTest, MaxAgeBogusFirstMatchUsed) {
- // "max-age10" isn't parsed as "max-age"; "max-age=now" is parsed as
- // "max-age=0" and so "max-age=20" is not used.
- InitializeHeadersWithCacheControl("max-age10, max-age=now, max-age=20");
- EXPECT_EQ(TimeDelta::FromSeconds(0), GetMaxAgeValue());
-}
-
-TEST_F(HttpResponseHeadersCacheControlTest, MaxAgeCaseInsensitive) {
- InitializeHeadersWithCacheControl("Max-aGe=15");
- EXPECT_EQ(TimeDelta::FromSeconds(15), GetMaxAgeValue());
-}
-
-struct MaxAgeTestData {
- const char* max_age_string;
- const int64 expected_seconds;
-};
-
-class MaxAgeEdgeCasesTest
- : public HttpResponseHeadersCacheControlTest,
- public ::testing::WithParamInterface<MaxAgeTestData> {
-};
-
-TEST_P(MaxAgeEdgeCasesTest, MaxAgeEdgeCases) {
- const MaxAgeTestData test = GetParam();
-
- std::string max_age = "max-age=";
- InitializeHeadersWithCacheControl(
- (max_age + test.max_age_string).c_str());
- EXPECT_EQ(test.expected_seconds, GetMaxAgeValue().InSeconds())
- << " for max-age=" << test.max_age_string;
-}
-
-const MaxAgeTestData max_age_tests[] = {
- {" 1 ", 1}, // Spaces are ignored.
- {"-1", -1}, // Negative numbers are passed through.
- {"--1", 0}, // Leading junk gives 0.
- {"2s", 2}, // Trailing junk is ignored.
- {"3 days", 3},
- {"'4'", 0}, // Single quotes don't work.
- {"\"5\"", 0}, // Double quotes don't work.
- {"0x6", 0}, // Hex not parsed as hex.
- {"7F", 7}, // Hex without 0x still not parsed as hex.
- {"010", 10}, // Octal not parsed as octal.
- {"9223372036854", 9223372036854},
- // {"9223372036855", -9223372036854}, // Undefined behaviour.
- // {"9223372036854775806", -2}, // Undefined behaviour.
- {"9223372036854775807", 9223372036854775807},
- {"20000000000000000000",
- std::numeric_limits<int64>::max()}, // Overflow int64.
-};
-
-INSTANTIATE_TEST_CASE_P(HttpResponseHeadersCacheControl,
- MaxAgeEdgeCasesTest,
- testing::ValuesIn(max_age_tests));
-
-TEST_F(HttpResponseHeadersCacheControlTest,
- AbsentStaleWhileRevalidateReturnsFalse) {
- InitializeHeadersWithCacheControl("max-age=3600");
- EXPECT_FALSE(headers()->GetStaleWhileRevalidateValue(TimeDeltaPointer()));
-}
-
-TEST_F(HttpResponseHeadersCacheControlTest,
- StaleWhileRevalidateWithoutValueRejected) {
- InitializeHeadersWithCacheControl("max-age=3600,stale-while-revalidate=");
- EXPECT_FALSE(headers()->GetStaleWhileRevalidateValue(TimeDeltaPointer()));
-}
-
-TEST_F(HttpResponseHeadersCacheControlTest,
- StaleWhileRevalidateWithInvalidValueTreatedAsZero) {
- InitializeHeadersWithCacheControl("max-age=3600,stale-while-revalidate=true");
- EXPECT_EQ(TimeDelta(), GetStaleWhileRevalidateValue());
-}
-
-TEST_F(HttpResponseHeadersCacheControlTest, StaleWhileRevalidateValueReturned) {
- InitializeHeadersWithCacheControl("max-age=3600,stale-while-revalidate=7200");
- EXPECT_EQ(TimeDelta::FromSeconds(7200), GetStaleWhileRevalidateValue());
-}
-
-TEST_F(HttpResponseHeadersCacheControlTest,
- FirstStaleWhileRevalidateValueUsed) {
- InitializeHeadersWithCacheControl(
- "stale-while-revalidate=1,stale-while-revalidate=7200");
- EXPECT_EQ(TimeDelta::FromSeconds(1), GetStaleWhileRevalidateValue());
-}
-
-} // end namespace
« no previous file with comments | « net/http/http_response_headers.cc ('k') | net/http/http_response_info.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698