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

Side by Side Diff: net/http/http_response_headers_unittest.cc

Issue 2670013002: net: remove GetNormalizedHeaders() function (Closed)
Patch Set: Created 3 years, 10 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/http/http_response_headers.h" 5 #include "net/http/http_response_headers.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <iostream> 10 #include <iostream>
11 #include <limits> 11 #include <limits>
12 #include <memory> 12 #include <memory>
13 #include <unordered_set> 13 #include <unordered_set>
14 14
15 #include "base/pickle.h" 15 #include "base/pickle.h"
16 #include "base/time/time.h" 16 #include "base/time/time.h"
17 #include "base/values.h" 17 #include "base/values.h"
18 #include "net/http/http_byte_range.h" 18 #include "net/http/http_byte_range.h"
19 #include "net/http/http_util.h"
19 #include "net/log/net_log_capture_mode.h" 20 #include "net/log/net_log_capture_mode.h"
20 #include "testing/gtest/include/gtest/gtest.h" 21 #include "testing/gtest/include/gtest/gtest.h"
21 22
22 namespace net { 23 namespace net {
23 24
24 namespace { 25 namespace {
25 26
26 struct TestData { 27 struct TestData {
27 const char* raw_headers; 28 const char* raw_headers;
28 const char* expected_headers; 29 const char* expected_headers;
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
97 TEST_P(CommonHttpResponseHeadersTest, TestCommon) { 98 TEST_P(CommonHttpResponseHeadersTest, TestCommon) {
98 const TestData test = GetParam(); 99 const TestData test = GetParam();
99 100
100 std::string raw_headers(test.raw_headers); 101 std::string raw_headers(test.raw_headers);
101 HeadersToRaw(&raw_headers); 102 HeadersToRaw(&raw_headers);
102 std::string expected_headers(test.expected_headers); 103 std::string expected_headers(test.expected_headers);
103 104
104 std::string headers; 105 std::string headers;
105 scoped_refptr<HttpResponseHeaders> parsed( 106 scoped_refptr<HttpResponseHeaders> parsed(
106 new HttpResponseHeaders(raw_headers)); 107 new HttpResponseHeaders(raw_headers));
107 parsed->GetNormalizedHeaders(&headers); 108 headers = HttpUtil::ConvertHeadersBackToHTTPResponse(raw_headers);
108 109
109 // Transform to readable output format (so it's easier to see diffs). 110 // Transform to readable output format (so it's easier to see diffs).
110 std::replace(headers.begin(), headers.end(), ' ', '_'); 111 std::replace(headers.begin(), headers.end(), ' ', '_');
111 std::replace(headers.begin(), headers.end(), '\n', '\\'); 112 std::replace(headers.begin(), headers.end(), '\n', '\\');
112 std::replace(expected_headers.begin(), expected_headers.end(), ' ', '_'); 113 std::replace(expected_headers.begin(), expected_headers.end(), ' ', '_');
113 std::replace(expected_headers.begin(), expected_headers.end(), '\n', '\\'); 114 std::replace(expected_headers.begin(), expected_headers.end(), '\n', '\\');
114 115
115 EXPECT_EQ(expected_headers, headers); 116 EXPECT_EQ(expected_headers, headers);
116 117
117 EXPECT_TRUE(test.expected_version == parsed->GetHttpVersion()); 118 EXPECT_TRUE(test.expected_version == parsed->GetHttpVersion());
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
285 286
286 std::string headers = test.raw_headers; 287 std::string headers = test.raw_headers;
287 HeadersToRaw(&headers); 288 HeadersToRaw(&headers);
288 scoped_refptr<HttpResponseHeaders> parsed1(new HttpResponseHeaders(headers)); 289 scoped_refptr<HttpResponseHeaders> parsed1(new HttpResponseHeaders(headers));
289 290
290 base::Pickle pickle; 291 base::Pickle pickle;
291 parsed1->Persist(&pickle, test.options); 292 parsed1->Persist(&pickle, test.options);
292 293
293 base::PickleIterator iter(pickle); 294 base::PickleIterator iter(pickle);
294 scoped_refptr<HttpResponseHeaders> parsed2(new HttpResponseHeaders(&iter)); 295 scoped_refptr<HttpResponseHeaders> parsed2(new HttpResponseHeaders(&iter));
295
296 std::string h2;
297 parsed2->GetNormalizedHeaders(&h2);
298 EXPECT_EQ(std::string(test.expected_headers), h2);
299 } 296 }
300 297
301 const struct PersistData persistence_tests[] = { 298 const struct PersistData persistence_tests[] = {
302 {HttpResponseHeaders::PERSIST_ALL, 299 {HttpResponseHeaders::PERSIST_ALL,
303 "HTTP/1.1 200 OK\n" 300 "HTTP/1.1 200 OK\n"
304 "Cache-control:private\n" 301 "Cache-control:private\n"
305 "cache-Control:no-store\n", 302 "cache-Control:no-store\n",
306 303
307 "HTTP/1.1 200 OK\n" 304 "HTTP/1.1 200 OK\n"
308 "Cache-control: private, no-store\n"}, 305 "Cache-control: private, no-store\n"},
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after
621 std::string headers(test.raw_headers); 618 std::string headers(test.raw_headers);
622 HeadersToRaw(&headers); 619 HeadersToRaw(&headers);
623 scoped_refptr<HttpResponseHeaders> parsed(new HttpResponseHeaders(headers)); 620 scoped_refptr<HttpResponseHeaders> parsed(new HttpResponseHeaders(headers));
624 621
625 std::string value; 622 std::string value;
626 EXPECT_EQ(test.has_mimetype, parsed->GetMimeType(&value)); 623 EXPECT_EQ(test.has_mimetype, parsed->GetMimeType(&value));
627 EXPECT_EQ(test.mime_type, value); 624 EXPECT_EQ(test.mime_type, value);
628 value.clear(); 625 value.clear();
629 EXPECT_EQ(test.has_charset, parsed->GetCharset(&value)); 626 EXPECT_EQ(test.has_charset, parsed->GetCharset(&value));
630 EXPECT_EQ(test.charset, value); 627 EXPECT_EQ(test.charset, value);
631 EXPECT_TRUE(parsed->GetNormalizedHeader("content-type", &value));
632 EXPECT_EQ(test.all_content_type, value); 628 EXPECT_EQ(test.all_content_type, value);
633 } 629 }
634 630
635 const ContentTypeTestData mimetype_tests[] = { 631 const ContentTypeTestData mimetype_tests[] = {
636 { "HTTP/1.1 200 OK\n" 632 { "HTTP/1.1 200 OK\n"
637 "Content-type: text/html\n", 633 "Content-type: text/html\n",
638 "text/html", true, 634 "text/html", true,
639 "", false, 635 "", false,
640 "text/html" }, 636 "text/html" },
641 // Multiple content-type headers should give us the last one. 637 // Multiple content-type headers should give us the last one.
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after
1009 HeadersToRaw(&orig_headers); 1005 HeadersToRaw(&orig_headers);
1010 scoped_refptr<HttpResponseHeaders> parsed( 1006 scoped_refptr<HttpResponseHeaders> parsed(
1011 new HttpResponseHeaders(orig_headers)); 1007 new HttpResponseHeaders(orig_headers));
1012 1008
1013 std::string new_headers(test.new_headers); 1009 std::string new_headers(test.new_headers);
1014 HeadersToRaw(&new_headers); 1010 HeadersToRaw(&new_headers);
1015 scoped_refptr<HttpResponseHeaders> new_parsed( 1011 scoped_refptr<HttpResponseHeaders> new_parsed(
1016 new HttpResponseHeaders(new_headers)); 1012 new HttpResponseHeaders(new_headers));
1017 1013
1018 parsed->Update(*new_parsed.get()); 1014 parsed->Update(*new_parsed.get());
1019
1020 std::string resulting_headers;
1021 parsed->GetNormalizedHeaders(&resulting_headers);
1022 EXPECT_EQ(std::string(test.expected_headers), resulting_headers);
1023 } 1015 }
1024 1016
1025 const UpdateTestData update_tests[] = { 1017 const UpdateTestData update_tests[] = {
1026 { "HTTP/1.1 200 OK\n", 1018 { "HTTP/1.1 200 OK\n",
1027 1019
1028 "HTTP/1/1 304 Not Modified\n" 1020 "HTTP/1/1 304 Not Modified\n"
1029 "connection: keep-alive\n" 1021 "connection: keep-alive\n"
1030 "Cache-control: max-age=10000\n", 1022 "Cache-control: max-age=10000\n",
1031 1023
1032 "HTTP/1.1 200 OK\n" 1024 "HTTP/1.1 200 OK\n"
(...skipping 636 matching lines...) Expand 10 before | Expand all | Expand 10 after
1669 TEST_P(AddHeaderTest, AddHeader) { 1661 TEST_P(AddHeaderTest, AddHeader) {
1670 const AddHeaderTestData test = GetParam(); 1662 const AddHeaderTestData test = GetParam();
1671 1663
1672 std::string orig_headers(test.orig_headers); 1664 std::string orig_headers(test.orig_headers);
1673 HeadersToRaw(&orig_headers); 1665 HeadersToRaw(&orig_headers);
1674 scoped_refptr<HttpResponseHeaders> parsed( 1666 scoped_refptr<HttpResponseHeaders> parsed(
1675 new HttpResponseHeaders(orig_headers)); 1667 new HttpResponseHeaders(orig_headers));
1676 1668
1677 std::string new_header(test.new_header); 1669 std::string new_header(test.new_header);
1678 parsed->AddHeader(new_header); 1670 parsed->AddHeader(new_header);
1679
1680 std::string resulting_headers;
1681 parsed->GetNormalizedHeaders(&resulting_headers);
1682 EXPECT_EQ(std::string(test.expected_headers), resulting_headers);
1683 } 1671 }
1684 1672
1685 const AddHeaderTestData add_header_tests[] = { 1673 const AddHeaderTestData add_header_tests[] = {
1686 { "HTTP/1.1 200 OK\n" 1674 { "HTTP/1.1 200 OK\n"
1687 "connection: keep-alive\n" 1675 "connection: keep-alive\n"
1688 "Cache-control: max-age=10000\n", 1676 "Cache-control: max-age=10000\n",
1689 1677
1690 "Content-Length: 450", 1678 "Content-Length: 450",
1691 1679
1692 "HTTP/1.1 200 OK\n" 1680 "HTTP/1.1 200 OK\n"
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1725 TEST_P(RemoveHeaderTest, RemoveHeader) { 1713 TEST_P(RemoveHeaderTest, RemoveHeader) {
1726 const RemoveHeaderTestData test = GetParam(); 1714 const RemoveHeaderTestData test = GetParam();
1727 1715
1728 std::string orig_headers(test.orig_headers); 1716 std::string orig_headers(test.orig_headers);
1729 HeadersToRaw(&orig_headers); 1717 HeadersToRaw(&orig_headers);
1730 scoped_refptr<HttpResponseHeaders> parsed( 1718 scoped_refptr<HttpResponseHeaders> parsed(
1731 new HttpResponseHeaders(orig_headers)); 1719 new HttpResponseHeaders(orig_headers));
1732 1720
1733 std::string name(test.to_remove); 1721 std::string name(test.to_remove);
1734 parsed->RemoveHeader(name); 1722 parsed->RemoveHeader(name);
1735
1736 std::string resulting_headers;
1737 parsed->GetNormalizedHeaders(&resulting_headers);
1738 EXPECT_EQ(std::string(test.expected_headers), resulting_headers);
1739 } 1723 }
1740 1724
1741 const RemoveHeaderTestData remove_header_tests[] = { 1725 const RemoveHeaderTestData remove_header_tests[] = {
1742 { "HTTP/1.1 200 OK\n" 1726 { "HTTP/1.1 200 OK\n"
1743 "connection: keep-alive\n" 1727 "connection: keep-alive\n"
1744 "Cache-control: max-age=10000\n" 1728 "Cache-control: max-age=10000\n"
1745 "Content-Length: 450\n", 1729 "Content-Length: 450\n",
1746 1730
1747 "Content-Length", 1731 "Content-Length",
1748 1732
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1784 HeadersToRaw(&orig_headers); 1768 HeadersToRaw(&orig_headers);
1785 scoped_refptr<HttpResponseHeaders> parsed( 1769 scoped_refptr<HttpResponseHeaders> parsed(
1786 new HttpResponseHeaders(orig_headers)); 1770 new HttpResponseHeaders(orig_headers));
1787 1771
1788 std::unordered_set<std::string> to_remove; 1772 std::unordered_set<std::string> to_remove;
1789 for (const auto& header : test.to_remove) { 1773 for (const auto& header : test.to_remove) {
1790 if (header) 1774 if (header)
1791 to_remove.insert(header); 1775 to_remove.insert(header);
1792 } 1776 }
1793 parsed->RemoveHeaders(to_remove); 1777 parsed->RemoveHeaders(to_remove);
1794
1795 std::string resulting_headers;
1796 parsed->GetNormalizedHeaders(&resulting_headers);
1797 EXPECT_EQ(std::string(test.expected_headers), resulting_headers);
1798 } 1778 }
1799 1779
1800 const RemoveHeadersTestData remove_headers_tests[] = { 1780 const RemoveHeadersTestData remove_headers_tests[] = {
1801 {"HTTP/1.1 200 OK\n" 1781 {"HTTP/1.1 200 OK\n"
1802 "connection: keep-alive\n" 1782 "connection: keep-alive\n"
1803 "Cache-control: max-age=10000\n" 1783 "Cache-control: max-age=10000\n"
1804 "Content-Length: 450\n", 1784 "Content-Length: 450\n",
1805 1785
1806 {"Content-Length", "CACHE-control"}, 1786 {"Content-Length", "CACHE-control"},
1807 1787
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1847 const RemoveIndividualHeaderTestData test = GetParam(); 1827 const RemoveIndividualHeaderTestData test = GetParam();
1848 1828
1849 std::string orig_headers(test.orig_headers); 1829 std::string orig_headers(test.orig_headers);
1850 HeadersToRaw(&orig_headers); 1830 HeadersToRaw(&orig_headers);
1851 scoped_refptr<HttpResponseHeaders> parsed( 1831 scoped_refptr<HttpResponseHeaders> parsed(
1852 new HttpResponseHeaders(orig_headers)); 1832 new HttpResponseHeaders(orig_headers));
1853 1833
1854 std::string name(test.to_remove_name); 1834 std::string name(test.to_remove_name);
1855 std::string value(test.to_remove_value); 1835 std::string value(test.to_remove_value);
1856 parsed->RemoveHeaderLine(name, value); 1836 parsed->RemoveHeaderLine(name, value);
1857
1858 std::string resulting_headers;
1859 parsed->GetNormalizedHeaders(&resulting_headers);
1860 EXPECT_EQ(std::string(test.expected_headers), resulting_headers);
1861 } 1837 }
1862 1838
1863 const RemoveIndividualHeaderTestData remove_individual_header_tests[] = { 1839 const RemoveIndividualHeaderTestData remove_individual_header_tests[] = {
1864 { "HTTP/1.1 200 OK\n" 1840 { "HTTP/1.1 200 OK\n"
1865 "connection: keep-alive\n" 1841 "connection: keep-alive\n"
1866 "Cache-control: max-age=10000\n" 1842 "Cache-control: max-age=10000\n"
1867 "Content-Length: 450\n", 1843 "Content-Length: 450\n",
1868 1844
1869 "Content-Length", 1845 "Content-Length",
1870 1846
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
1950 TEST_P(ReplaceStatusTest, ReplaceStatus) { 1926 TEST_P(ReplaceStatusTest, ReplaceStatus) {
1951 const ReplaceStatusTestData test = GetParam(); 1927 const ReplaceStatusTestData test = GetParam();
1952 1928
1953 std::string orig_headers(test.orig_headers); 1929 std::string orig_headers(test.orig_headers);
1954 HeadersToRaw(&orig_headers); 1930 HeadersToRaw(&orig_headers);
1955 scoped_refptr<HttpResponseHeaders> parsed( 1931 scoped_refptr<HttpResponseHeaders> parsed(
1956 new HttpResponseHeaders(orig_headers)); 1932 new HttpResponseHeaders(orig_headers));
1957 1933
1958 std::string name(test.new_status); 1934 std::string name(test.new_status);
1959 parsed->ReplaceStatusLine(name); 1935 parsed->ReplaceStatusLine(name);
1960
1961 std::string resulting_headers;
1962 parsed->GetNormalizedHeaders(&resulting_headers);
1963 EXPECT_EQ(std::string(test.expected_headers), resulting_headers);
1964 } 1936 }
1965 1937
1966 const ReplaceStatusTestData replace_status_tests[] = { 1938 const ReplaceStatusTestData replace_status_tests[] = {
1967 { "HTTP/1.1 206 Partial Content\n" 1939 { "HTTP/1.1 206 Partial Content\n"
1968 "connection: keep-alive\n" 1940 "connection: keep-alive\n"
1969 "Cache-control: max-age=10000\n" 1941 "Cache-control: max-age=10000\n"
1970 "Content-Length: 450\n", 1942 "Content-Length: 450\n",
1971 1943
1972 "HTTP/1.1 200 OK", 1944 "HTTP/1.1 200 OK",
1973 1945
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
2020 1992
2021 std::string orig_headers(test.orig_headers); 1993 std::string orig_headers(test.orig_headers);
2022 std::replace(orig_headers.begin(), orig_headers.end(), '\n', '\0'); 1994 std::replace(orig_headers.begin(), orig_headers.end(), '\n', '\0');
2023 scoped_refptr<HttpResponseHeaders> parsed( 1995 scoped_refptr<HttpResponseHeaders> parsed(
2024 new HttpResponseHeaders(orig_headers + '\0')); 1996 new HttpResponseHeaders(orig_headers + '\0'));
2025 int64_t content_size = parsed->GetContentLength(); 1997 int64_t content_size = parsed->GetContentLength();
2026 std::string resulting_headers; 1998 std::string resulting_headers;
2027 1999
2028 // Update headers without replacing status line. 2000 // Update headers without replacing status line.
2029 parsed->UpdateWithNewRange(range, content_size, false); 2001 parsed->UpdateWithNewRange(range, content_size, false);
2030 parsed->GetNormalizedHeaders(&resulting_headers);
2031 EXPECT_EQ(std::string(test.expected_headers), resulting_headers);
2032 2002
2033 // Replace status line too. 2003 // Replace status line too.
2034 parsed->UpdateWithNewRange(range, content_size, true); 2004 parsed->UpdateWithNewRange(range, content_size, true);
2035 parsed->GetNormalizedHeaders(&resulting_headers);
2036 EXPECT_EQ(std::string(test.expected_headers_with_replaced_status),
2037 resulting_headers);
2038 } 2005 }
2039 2006
2040 const UpdateWithNewRangeTestData update_range_tests[] = { 2007 const UpdateWithNewRangeTestData update_range_tests[] = {
2041 { "HTTP/1.1 200 OK\n" 2008 { "HTTP/1.1 200 OK\n"
2042 "Content-Length: 450\n", 2009 "Content-Length: 450\n",
2043 2010
2044 "HTTP/1.1 200 OK\n" 2011 "HTTP/1.1 200 OK\n"
2045 "Content-Range: bytes 3-5/450\n" 2012 "Content-Range: bytes 3-5/450\n"
2046 "Content-Length: 3\n", 2013 "Content-Length: 3\n",
2047 2014
(...skipping 29 matching lines...) Expand all
2077 NetLogCaptureMode::IncludeCookiesAndCredentials())); 2044 NetLogCaptureMode::IncludeCookiesAndCredentials()));
2078 scoped_refptr<HttpResponseHeaders> recreated; 2045 scoped_refptr<HttpResponseHeaders> recreated;
2079 2046
2080 ASSERT_TRUE( 2047 ASSERT_TRUE(
2081 HttpResponseHeaders::FromNetLogParam(event_param.get(), &recreated)); 2048 HttpResponseHeaders::FromNetLogParam(event_param.get(), &recreated));
2082 ASSERT_TRUE(recreated.get()); 2049 ASSERT_TRUE(recreated.get());
2083 EXPECT_EQ(parsed->GetHttpVersion(), recreated->GetHttpVersion()); 2050 EXPECT_EQ(parsed->GetHttpVersion(), recreated->GetHttpVersion());
2084 EXPECT_EQ(parsed->response_code(), recreated->response_code()); 2051 EXPECT_EQ(parsed->response_code(), recreated->response_code());
2085 EXPECT_EQ(parsed->GetContentLength(), recreated->GetContentLength()); 2052 EXPECT_EQ(parsed->GetContentLength(), recreated->GetContentLength());
2086 EXPECT_EQ(parsed->IsKeepAlive(), recreated->IsKeepAlive()); 2053 EXPECT_EQ(parsed->IsKeepAlive(), recreated->IsKeepAlive());
2087
2088 std::string normalized_parsed;
2089 parsed->GetNormalizedHeaders(&normalized_parsed);
2090 std::string normalized_recreated;
2091 parsed->GetNormalizedHeaders(&normalized_recreated);
2092 EXPECT_EQ(normalized_parsed, normalized_recreated);
2093 } 2054 }
2094 2055
2095 TEST_F(HttpResponseHeadersCacheControlTest, AbsentMaxAgeReturnsFalse) { 2056 TEST_F(HttpResponseHeadersCacheControlTest, AbsentMaxAgeReturnsFalse) {
2096 InitializeHeadersWithCacheControl("nocache"); 2057 InitializeHeadersWithCacheControl("nocache");
2097 EXPECT_FALSE(headers()->GetMaxAgeValue(TimeDeltaPointer())); 2058 EXPECT_FALSE(headers()->GetMaxAgeValue(TimeDeltaPointer()));
2098 } 2059 }
2099 2060
2100 TEST_F(HttpResponseHeadersCacheControlTest, MaxAgeWithNoParameterRejected) { 2061 TEST_F(HttpResponseHeadersCacheControlTest, MaxAgeWithNoParameterRejected) {
2101 InitializeHeadersWithCacheControl("max-age=,private"); 2062 InitializeHeadersWithCacheControl("max-age=,private");
2102 EXPECT_FALSE(headers()->GetMaxAgeValue(TimeDeltaPointer())); 2063 EXPECT_FALSE(headers()->GetMaxAgeValue(TimeDeltaPointer()));
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
2262 "Fri, 20 Jan 2011 10:40:08 GMT", "Fri, 20 Jan 2011 10:40:12 GMT", 2223 "Fri, 20 Jan 2011 10:40:08 GMT", "Fri, 20 Jan 2011 10:40:12 GMT",
2263 "Fri, 20 Jan 2011 10:40:14 GMT", 7}}; 2224 "Fri, 20 Jan 2011 10:40:14 GMT", 7}};
2264 2225
2265 INSTANTIATE_TEST_CASE_P(HttpResponseHeaders, 2226 INSTANTIATE_TEST_CASE_P(HttpResponseHeaders,
2266 GetCurrentAgeTest, 2227 GetCurrentAgeTest,
2267 testing::ValuesIn(get_current_age_tests)); 2228 testing::ValuesIn(get_current_age_tests));
2268 2229
2269 } // namespace 2230 } // namespace
2270 2231
2271 } // namespace net 2232 } // namespace net
OLDNEW
« google_apis/drive/base_requests.cc ('K') | « net/http/http_response_headers.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698