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 <map> | 5 #include <map> |
6 #include <queue> | 6 #include <queue> |
7 | 7 |
8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/callback.h" | 10 #include "base/callback.h" |
(...skipping 1257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1268 scoped_refptr<net::HttpResponseHeaders> base_headers( | 1268 scoped_refptr<net::HttpResponseHeaders> base_headers( |
1269 new net::HttpResponseHeaders( | 1269 new net::HttpResponseHeaders( |
1270 net::HttpUtil::AssembleRawHeaders( | 1270 net::HttpUtil::AssembleRawHeaders( |
1271 base_headers_string, sizeof(base_headers_string)))); | 1271 base_headers_string, sizeof(base_headers_string)))); |
1272 | 1272 |
1273 ResponseHeaders new_headers; | 1273 ResponseHeaders new_headers; |
1274 new_headers.push_back(ResponseHeader("kEy1", "Value1")); // Unchanged | 1274 new_headers.push_back(ResponseHeader("kEy1", "Value1")); // Unchanged |
1275 new_headers.push_back(ResponseHeader("Key2", "Value1")); // Modified | 1275 new_headers.push_back(ResponseHeader("Key2", "Value1")); // Modified |
1276 // Key3 is deleted | 1276 // Key3 is deleted |
1277 new_headers.push_back(ResponseHeader("Key4", "Value4")); // Added | 1277 new_headers.push_back(ResponseHeader("Key4", "Value4")); // Added |
| 1278 GURL effective_new_url; |
1278 | 1279 |
1279 scoped_ptr<EventResponseDelta> delta(CalculateOnHeadersReceivedDelta( | 1280 scoped_ptr<EventResponseDelta> delta(CalculateOnHeadersReceivedDelta( |
1280 "extid", base::Time::Now(), cancel, base_headers.get(), &new_headers)); | 1281 "extid", base::Time::Now(), cancel, effective_new_url, |
| 1282 base_headers.get(), &new_headers)); |
1281 ASSERT_TRUE(delta.get()); | 1283 ASSERT_TRUE(delta.get()); |
1282 EXPECT_TRUE(delta->cancel); | 1284 EXPECT_TRUE(delta->cancel); |
1283 EXPECT_EQ(2u, delta->added_response_headers.size()); | 1285 EXPECT_EQ(2u, delta->added_response_headers.size()); |
1284 EXPECT_TRUE(Contains(delta->added_response_headers, | 1286 EXPECT_TRUE(Contains(delta->added_response_headers, |
1285 ResponseHeader("Key2", "Value1"))); | 1287 ResponseHeader("Key2", "Value1"))); |
1286 EXPECT_TRUE(Contains(delta->added_response_headers, | 1288 EXPECT_TRUE(Contains(delta->added_response_headers, |
1287 ResponseHeader("Key4", "Value4"))); | 1289 ResponseHeader("Key4", "Value4"))); |
1288 EXPECT_EQ(2u, delta->deleted_response_headers.size()); | 1290 EXPECT_EQ(2u, delta->deleted_response_headers.size()); |
1289 EXPECT_TRUE(Contains(delta->deleted_response_headers, | 1291 EXPECT_TRUE(Contains(delta->deleted_response_headers, |
1290 ResponseHeader("Key2", "Value2, Bar"))); | 1292 ResponseHeader("Key2", "Value2, Bar"))); |
(...skipping 662 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1953 scoped_refptr<net::HttpResponseHeaders> base_headers( | 1955 scoped_refptr<net::HttpResponseHeaders> base_headers( |
1954 new net::HttpResponseHeaders( | 1956 new net::HttpResponseHeaders( |
1955 net::HttpUtil::AssembleRawHeaders( | 1957 net::HttpUtil::AssembleRawHeaders( |
1956 base_headers_string, sizeof(base_headers_string)))); | 1958 base_headers_string, sizeof(base_headers_string)))); |
1957 | 1959 |
1958 // Check that we can handle if not touching the response headers. | 1960 // Check that we can handle if not touching the response headers. |
1959 linked_ptr<EventResponseDelta> d0( | 1961 linked_ptr<EventResponseDelta> d0( |
1960 new EventResponseDelta("extid0", base::Time::FromInternalValue(3000))); | 1962 new EventResponseDelta("extid0", base::Time::FromInternalValue(3000))); |
1961 deltas.push_back(d0); | 1963 deltas.push_back(d0); |
1962 scoped_refptr<net::HttpResponseHeaders> new_headers0; | 1964 scoped_refptr<net::HttpResponseHeaders> new_headers0; |
1963 MergeOnHeadersReceivedResponses(deltas, base_headers.get(), &new_headers0, | 1965 GURL allowed_unsafe_redirect_url0; |
1964 &warning_set, &net_log); | 1966 MergeOnHeadersReceivedResponses( |
| 1967 deltas, base_headers.get(), &new_headers0, &allowed_unsafe_redirect_url0, |
| 1968 &warning_set, &net_log); |
1965 EXPECT_FALSE(new_headers0.get()); | 1969 EXPECT_FALSE(new_headers0.get()); |
| 1970 EXPECT_TRUE(allowed_unsafe_redirect_url0.is_empty()); |
1966 EXPECT_EQ(0u, warning_set.size()); | 1971 EXPECT_EQ(0u, warning_set.size()); |
1967 EXPECT_EQ(0u, capturing_net_log.GetSize()); | 1972 EXPECT_EQ(0u, capturing_net_log.GetSize()); |
1968 | 1973 |
1969 linked_ptr<EventResponseDelta> d1( | 1974 linked_ptr<EventResponseDelta> d1( |
1970 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); | 1975 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); |
1971 d1->deleted_response_headers.push_back(ResponseHeader("KEY1", "Value1")); | 1976 d1->deleted_response_headers.push_back(ResponseHeader("KEY1", "Value1")); |
1972 d1->deleted_response_headers.push_back(ResponseHeader("KEY2", "Value2, Foo")); | 1977 d1->deleted_response_headers.push_back(ResponseHeader("KEY2", "Value2, Foo")); |
1973 d1->added_response_headers.push_back(ResponseHeader("Key2", "Value3")); | 1978 d1->added_response_headers.push_back(ResponseHeader("Key2", "Value3")); |
1974 deltas.push_back(d1); | 1979 deltas.push_back(d1); |
1975 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1980 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
1976 warning_set.clear(); | 1981 warning_set.clear(); |
1977 capturing_net_log.Clear(); | 1982 capturing_net_log.Clear(); |
1978 scoped_refptr<net::HttpResponseHeaders> new_headers1; | 1983 scoped_refptr<net::HttpResponseHeaders> new_headers1; |
| 1984 GURL allowed_unsafe_redirect_url1; |
1979 MergeOnHeadersReceivedResponses( | 1985 MergeOnHeadersReceivedResponses( |
1980 deltas, base_headers.get(), &new_headers1, &warning_set, &net_log); | 1986 deltas, base_headers.get(), &new_headers1, &allowed_unsafe_redirect_url1, |
| 1987 &warning_set, &net_log); |
1981 ASSERT_TRUE(new_headers1.get()); | 1988 ASSERT_TRUE(new_headers1.get()); |
| 1989 EXPECT_TRUE(allowed_unsafe_redirect_url1.is_empty()); |
1982 std::multimap<std::string, std::string> expected1; | 1990 std::multimap<std::string, std::string> expected1; |
1983 expected1.insert(std::pair<std::string, std::string>("Key2", "Value3")); | 1991 expected1.insert(std::pair<std::string, std::string>("Key2", "Value3")); |
1984 void* iter = NULL; | 1992 void* iter = NULL; |
1985 std::string name; | 1993 std::string name; |
1986 std::string value; | 1994 std::string value; |
1987 std::multimap<std::string, std::string> actual1; | 1995 std::multimap<std::string, std::string> actual1; |
1988 while (new_headers1->EnumerateHeaderLines(&iter, &name, &value)) { | 1996 while (new_headers1->EnumerateHeaderLines(&iter, &name, &value)) { |
1989 actual1.insert(std::pair<std::string, std::string>(name, value)); | 1997 actual1.insert(std::pair<std::string, std::string>(name, value)); |
1990 } | 1998 } |
1991 EXPECT_EQ(expected1, actual1); | 1999 EXPECT_EQ(expected1, actual1); |
1992 EXPECT_EQ(0u, warning_set.size()); | 2000 EXPECT_EQ(0u, warning_set.size()); |
1993 EXPECT_EQ(1u, capturing_net_log.GetSize()); | 2001 EXPECT_EQ(1u, capturing_net_log.GetSize()); |
1994 | 2002 |
1995 // Check that we replace response headers only once. | 2003 // Check that we replace response headers only once. |
1996 linked_ptr<EventResponseDelta> d2( | 2004 linked_ptr<EventResponseDelta> d2( |
1997 new EventResponseDelta("extid2", base::Time::FromInternalValue(1500))); | 2005 new EventResponseDelta("extid2", base::Time::FromInternalValue(1500))); |
1998 // Note that we use a different capitalization of KeY2. This should not | 2006 // Note that we use a different capitalization of KeY2. This should not |
1999 // matter. | 2007 // matter. |
2000 d2->deleted_response_headers.push_back(ResponseHeader("KeY2", "Value2, Foo")); | 2008 d2->deleted_response_headers.push_back(ResponseHeader("KeY2", "Value2, Foo")); |
2001 d2->added_response_headers.push_back(ResponseHeader("Key2", "Value4")); | 2009 d2->added_response_headers.push_back(ResponseHeader("Key2", "Value4")); |
2002 deltas.push_back(d2); | 2010 deltas.push_back(d2); |
2003 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 2011 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
2004 warning_set.clear(); | 2012 warning_set.clear(); |
2005 capturing_net_log.Clear(); | 2013 capturing_net_log.Clear(); |
2006 scoped_refptr<net::HttpResponseHeaders> new_headers2; | 2014 scoped_refptr<net::HttpResponseHeaders> new_headers2; |
| 2015 GURL allowed_unsafe_redirect_url2; |
2007 MergeOnHeadersReceivedResponses( | 2016 MergeOnHeadersReceivedResponses( |
2008 deltas, base_headers.get(), &new_headers2, &warning_set, &net_log); | 2017 deltas, base_headers.get(), &new_headers2, &allowed_unsafe_redirect_url2, |
| 2018 &warning_set, &net_log); |
2009 ASSERT_TRUE(new_headers2.get()); | 2019 ASSERT_TRUE(new_headers2.get()); |
| 2020 EXPECT_TRUE(allowed_unsafe_redirect_url2.is_empty()); |
2010 iter = NULL; | 2021 iter = NULL; |
2011 std::multimap<std::string, std::string> actual2; | 2022 std::multimap<std::string, std::string> actual2; |
2012 while (new_headers2->EnumerateHeaderLines(&iter, &name, &value)) { | 2023 while (new_headers2->EnumerateHeaderLines(&iter, &name, &value)) { |
2013 actual2.insert(std::pair<std::string, std::string>(name, value)); | 2024 actual2.insert(std::pair<std::string, std::string>(name, value)); |
2014 } | 2025 } |
2015 EXPECT_EQ(expected1, actual2); | 2026 EXPECT_EQ(expected1, actual2); |
2016 EXPECT_EQ(1u, warning_set.size()); | 2027 EXPECT_EQ(1u, warning_set.size()); |
2017 EXPECT_TRUE(HasWarning(warning_set, "extid2")); | 2028 EXPECT_TRUE(HasWarning(warning_set, "extid2")); |
2018 EXPECT_EQ(2u, capturing_net_log.GetSize()); | 2029 EXPECT_EQ(2u, capturing_net_log.GetSize()); |
2019 } | 2030 } |
(...skipping 17 matching lines...) Expand all Loading... |
2037 scoped_refptr<net::HttpResponseHeaders> base_headers( | 2048 scoped_refptr<net::HttpResponseHeaders> base_headers( |
2038 new net::HttpResponseHeaders( | 2049 new net::HttpResponseHeaders( |
2039 net::HttpUtil::AssembleRawHeaders( | 2050 net::HttpUtil::AssembleRawHeaders( |
2040 base_headers_string, sizeof(base_headers_string)))); | 2051 base_headers_string, sizeof(base_headers_string)))); |
2041 | 2052 |
2042 linked_ptr<EventResponseDelta> d1( | 2053 linked_ptr<EventResponseDelta> d1( |
2043 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); | 2054 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); |
2044 d1->deleted_response_headers.push_back(ResponseHeader("KEY1", "Value2")); | 2055 d1->deleted_response_headers.push_back(ResponseHeader("KEY1", "Value2")); |
2045 deltas.push_back(d1); | 2056 deltas.push_back(d1); |
2046 scoped_refptr<net::HttpResponseHeaders> new_headers1; | 2057 scoped_refptr<net::HttpResponseHeaders> new_headers1; |
| 2058 GURL allowed_unsafe_redirect_url1; |
2047 MergeOnHeadersReceivedResponses( | 2059 MergeOnHeadersReceivedResponses( |
2048 deltas, base_headers.get(), &new_headers1, &warning_set, &net_log); | 2060 deltas, base_headers.get(), &new_headers1, &allowed_unsafe_redirect_url1, |
| 2061 &warning_set, &net_log); |
2049 ASSERT_TRUE(new_headers1.get()); | 2062 ASSERT_TRUE(new_headers1.get()); |
| 2063 EXPECT_TRUE(allowed_unsafe_redirect_url1.is_empty()); |
2050 std::multimap<std::string, std::string> expected1; | 2064 std::multimap<std::string, std::string> expected1; |
2051 expected1.insert(std::pair<std::string, std::string>("Key1", "Value1")); | 2065 expected1.insert(std::pair<std::string, std::string>("Key1", "Value1")); |
2052 expected1.insert(std::pair<std::string, std::string>("Key1", "Value3")); | 2066 expected1.insert(std::pair<std::string, std::string>("Key1", "Value3")); |
2053 expected1.insert(std::pair<std::string, std::string>("Key2", "Value4")); | 2067 expected1.insert(std::pair<std::string, std::string>("Key2", "Value4")); |
2054 void* iter = NULL; | 2068 void* iter = NULL; |
2055 std::string name; | 2069 std::string name; |
2056 std::string value; | 2070 std::string value; |
2057 std::multimap<std::string, std::string> actual1; | 2071 std::multimap<std::string, std::string> actual1; |
2058 while (new_headers1->EnumerateHeaderLines(&iter, &name, &value)) { | 2072 while (new_headers1->EnumerateHeaderLines(&iter, &name, &value)) { |
2059 actual1.insert(std::pair<std::string, std::string>(name, value)); | 2073 actual1.insert(std::pair<std::string, std::string>(name, value)); |
2060 } | 2074 } |
2061 EXPECT_EQ(expected1, actual1); | 2075 EXPECT_EQ(expected1, actual1); |
2062 EXPECT_EQ(0u, warning_set.size()); | 2076 EXPECT_EQ(0u, warning_set.size()); |
2063 EXPECT_EQ(1u, capturing_net_log.GetSize()); | 2077 EXPECT_EQ(1u, capturing_net_log.GetSize()); |
2064 } | 2078 } |
2065 | 2079 |
| 2080 // Tests whether onHeadersReceived can initiate a redirect. |
| 2081 // The URL merge logic is shared with onBeforeRequest, so we only need to test |
| 2082 // whether the URLs are merged at all. |
| 2083 TEST(ExtensionWebRequestHelpersTest, |
| 2084 TestMergeOnHeadersReceivedResponsesRedirect) { |
| 2085 EventResponseDeltas deltas; |
| 2086 net::CapturingBoundNetLog capturing_net_log; |
| 2087 net::BoundNetLog net_log = capturing_net_log.bound(); |
| 2088 ExtensionWarningSet warning_set; |
| 2089 |
| 2090 char base_headers_string[] = |
| 2091 "HTTP/1.0 200 OK\r\n" |
| 2092 "\r\n"; |
| 2093 scoped_refptr<net::HttpResponseHeaders> base_headers( |
| 2094 new net::HttpResponseHeaders( |
| 2095 net::HttpUtil::AssembleRawHeaders( |
| 2096 base_headers_string, sizeof(base_headers_string)))); |
| 2097 |
| 2098 // No redirect |
| 2099 linked_ptr<EventResponseDelta> d0( |
| 2100 new EventResponseDelta("extid0", base::Time::FromInternalValue(0))); |
| 2101 deltas.push_back(d0); |
| 2102 scoped_refptr<net::HttpResponseHeaders> new_headers0; |
| 2103 GURL allowed_unsafe_redirect_url0; |
| 2104 MergeOnHeadersReceivedResponses( |
| 2105 deltas, base_headers.get(), &new_headers0, &allowed_unsafe_redirect_url0, |
| 2106 &warning_set, &net_log); |
| 2107 EXPECT_FALSE(new_headers0.get()); |
| 2108 EXPECT_TRUE(allowed_unsafe_redirect_url0.is_empty()); |
| 2109 EXPECT_EQ(0u, warning_set.size()); |
| 2110 EXPECT_EQ(0u, capturing_net_log.GetSize()); |
| 2111 |
| 2112 // Single redirect. |
| 2113 GURL new_url_1("http://foo.com"); |
| 2114 linked_ptr<EventResponseDelta> d1( |
| 2115 new EventResponseDelta("extid1", base::Time::FromInternalValue(1000))); |
| 2116 d1->new_url = GURL(new_url_1); |
| 2117 deltas.push_back(d1); |
| 2118 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 2119 capturing_net_log.Clear(); |
| 2120 scoped_refptr<net::HttpResponseHeaders> new_headers1; |
| 2121 GURL allowed_unsafe_redirect_url1; |
| 2122 MergeOnHeadersReceivedResponses( |
| 2123 deltas, base_headers.get(), &new_headers1, &allowed_unsafe_redirect_url1, |
| 2124 &warning_set, &net_log); |
| 2125 |
| 2126 EXPECT_TRUE(new_headers1.get()); |
| 2127 EXPECT_TRUE(new_headers1->HasHeaderValue("Location", new_url_1.spec())); |
| 2128 EXPECT_EQ(new_url_1, allowed_unsafe_redirect_url1); |
| 2129 EXPECT_TRUE(warning_set.empty()); |
| 2130 EXPECT_EQ(1u, capturing_net_log.GetSize()); |
| 2131 } |
| 2132 |
2066 TEST(ExtensionWebRequestHelpersTest, TestMergeOnAuthRequiredResponses) { | 2133 TEST(ExtensionWebRequestHelpersTest, TestMergeOnAuthRequiredResponses) { |
2067 net::CapturingBoundNetLog capturing_net_log; | 2134 net::CapturingBoundNetLog capturing_net_log; |
2068 net::BoundNetLog net_log = capturing_net_log.bound(); | 2135 net::BoundNetLog net_log = capturing_net_log.bound(); |
2069 ExtensionWarningSet warning_set; | 2136 ExtensionWarningSet warning_set; |
2070 EventResponseDeltas deltas; | 2137 EventResponseDeltas deltas; |
2071 base::string16 username = base::ASCIIToUTF16("foo"); | 2138 base::string16 username = base::ASCIIToUTF16("foo"); |
2072 base::string16 password = base::ASCIIToUTF16("bar"); | 2139 base::string16 password = base::ASCIIToUTF16("bar"); |
2073 base::string16 password2 = base::ASCIIToUTF16("baz"); | 2140 base::string16 password2 = base::ASCIIToUTF16("baz"); |
2074 | 2141 |
2075 // Check that we can handle if not returning credentials. | 2142 // Check that we can handle if not returning credentials. |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2136 EXPECT_TRUE(credentials_set); | 2203 EXPECT_TRUE(credentials_set); |
2137 EXPECT_FALSE(auth3.Empty()); | 2204 EXPECT_FALSE(auth3.Empty()); |
2138 EXPECT_EQ(username, auth1.username()); | 2205 EXPECT_EQ(username, auth1.username()); |
2139 EXPECT_EQ(password, auth1.password()); | 2206 EXPECT_EQ(password, auth1.password()); |
2140 EXPECT_EQ(1u, warning_set.size()); | 2207 EXPECT_EQ(1u, warning_set.size()); |
2141 EXPECT_TRUE(HasWarning(warning_set, "extid2")); | 2208 EXPECT_TRUE(HasWarning(warning_set, "extid2")); |
2142 EXPECT_EQ(3u, capturing_net_log.GetSize()); | 2209 EXPECT_EQ(3u, capturing_net_log.GetSize()); |
2143 } | 2210 } |
2144 | 2211 |
2145 } // namespace extensions | 2212 } // namespace extensions |
OLD | NEW |