| OLD | NEW |
| 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 <stddef.h> | 5 #include <stddef.h> |
| 6 #include <stdint.h> | 6 #include <stdint.h> |
| 7 | 7 |
| 8 #include <map> | 8 #include <map> |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <queue> | 10 #include <queue> |
| (...skipping 1758 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1769 net::BoundTestNetLog capturing_net_log; | 1769 net::BoundTestNetLog capturing_net_log; |
| 1770 net::NetLogWithSource net_log = capturing_net_log.bound(); | 1770 net::NetLogWithSource net_log = capturing_net_log.bound(); |
| 1771 WarningSet warning_set; | 1771 WarningSet warning_set; |
| 1772 std::string header_value; | 1772 std::string header_value; |
| 1773 EventResponseDeltas deltas; | 1773 EventResponseDeltas deltas; |
| 1774 | 1774 |
| 1775 // Check that we can handle not changing the headers. | 1775 // Check that we can handle not changing the headers. |
| 1776 linked_ptr<EventResponseDelta> d0( | 1776 linked_ptr<EventResponseDelta> d0( |
| 1777 new EventResponseDelta("extid0", base::Time::FromInternalValue(2500))); | 1777 new EventResponseDelta("extid0", base::Time::FromInternalValue(2500))); |
| 1778 deltas.push_back(d0); | 1778 deltas.push_back(d0); |
| 1779 bool request_headers_modified0; |
| 1779 net::HttpRequestHeaders headers0; | 1780 net::HttpRequestHeaders headers0; |
| 1780 headers0.MergeFrom(base_headers); | 1781 headers0.MergeFrom(base_headers); |
| 1781 MergeOnBeforeSendHeadersResponses(deltas, &headers0, &warning_set, &net_log); | 1782 MergeOnBeforeSendHeadersResponses(deltas, &headers0, &warning_set, &net_log, |
| 1783 &request_headers_modified0); |
| 1782 ASSERT_TRUE(headers0.GetHeader("key1", &header_value)); | 1784 ASSERT_TRUE(headers0.GetHeader("key1", &header_value)); |
| 1783 EXPECT_EQ("value 1", header_value); | 1785 EXPECT_EQ("value 1", header_value); |
| 1784 ASSERT_TRUE(headers0.GetHeader("key2", &header_value)); | 1786 ASSERT_TRUE(headers0.GetHeader("key2", &header_value)); |
| 1785 EXPECT_EQ("value 2", header_value); | 1787 EXPECT_EQ("value 2", header_value); |
| 1786 EXPECT_EQ(0u, warning_set.size()); | 1788 EXPECT_EQ(0u, warning_set.size()); |
| 1787 EXPECT_EQ(0u, capturing_net_log.GetSize()); | 1789 EXPECT_EQ(0u, capturing_net_log.GetSize()); |
| 1790 EXPECT_FALSE(request_headers_modified0); |
| 1788 | 1791 |
| 1789 // Delete, modify and add a header. | 1792 // Delete, modify and add a header. |
| 1790 linked_ptr<EventResponseDelta> d1( | 1793 linked_ptr<EventResponseDelta> d1( |
| 1791 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); | 1794 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); |
| 1792 d1->deleted_request_headers.push_back("key1"); | 1795 d1->deleted_request_headers.push_back("key1"); |
| 1793 d1->modified_request_headers.SetHeader("key2", "value 3"); | 1796 d1->modified_request_headers.SetHeader("key2", "value 3"); |
| 1794 d1->modified_request_headers.SetHeader("key3", "value 3"); | 1797 d1->modified_request_headers.SetHeader("key3", "value 3"); |
| 1795 deltas.push_back(d1); | 1798 deltas.push_back(d1); |
| 1796 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1799 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1797 warning_set.clear(); | 1800 warning_set.clear(); |
| 1798 capturing_net_log.Clear(); | 1801 capturing_net_log.Clear(); |
| 1802 bool request_headers_modified1; |
| 1799 net::HttpRequestHeaders headers1; | 1803 net::HttpRequestHeaders headers1; |
| 1800 headers1.MergeFrom(base_headers); | 1804 headers1.MergeFrom(base_headers); |
| 1801 MergeOnBeforeSendHeadersResponses(deltas, &headers1, &warning_set, &net_log); | 1805 MergeOnBeforeSendHeadersResponses(deltas, &headers1, &warning_set, &net_log, |
| 1806 &request_headers_modified1); |
| 1802 EXPECT_FALSE(headers1.HasHeader("key1")); | 1807 EXPECT_FALSE(headers1.HasHeader("key1")); |
| 1803 ASSERT_TRUE(headers1.GetHeader("key2", &header_value)); | 1808 ASSERT_TRUE(headers1.GetHeader("key2", &header_value)); |
| 1804 EXPECT_EQ("value 3", header_value); | 1809 EXPECT_EQ("value 3", header_value); |
| 1805 ASSERT_TRUE(headers1.GetHeader("key3", &header_value)); | 1810 ASSERT_TRUE(headers1.GetHeader("key3", &header_value)); |
| 1806 EXPECT_EQ("value 3", header_value); | 1811 EXPECT_EQ("value 3", header_value); |
| 1807 EXPECT_EQ(0u, warning_set.size()); | 1812 EXPECT_EQ(0u, warning_set.size()); |
| 1808 EXPECT_EQ(1u, capturing_net_log.GetSize()); | 1813 EXPECT_EQ(1u, capturing_net_log.GetSize()); |
| 1814 EXPECT_TRUE(request_headers_modified1); |
| 1809 | 1815 |
| 1810 // Check that conflicts are atomic, i.e. if one header modification | 1816 // Check that conflicts are atomic, i.e. if one header modification |
| 1811 // collides all other conflicts of the same extension are declined as well. | 1817 // collides all other conflicts of the same extension are declined as well. |
| 1812 linked_ptr<EventResponseDelta> d2( | 1818 linked_ptr<EventResponseDelta> d2( |
| 1813 new EventResponseDelta("extid2", base::Time::FromInternalValue(1500))); | 1819 new EventResponseDelta("extid2", base::Time::FromInternalValue(1500))); |
| 1814 // This one conflicts: | 1820 // This one conflicts: |
| 1815 d2->modified_request_headers.SetHeader("key3", "value 0"); | 1821 d2->modified_request_headers.SetHeader("key3", "value 0"); |
| 1816 d2->modified_request_headers.SetHeader("key4", "value 4"); | 1822 d2->modified_request_headers.SetHeader("key4", "value 4"); |
| 1817 deltas.push_back(d2); | 1823 deltas.push_back(d2); |
| 1818 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1824 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1819 warning_set.clear(); | 1825 warning_set.clear(); |
| 1820 capturing_net_log.Clear(); | 1826 capturing_net_log.Clear(); |
| 1827 bool request_headers_modified2; |
| 1821 net::HttpRequestHeaders headers2; | 1828 net::HttpRequestHeaders headers2; |
| 1822 headers2.MergeFrom(base_headers); | 1829 headers2.MergeFrom(base_headers); |
| 1823 MergeOnBeforeSendHeadersResponses(deltas, &headers2, &warning_set, &net_log); | 1830 MergeOnBeforeSendHeadersResponses(deltas, &headers2, &warning_set, &net_log, |
| 1831 &request_headers_modified2); |
| 1824 EXPECT_FALSE(headers2.HasHeader("key1")); | 1832 EXPECT_FALSE(headers2.HasHeader("key1")); |
| 1825 ASSERT_TRUE(headers2.GetHeader("key2", &header_value)); | 1833 ASSERT_TRUE(headers2.GetHeader("key2", &header_value)); |
| 1826 EXPECT_EQ("value 3", header_value); | 1834 EXPECT_EQ("value 3", header_value); |
| 1827 ASSERT_TRUE(headers2.GetHeader("key3", &header_value)); | 1835 ASSERT_TRUE(headers2.GetHeader("key3", &header_value)); |
| 1828 EXPECT_EQ("value 3", header_value); | 1836 EXPECT_EQ("value 3", header_value); |
| 1829 EXPECT_FALSE(headers2.HasHeader("key4")); | 1837 EXPECT_FALSE(headers2.HasHeader("key4")); |
| 1830 EXPECT_EQ(1u, warning_set.size()); | 1838 EXPECT_EQ(1u, warning_set.size()); |
| 1831 EXPECT_TRUE(HasWarning(warning_set, "extid2")); | 1839 EXPECT_TRUE(HasWarning(warning_set, "extid2")); |
| 1832 EXPECT_EQ(2u, capturing_net_log.GetSize()); | 1840 EXPECT_EQ(2u, capturing_net_log.GetSize()); |
| 1841 EXPECT_TRUE(request_headers_modified2); |
| 1833 | 1842 |
| 1834 // Check that identical modifications don't conflict and operations | 1843 // Check that identical modifications don't conflict and operations |
| 1835 // can be merged. | 1844 // can be merged. |
| 1836 linked_ptr<EventResponseDelta> d3( | 1845 linked_ptr<EventResponseDelta> d3( |
| 1837 new EventResponseDelta("extid3", base::Time::FromInternalValue(1000))); | 1846 new EventResponseDelta("extid3", base::Time::FromInternalValue(1000))); |
| 1838 d3->deleted_request_headers.push_back("key1"); | 1847 d3->deleted_request_headers.push_back("key1"); |
| 1839 d3->modified_request_headers.SetHeader("key2", "value 3"); | 1848 d3->modified_request_headers.SetHeader("key2", "value 3"); |
| 1840 d3->modified_request_headers.SetHeader("key5", "value 5"); | 1849 d3->modified_request_headers.SetHeader("key5", "value 5"); |
| 1841 deltas.push_back(d3); | 1850 deltas.push_back(d3); |
| 1842 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1851 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1843 warning_set.clear(); | 1852 warning_set.clear(); |
| 1844 capturing_net_log.Clear(); | 1853 capturing_net_log.Clear(); |
| 1854 bool request_headers_modified3; |
| 1845 net::HttpRequestHeaders headers3; | 1855 net::HttpRequestHeaders headers3; |
| 1846 headers3.MergeFrom(base_headers); | 1856 headers3.MergeFrom(base_headers); |
| 1847 MergeOnBeforeSendHeadersResponses(deltas, &headers3, &warning_set, &net_log); | 1857 MergeOnBeforeSendHeadersResponses(deltas, &headers3, &warning_set, &net_log, |
| 1858 &request_headers_modified3); |
| 1848 EXPECT_FALSE(headers3.HasHeader("key1")); | 1859 EXPECT_FALSE(headers3.HasHeader("key1")); |
| 1849 ASSERT_TRUE(headers3.GetHeader("key2", &header_value)); | 1860 ASSERT_TRUE(headers3.GetHeader("key2", &header_value)); |
| 1850 EXPECT_EQ("value 3", header_value); | 1861 EXPECT_EQ("value 3", header_value); |
| 1851 ASSERT_TRUE(headers3.GetHeader("key3", &header_value)); | 1862 ASSERT_TRUE(headers3.GetHeader("key3", &header_value)); |
| 1852 EXPECT_EQ("value 3", header_value); | 1863 EXPECT_EQ("value 3", header_value); |
| 1853 ASSERT_TRUE(headers3.GetHeader("key5", &header_value)); | 1864 ASSERT_TRUE(headers3.GetHeader("key5", &header_value)); |
| 1854 EXPECT_EQ("value 5", header_value); | 1865 EXPECT_EQ("value 5", header_value); |
| 1855 EXPECT_EQ(1u, warning_set.size()); | 1866 EXPECT_EQ(1u, warning_set.size()); |
| 1856 EXPECT_TRUE(HasWarning(warning_set, "extid2")); | 1867 EXPECT_TRUE(HasWarning(warning_set, "extid2")); |
| 1857 EXPECT_EQ(3u, capturing_net_log.GetSize()); | 1868 EXPECT_EQ(3u, capturing_net_log.GetSize()); |
| 1869 EXPECT_TRUE(request_headers_modified3); |
| 1858 } | 1870 } |
| 1859 | 1871 |
| 1860 TEST(ExtensionWebRequestHelpersTest, | 1872 TEST(ExtensionWebRequestHelpersTest, |
| 1861 TestMergeOnBeforeSendHeadersResponses_Cookies) { | 1873 TestMergeOnBeforeSendHeadersResponses_Cookies) { |
| 1862 net::HttpRequestHeaders base_headers; | 1874 net::HttpRequestHeaders base_headers; |
| 1863 base_headers.AddHeaderFromString( | 1875 base_headers.AddHeaderFromString( |
| 1864 "Cookie: name=value; name2=value2; name3=\"value3\""); | 1876 "Cookie: name=value; name2=value2; name3=\"value3\""); |
| 1865 net::BoundTestNetLog capturing_net_log; | 1877 net::BoundTestNetLog capturing_net_log; |
| 1866 net::NetLogWithSource net_log = capturing_net_log.bound(); | 1878 net::NetLogWithSource net_log = capturing_net_log.bound(); |
| 1867 WarningSet warning_set; | 1879 WarningSet warning_set; |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1900 add_cookie, add_cookie_2, edit_cookie, remove_cookie | 1912 add_cookie, add_cookie_2, edit_cookie, remove_cookie |
| 1901 }; | 1913 }; |
| 1902 | 1914 |
| 1903 for (size_t i = 0; i < arraysize(operations); ++i) { | 1915 for (size_t i = 0; i < arraysize(operations); ++i) { |
| 1904 linked_ptr<EventResponseDelta> delta( | 1916 linked_ptr<EventResponseDelta> delta( |
| 1905 new EventResponseDelta("extid0", base::Time::FromInternalValue(i * 5))); | 1917 new EventResponseDelta("extid0", base::Time::FromInternalValue(i * 5))); |
| 1906 delta->request_cookie_modifications.push_back(operations[i]); | 1918 delta->request_cookie_modifications.push_back(operations[i]); |
| 1907 deltas.push_back(delta); | 1919 deltas.push_back(delta); |
| 1908 } | 1920 } |
| 1909 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1921 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1922 bool request_headers_modified1; |
| 1910 net::HttpRequestHeaders headers1; | 1923 net::HttpRequestHeaders headers1; |
| 1911 headers1.MergeFrom(base_headers); | 1924 headers1.MergeFrom(base_headers); |
| 1912 warning_set.clear(); | 1925 warning_set.clear(); |
| 1913 MergeOnBeforeSendHeadersResponses(deltas, &headers1, &warning_set, &net_log); | 1926 MergeOnBeforeSendHeadersResponses(deltas, &headers1, &warning_set, &net_log, |
| 1927 &request_headers_modified1); |
| 1914 EXPECT_TRUE(headers1.HasHeader("Cookie")); | 1928 EXPECT_TRUE(headers1.HasHeader("Cookie")); |
| 1915 ASSERT_TRUE(headers1.GetHeader("Cookie", &header_value)); | 1929 ASSERT_TRUE(headers1.GetHeader("Cookie", &header_value)); |
| 1916 EXPECT_EQ("name=new value; name2=new value; name4=\"value 4\"", header_value); | 1930 EXPECT_EQ("name=new value; name2=new value; name4=\"value 4\"", header_value); |
| 1917 EXPECT_EQ(0u, warning_set.size()); | 1931 EXPECT_EQ(0u, warning_set.size()); |
| 1918 EXPECT_EQ(0u, capturing_net_log.GetSize()); | 1932 EXPECT_EQ(0u, capturing_net_log.GetSize()); |
| 1933 EXPECT_FALSE(request_headers_modified1); |
| 1919 } | 1934 } |
| 1920 | 1935 |
| 1921 namespace { | 1936 namespace { |
| 1922 | 1937 |
| 1923 std::string GetCookieExpirationDate(int delta_secs) { | 1938 std::string GetCookieExpirationDate(int delta_secs) { |
| 1924 const char* const kWeekDays[] = { | 1939 const char* const kWeekDays[] = { |
| 1925 "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" | 1940 "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" |
| 1926 }; | 1941 }; |
| 1927 const char* const kMonthNames[] = { | 1942 const char* const kMonthNames[] = { |
| 1928 "Jan", "Feb", "Mar", "Apr", "May", "Jun", | 1943 "Jan", "Feb", "Mar", "Apr", "May", "Jun", |
| (...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2194 "\r\n"; | 2209 "\r\n"; |
| 2195 scoped_refptr<net::HttpResponseHeaders> base_headers( | 2210 scoped_refptr<net::HttpResponseHeaders> base_headers( |
| 2196 new net::HttpResponseHeaders( | 2211 new net::HttpResponseHeaders( |
| 2197 net::HttpUtil::AssembleRawHeaders( | 2212 net::HttpUtil::AssembleRawHeaders( |
| 2198 base_headers_string, sizeof(base_headers_string)))); | 2213 base_headers_string, sizeof(base_headers_string)))); |
| 2199 | 2214 |
| 2200 // Check that we can handle if not touching the response headers. | 2215 // Check that we can handle if not touching the response headers. |
| 2201 linked_ptr<EventResponseDelta> d0( | 2216 linked_ptr<EventResponseDelta> d0( |
| 2202 new EventResponseDelta("extid0", base::Time::FromInternalValue(3000))); | 2217 new EventResponseDelta("extid0", base::Time::FromInternalValue(3000))); |
| 2203 deltas.push_back(d0); | 2218 deltas.push_back(d0); |
| 2219 bool response_headers_modified0; |
| 2204 scoped_refptr<net::HttpResponseHeaders> new_headers0; | 2220 scoped_refptr<net::HttpResponseHeaders> new_headers0; |
| 2205 GURL allowed_unsafe_redirect_url0; | 2221 GURL allowed_unsafe_redirect_url0; |
| 2206 MergeOnHeadersReceivedResponses(GURL(kExampleUrl), deltas, base_headers.get(), | 2222 MergeOnHeadersReceivedResponses(GURL(kExampleUrl), deltas, base_headers.get(), |
| 2207 &new_headers0, &allowed_unsafe_redirect_url0, | 2223 &new_headers0, &allowed_unsafe_redirect_url0, |
| 2208 &warning_set, &net_log); | 2224 &warning_set, &net_log, |
| 2225 &response_headers_modified0); |
| 2209 EXPECT_FALSE(new_headers0.get()); | 2226 EXPECT_FALSE(new_headers0.get()); |
| 2210 EXPECT_TRUE(allowed_unsafe_redirect_url0.is_empty()); | 2227 EXPECT_TRUE(allowed_unsafe_redirect_url0.is_empty()); |
| 2211 EXPECT_EQ(0u, warning_set.size()); | 2228 EXPECT_EQ(0u, warning_set.size()); |
| 2212 EXPECT_EQ(0u, capturing_net_log.GetSize()); | 2229 EXPECT_EQ(0u, capturing_net_log.GetSize()); |
| 2230 EXPECT_FALSE(response_headers_modified0); |
| 2213 | 2231 |
| 2214 linked_ptr<EventResponseDelta> d1( | 2232 linked_ptr<EventResponseDelta> d1( |
| 2215 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); | 2233 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); |
| 2216 d1->deleted_response_headers.push_back(ResponseHeader("KEY1", "Value1")); | 2234 d1->deleted_response_headers.push_back(ResponseHeader("KEY1", "Value1")); |
| 2217 d1->deleted_response_headers.push_back(ResponseHeader("KEY2", "Value2, Foo")); | 2235 d1->deleted_response_headers.push_back(ResponseHeader("KEY2", "Value2, Foo")); |
| 2218 d1->added_response_headers.push_back(ResponseHeader("Key2", "Value3")); | 2236 d1->added_response_headers.push_back(ResponseHeader("Key2", "Value3")); |
| 2219 deltas.push_back(d1); | 2237 deltas.push_back(d1); |
| 2220 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 2238 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 2221 warning_set.clear(); | 2239 warning_set.clear(); |
| 2222 capturing_net_log.Clear(); | 2240 capturing_net_log.Clear(); |
| 2241 bool response_headers_modified1; |
| 2223 scoped_refptr<net::HttpResponseHeaders> new_headers1; | 2242 scoped_refptr<net::HttpResponseHeaders> new_headers1; |
| 2224 GURL allowed_unsafe_redirect_url1; | 2243 GURL allowed_unsafe_redirect_url1; |
| 2225 MergeOnHeadersReceivedResponses(GURL(kExampleUrl), deltas, base_headers.get(), | 2244 MergeOnHeadersReceivedResponses(GURL(kExampleUrl), deltas, base_headers.get(), |
| 2226 &new_headers1, &allowed_unsafe_redirect_url1, | 2245 &new_headers1, &allowed_unsafe_redirect_url1, |
| 2227 &warning_set, &net_log); | 2246 &warning_set, &net_log, |
| 2247 &response_headers_modified1); |
| 2228 ASSERT_TRUE(new_headers1.get()); | 2248 ASSERT_TRUE(new_headers1.get()); |
| 2229 EXPECT_TRUE(allowed_unsafe_redirect_url1.is_empty()); | 2249 EXPECT_TRUE(allowed_unsafe_redirect_url1.is_empty()); |
| 2230 std::multimap<std::string, std::string> expected1; | 2250 std::multimap<std::string, std::string> expected1; |
| 2231 expected1.insert(std::pair<std::string, std::string>("Key2", "Value3")); | 2251 expected1.insert(std::pair<std::string, std::string>("Key2", "Value3")); |
| 2232 size_t iter = 0; | 2252 size_t iter = 0; |
| 2233 std::string name; | 2253 std::string name; |
| 2234 std::string value; | 2254 std::string value; |
| 2235 std::multimap<std::string, std::string> actual1; | 2255 std::multimap<std::string, std::string> actual1; |
| 2236 while (new_headers1->EnumerateHeaderLines(&iter, &name, &value)) { | 2256 while (new_headers1->EnumerateHeaderLines(&iter, &name, &value)) { |
| 2237 actual1.insert(std::pair<std::string, std::string>(name, value)); | 2257 actual1.insert(std::pair<std::string, std::string>(name, value)); |
| 2238 } | 2258 } |
| 2239 EXPECT_EQ(expected1, actual1); | 2259 EXPECT_EQ(expected1, actual1); |
| 2240 EXPECT_EQ(0u, warning_set.size()); | 2260 EXPECT_EQ(0u, warning_set.size()); |
| 2241 EXPECT_EQ(1u, capturing_net_log.GetSize()); | 2261 EXPECT_EQ(1u, capturing_net_log.GetSize()); |
| 2262 EXPECT_TRUE(response_headers_modified1); |
| 2242 | 2263 |
| 2243 // Check that we replace response headers only once. | 2264 // Check that we replace response headers only once. |
| 2244 linked_ptr<EventResponseDelta> d2( | 2265 linked_ptr<EventResponseDelta> d2( |
| 2245 new EventResponseDelta("extid2", base::Time::FromInternalValue(1500))); | 2266 new EventResponseDelta("extid2", base::Time::FromInternalValue(1500))); |
| 2246 // Note that we use a different capitalization of KeY2. This should not | 2267 // Note that we use a different capitalization of KeY2. This should not |
| 2247 // matter. | 2268 // matter. |
| 2248 d2->deleted_response_headers.push_back(ResponseHeader("KeY2", "Value2, Foo")); | 2269 d2->deleted_response_headers.push_back(ResponseHeader("KeY2", "Value2, Foo")); |
| 2249 d2->added_response_headers.push_back(ResponseHeader("Key2", "Value4")); | 2270 d2->added_response_headers.push_back(ResponseHeader("Key2", "Value4")); |
| 2250 deltas.push_back(d2); | 2271 deltas.push_back(d2); |
| 2251 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 2272 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 2252 warning_set.clear(); | 2273 warning_set.clear(); |
| 2253 capturing_net_log.Clear(); | 2274 capturing_net_log.Clear(); |
| 2275 bool response_headers_modified2; |
| 2254 scoped_refptr<net::HttpResponseHeaders> new_headers2; | 2276 scoped_refptr<net::HttpResponseHeaders> new_headers2; |
| 2255 GURL allowed_unsafe_redirect_url2; | 2277 GURL allowed_unsafe_redirect_url2; |
| 2256 MergeOnHeadersReceivedResponses(GURL(kExampleUrl), deltas, base_headers.get(), | 2278 MergeOnHeadersReceivedResponses(GURL(kExampleUrl), deltas, base_headers.get(), |
| 2257 &new_headers2, &allowed_unsafe_redirect_url2, | 2279 &new_headers2, &allowed_unsafe_redirect_url2, |
| 2258 &warning_set, &net_log); | 2280 &warning_set, &net_log, |
| 2281 &response_headers_modified2); |
| 2259 ASSERT_TRUE(new_headers2.get()); | 2282 ASSERT_TRUE(new_headers2.get()); |
| 2260 EXPECT_TRUE(allowed_unsafe_redirect_url2.is_empty()); | 2283 EXPECT_TRUE(allowed_unsafe_redirect_url2.is_empty()); |
| 2261 iter = 0; | 2284 iter = 0; |
| 2262 std::multimap<std::string, std::string> actual2; | 2285 std::multimap<std::string, std::string> actual2; |
| 2263 while (new_headers2->EnumerateHeaderLines(&iter, &name, &value)) { | 2286 while (new_headers2->EnumerateHeaderLines(&iter, &name, &value)) { |
| 2264 actual2.insert(std::pair<std::string, std::string>(name, value)); | 2287 actual2.insert(std::pair<std::string, std::string>(name, value)); |
| 2265 } | 2288 } |
| 2266 EXPECT_EQ(expected1, actual2); | 2289 EXPECT_EQ(expected1, actual2); |
| 2267 EXPECT_EQ(1u, warning_set.size()); | 2290 EXPECT_EQ(1u, warning_set.size()); |
| 2268 EXPECT_TRUE(HasWarning(warning_set, "extid2")); | 2291 EXPECT_TRUE(HasWarning(warning_set, "extid2")); |
| 2269 EXPECT_EQ(2u, capturing_net_log.GetSize()); | 2292 EXPECT_EQ(2u, capturing_net_log.GetSize()); |
| 2293 EXPECT_TRUE(response_headers_modified2); |
| 2270 } | 2294 } |
| 2271 | 2295 |
| 2272 // Check that we do not delete too much | 2296 // Check that we do not delete too much |
| 2273 TEST(ExtensionWebRequestHelpersTest, | 2297 TEST(ExtensionWebRequestHelpersTest, |
| 2274 TestMergeOnHeadersReceivedResponsesDeletion) { | 2298 TestMergeOnHeadersReceivedResponsesDeletion) { |
| 2275 net::BoundTestNetLog capturing_net_log; | 2299 net::BoundTestNetLog capturing_net_log; |
| 2276 net::NetLogWithSource net_log = capturing_net_log.bound(); | 2300 net::NetLogWithSource net_log = capturing_net_log.bound(); |
| 2277 WarningSet warning_set; | 2301 WarningSet warning_set; |
| 2278 std::string header_value; | 2302 std::string header_value; |
| 2279 EventResponseDeltas deltas; | 2303 EventResponseDeltas deltas; |
| 2280 | 2304 |
| 2281 char base_headers_string[] = | 2305 char base_headers_string[] = |
| 2282 "HTTP/1.0 200 OK\r\n" | 2306 "HTTP/1.0 200 OK\r\n" |
| 2283 "Key1: Value1\r\n" | 2307 "Key1: Value1\r\n" |
| 2284 "Key1: Value2\r\n" | 2308 "Key1: Value2\r\n" |
| 2285 "Key1: Value3\r\n" | 2309 "Key1: Value3\r\n" |
| 2286 "Key2: Value4\r\n" | 2310 "Key2: Value4\r\n" |
| 2287 "\r\n"; | 2311 "\r\n"; |
| 2288 scoped_refptr<net::HttpResponseHeaders> base_headers( | 2312 scoped_refptr<net::HttpResponseHeaders> base_headers( |
| 2289 new net::HttpResponseHeaders( | 2313 new net::HttpResponseHeaders( |
| 2290 net::HttpUtil::AssembleRawHeaders( | 2314 net::HttpUtil::AssembleRawHeaders( |
| 2291 base_headers_string, sizeof(base_headers_string)))); | 2315 base_headers_string, sizeof(base_headers_string)))); |
| 2292 | 2316 |
| 2293 linked_ptr<EventResponseDelta> d1( | 2317 linked_ptr<EventResponseDelta> d1( |
| 2294 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); | 2318 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); |
| 2295 d1->deleted_response_headers.push_back(ResponseHeader("KEY1", "Value2")); | 2319 d1->deleted_response_headers.push_back(ResponseHeader("KEY1", "Value2")); |
| 2296 deltas.push_back(d1); | 2320 deltas.push_back(d1); |
| 2321 bool response_headers_modified1; |
| 2297 scoped_refptr<net::HttpResponseHeaders> new_headers1; | 2322 scoped_refptr<net::HttpResponseHeaders> new_headers1; |
| 2298 GURL allowed_unsafe_redirect_url1; | 2323 GURL allowed_unsafe_redirect_url1; |
| 2299 MergeOnHeadersReceivedResponses(GURL(kExampleUrl), deltas, base_headers.get(), | 2324 MergeOnHeadersReceivedResponses(GURL(kExampleUrl), deltas, base_headers.get(), |
| 2300 &new_headers1, &allowed_unsafe_redirect_url1, | 2325 &new_headers1, &allowed_unsafe_redirect_url1, |
| 2301 &warning_set, &net_log); | 2326 &warning_set, &net_log, |
| 2327 &response_headers_modified1); |
| 2302 ASSERT_TRUE(new_headers1.get()); | 2328 ASSERT_TRUE(new_headers1.get()); |
| 2303 EXPECT_TRUE(allowed_unsafe_redirect_url1.is_empty()); | 2329 EXPECT_TRUE(allowed_unsafe_redirect_url1.is_empty()); |
| 2304 std::multimap<std::string, std::string> expected1; | 2330 std::multimap<std::string, std::string> expected1; |
| 2305 expected1.insert(std::pair<std::string, std::string>("Key1", "Value1")); | 2331 expected1.insert(std::pair<std::string, std::string>("Key1", "Value1")); |
| 2306 expected1.insert(std::pair<std::string, std::string>("Key1", "Value3")); | 2332 expected1.insert(std::pair<std::string, std::string>("Key1", "Value3")); |
| 2307 expected1.insert(std::pair<std::string, std::string>("Key2", "Value4")); | 2333 expected1.insert(std::pair<std::string, std::string>("Key2", "Value4")); |
| 2308 size_t iter = 0; | 2334 size_t iter = 0; |
| 2309 std::string name; | 2335 std::string name; |
| 2310 std::string value; | 2336 std::string value; |
| 2311 std::multimap<std::string, std::string> actual1; | 2337 std::multimap<std::string, std::string> actual1; |
| 2312 while (new_headers1->EnumerateHeaderLines(&iter, &name, &value)) { | 2338 while (new_headers1->EnumerateHeaderLines(&iter, &name, &value)) { |
| 2313 actual1.insert(std::pair<std::string, std::string>(name, value)); | 2339 actual1.insert(std::pair<std::string, std::string>(name, value)); |
| 2314 } | 2340 } |
| 2315 EXPECT_EQ(expected1, actual1); | 2341 EXPECT_EQ(expected1, actual1); |
| 2316 EXPECT_EQ(0u, warning_set.size()); | 2342 EXPECT_EQ(0u, warning_set.size()); |
| 2317 EXPECT_EQ(1u, capturing_net_log.GetSize()); | 2343 EXPECT_EQ(1u, capturing_net_log.GetSize()); |
| 2344 EXPECT_TRUE(response_headers_modified1); |
| 2318 } | 2345 } |
| 2319 | 2346 |
| 2320 // Tests whether onHeadersReceived can initiate a redirect. | 2347 // Tests whether onHeadersReceived can initiate a redirect. |
| 2321 // The URL merge logic is shared with onBeforeRequest, so we only need to test | 2348 // The URL merge logic is shared with onBeforeRequest, so we only need to test |
| 2322 // whether the URLs are merged at all. | 2349 // whether the URLs are merged at all. |
| 2323 TEST(ExtensionWebRequestHelpersTest, | 2350 TEST(ExtensionWebRequestHelpersTest, |
| 2324 TestMergeOnHeadersReceivedResponsesRedirect) { | 2351 TestMergeOnHeadersReceivedResponsesRedirect) { |
| 2325 EventResponseDeltas deltas; | 2352 EventResponseDeltas deltas; |
| 2326 net::BoundTestNetLog capturing_net_log; | 2353 net::BoundTestNetLog capturing_net_log; |
| 2327 net::NetLogWithSource net_log = capturing_net_log.bound(); | 2354 net::NetLogWithSource net_log = capturing_net_log.bound(); |
| 2328 WarningSet warning_set; | 2355 WarningSet warning_set; |
| 2329 | 2356 |
| 2330 char base_headers_string[] = | 2357 char base_headers_string[] = |
| 2331 "HTTP/1.0 200 OK\r\n" | 2358 "HTTP/1.0 200 OK\r\n" |
| 2332 "\r\n"; | 2359 "\r\n"; |
| 2333 scoped_refptr<net::HttpResponseHeaders> base_headers( | 2360 scoped_refptr<net::HttpResponseHeaders> base_headers( |
| 2334 new net::HttpResponseHeaders(net::HttpUtil::AssembleRawHeaders( | 2361 new net::HttpResponseHeaders(net::HttpUtil::AssembleRawHeaders( |
| 2335 base_headers_string, sizeof(base_headers_string)))); | 2362 base_headers_string, sizeof(base_headers_string)))); |
| 2336 | 2363 |
| 2337 // No redirect | 2364 // No redirect |
| 2338 linked_ptr<EventResponseDelta> d0( | 2365 linked_ptr<EventResponseDelta> d0( |
| 2339 new EventResponseDelta("extid0", base::Time::FromInternalValue(0))); | 2366 new EventResponseDelta("extid0", base::Time::FromInternalValue(0))); |
| 2340 deltas.push_back(d0); | 2367 deltas.push_back(d0); |
| 2368 bool response_headers_modified0; |
| 2341 scoped_refptr<net::HttpResponseHeaders> new_headers0; | 2369 scoped_refptr<net::HttpResponseHeaders> new_headers0; |
| 2342 GURL allowed_unsafe_redirect_url0; | 2370 GURL allowed_unsafe_redirect_url0; |
| 2343 MergeOnHeadersReceivedResponses(GURL(kExampleUrl), deltas, base_headers.get(), | 2371 MergeOnHeadersReceivedResponses(GURL(kExampleUrl), deltas, base_headers.get(), |
| 2344 &new_headers0, &allowed_unsafe_redirect_url0, | 2372 &new_headers0, &allowed_unsafe_redirect_url0, |
| 2345 &warning_set, &net_log); | 2373 &warning_set, &net_log, |
| 2374 &response_headers_modified0); |
| 2346 EXPECT_FALSE(new_headers0.get()); | 2375 EXPECT_FALSE(new_headers0.get()); |
| 2347 EXPECT_TRUE(allowed_unsafe_redirect_url0.is_empty()); | 2376 EXPECT_TRUE(allowed_unsafe_redirect_url0.is_empty()); |
| 2348 EXPECT_EQ(0u, warning_set.size()); | 2377 EXPECT_EQ(0u, warning_set.size()); |
| 2349 EXPECT_EQ(0u, capturing_net_log.GetSize()); | 2378 EXPECT_EQ(0u, capturing_net_log.GetSize()); |
| 2379 EXPECT_FALSE(response_headers_modified0); |
| 2350 | 2380 |
| 2351 // Single redirect. | 2381 // Single redirect. |
| 2352 GURL new_url_1("http://foo.com"); | 2382 GURL new_url_1("http://foo.com"); |
| 2353 linked_ptr<EventResponseDelta> d1( | 2383 linked_ptr<EventResponseDelta> d1( |
| 2354 new EventResponseDelta("extid1", base::Time::FromInternalValue(1000))); | 2384 new EventResponseDelta("extid1", base::Time::FromInternalValue(1000))); |
| 2355 d1->new_url = GURL(new_url_1); | 2385 d1->new_url = GURL(new_url_1); |
| 2356 deltas.push_back(d1); | 2386 deltas.push_back(d1); |
| 2357 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 2387 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 2358 capturing_net_log.Clear(); | 2388 capturing_net_log.Clear(); |
| 2389 bool response_headers_modified1; |
| 2359 scoped_refptr<net::HttpResponseHeaders> new_headers1; | 2390 scoped_refptr<net::HttpResponseHeaders> new_headers1; |
| 2360 GURL allowed_unsafe_redirect_url1; | 2391 GURL allowed_unsafe_redirect_url1; |
| 2361 MergeOnHeadersReceivedResponses(GURL(kExampleUrl), deltas, base_headers.get(), | 2392 MergeOnHeadersReceivedResponses(GURL(kExampleUrl), deltas, base_headers.get(), |
| 2362 &new_headers1, &allowed_unsafe_redirect_url1, | 2393 &new_headers1, &allowed_unsafe_redirect_url1, |
| 2363 &warning_set, &net_log); | 2394 &warning_set, &net_log, |
| 2395 &response_headers_modified1); |
| 2364 | 2396 |
| 2365 EXPECT_TRUE(new_headers1.get()); | 2397 EXPECT_TRUE(new_headers1.get()); |
| 2366 EXPECT_TRUE(new_headers1->HasHeaderValue("Location", new_url_1.spec())); | 2398 EXPECT_TRUE(new_headers1->HasHeaderValue("Location", new_url_1.spec())); |
| 2367 EXPECT_EQ(new_url_1, allowed_unsafe_redirect_url1); | 2399 EXPECT_EQ(new_url_1, allowed_unsafe_redirect_url1); |
| 2368 EXPECT_TRUE(warning_set.empty()); | 2400 EXPECT_TRUE(warning_set.empty()); |
| 2369 EXPECT_EQ(1u, capturing_net_log.GetSize()); | 2401 EXPECT_EQ(1u, capturing_net_log.GetSize()); |
| 2402 EXPECT_FALSE(response_headers_modified1); |
| 2370 } | 2403 } |
| 2371 | 2404 |
| 2372 TEST(ExtensionWebRequestHelpersTest, TestMergeOnAuthRequiredResponses) { | 2405 TEST(ExtensionWebRequestHelpersTest, TestMergeOnAuthRequiredResponses) { |
| 2373 net::BoundTestNetLog capturing_net_log; | 2406 net::BoundTestNetLog capturing_net_log; |
| 2374 net::NetLogWithSource net_log = capturing_net_log.bound(); | 2407 net::NetLogWithSource net_log = capturing_net_log.bound(); |
| 2375 WarningSet warning_set; | 2408 WarningSet warning_set; |
| 2376 EventResponseDeltas deltas; | 2409 EventResponseDeltas deltas; |
| 2377 base::string16 username = base::ASCIIToUTF16("foo"); | 2410 base::string16 username = base::ASCIIToUTF16("foo"); |
| 2378 base::string16 password = base::ASCIIToUTF16("bar"); | 2411 base::string16 password = base::ASCIIToUTF16("bar"); |
| 2379 base::string16 password2 = base::ASCIIToUTF16("baz"); | 2412 base::string16 password2 = base::ASCIIToUTF16("baz"); |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2442 EXPECT_TRUE(credentials_set); | 2475 EXPECT_TRUE(credentials_set); |
| 2443 EXPECT_FALSE(auth3.Empty()); | 2476 EXPECT_FALSE(auth3.Empty()); |
| 2444 EXPECT_EQ(username, auth1.username()); | 2477 EXPECT_EQ(username, auth1.username()); |
| 2445 EXPECT_EQ(password, auth1.password()); | 2478 EXPECT_EQ(password, auth1.password()); |
| 2446 EXPECT_EQ(1u, warning_set.size()); | 2479 EXPECT_EQ(1u, warning_set.size()); |
| 2447 EXPECT_TRUE(HasWarning(warning_set, "extid2")); | 2480 EXPECT_TRUE(HasWarning(warning_set, "extid2")); |
| 2448 EXPECT_EQ(3u, capturing_net_log.GetSize()); | 2481 EXPECT_EQ(3u, capturing_net_log.GetSize()); |
| 2449 } | 2482 } |
| 2450 | 2483 |
| 2451 } // namespace extensions | 2484 } // namespace extensions |
| OLD | NEW |