OLD | NEW |
1 // Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2009 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_cache.h" | 5 #include "net/http/http_cache.h" |
6 | 6 |
7 #include "base/hash_tables.h" | 7 #include "base/hash_tables.h" |
8 #include "base/message_loop.h" | 8 #include "base/message_loop.h" |
9 #include "base/scoped_vector.h" | 9 #include "base/scoped_vector.h" |
10 #include "base/string_util.h" | 10 #include "base/string_util.h" |
(...skipping 560 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
571 std::string* response_data); | 571 std::string* response_data); |
572 | 572 |
573 private: | 573 private: |
574 static bool not_modified_; | 574 static bool not_modified_; |
575 static bool modified_; | 575 static bool modified_; |
576 DISALLOW_COPY_AND_ASSIGN(RangeTransactionServer); | 576 DISALLOW_COPY_AND_ASSIGN(RangeTransactionServer); |
577 }; | 577 }; |
578 bool RangeTransactionServer::not_modified_ = false; | 578 bool RangeTransactionServer::not_modified_ = false; |
579 bool RangeTransactionServer::modified_ = false; | 579 bool RangeTransactionServer::modified_ = false; |
580 | 580 |
| 581 // A dummy extra header that must be preserved on a given request. |
| 582 // TODO(rvargas): Add tests using this without byte ranges. |
| 583 #define EXTRA_HEADER "Extra: header\r\n" |
| 584 |
581 // Static. | 585 // Static. |
582 void RangeTransactionServer::RangeHandler(const net::HttpRequestInfo* request, | 586 void RangeTransactionServer::RangeHandler(const net::HttpRequestInfo* request, |
583 std::string* response_status, | 587 std::string* response_status, |
584 std::string* response_headers, | 588 std::string* response_headers, |
585 std::string* response_data) { | 589 std::string* response_data) { |
586 if (request->extra_headers.empty()) { | 590 if (request->extra_headers.empty()) { |
587 response_status->assign("HTTP/1.1 416 Requested Range Not Satisfiable"); | 591 response_status->assign("HTTP/1.1 416 Requested Range Not Satisfiable"); |
588 return; | 592 return; |
589 } | 593 } |
590 | 594 |
| 595 // We want to make sure we don't delete extra headers. |
| 596 if (request->extra_headers.find(EXTRA_HEADER) == std::string::npos) { |
| 597 response_status->assign("HTTP/1.1 403 Forbidden"); |
| 598 return; |
| 599 } |
| 600 |
591 if (not_modified_) { | 601 if (not_modified_) { |
592 response_status->assign("HTTP/1.1 304 Not Modified"); | 602 response_status->assign("HTTP/1.1 304 Not Modified"); |
593 return; | 603 return; |
594 } | 604 } |
595 | 605 |
596 std::vector<net::HttpByteRange> ranges; | 606 std::vector<net::HttpByteRange> ranges; |
597 if (!net::HttpUtil::ParseRanges(request->extra_headers, &ranges) || | 607 if (!net::HttpUtil::ParseRanges(request->extra_headers, &ranges) || |
598 ranges.size() != 1) | 608 ranges.size() != 1) |
599 return; | 609 return; |
600 // We can handle this range request. | 610 // We can handle this range request. |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
633 } else { | 643 } else { |
634 response_status->assign("HTTP/1.1 304 Not Modified"); | 644 response_status->assign("HTTP/1.1 304 Not Modified"); |
635 response_data->clear(); | 645 response_data->clear(); |
636 } | 646 } |
637 } | 647 } |
638 | 648 |
639 const MockTransaction kRangeGET_TransactionOK = { | 649 const MockTransaction kRangeGET_TransactionOK = { |
640 "http://www.google.com/range", | 650 "http://www.google.com/range", |
641 "GET", | 651 "GET", |
642 base::Time(), | 652 base::Time(), |
643 "Range: bytes = 40-49\r\n", | 653 "Range: bytes = 40-49\r\n" |
| 654 EXTRA_HEADER, |
644 net::LOAD_NORMAL, | 655 net::LOAD_NORMAL, |
645 "HTTP/1.1 206 Partial Content", | 656 "HTTP/1.1 206 Partial Content", |
646 "Last-Modified: Sat, 18 Apr 2009 01:10:43 GMT\n" | 657 "Last-Modified: Sat, 18 Apr 2009 01:10:43 GMT\n" |
647 "ETag: \"foo\"\n" | 658 "ETag: \"foo\"\n" |
648 "Accept-Ranges: bytes\n" | 659 "Accept-Ranges: bytes\n" |
649 "Content-Length: 10\n", | 660 "Content-Length: 10\n", |
650 base::Time(), | 661 base::Time(), |
651 "rg: 40-49 ", | 662 "rg: 40-49 ", |
652 TEST_MODE_NORMAL, | 663 TEST_MODE_NORMAL, |
653 &RangeTransactionServer::RangeHandler, | 664 &RangeTransactionServer::RangeHandler, |
(...skipping 1355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2009 } | 2020 } |
2010 | 2021 |
2011 // Test that we skip the cache for range requests that include a validation | 2022 // Test that we skip the cache for range requests that include a validation |
2012 // header. | 2023 // header. |
2013 TEST(HttpCache, RangeGET_SkipsCache2) { | 2024 TEST(HttpCache, RangeGET_SkipsCache2) { |
2014 MockHttpCache cache; | 2025 MockHttpCache cache; |
2015 cache.http_cache()->set_enable_range_support(true); | 2026 cache.http_cache()->set_enable_range_support(true); |
2016 | 2027 |
2017 MockTransaction transaction(kRangeGET_Transaction); | 2028 MockTransaction transaction(kRangeGET_Transaction); |
2018 transaction.request_headers = "If-None-Match: foo\n" | 2029 transaction.request_headers = "If-None-Match: foo\n" |
| 2030 EXTRA_HEADER |
2019 "Range: bytes = 40-49\n"; | 2031 "Range: bytes = 40-49\n"; |
2020 RunTransactionTest(cache.http_cache(), transaction); | 2032 RunTransactionTest(cache.http_cache(), transaction); |
2021 | 2033 |
2022 EXPECT_EQ(1, cache.network_layer()->transaction_count()); | 2034 EXPECT_EQ(1, cache.network_layer()->transaction_count()); |
2023 EXPECT_EQ(0, cache.disk_cache()->open_count()); | 2035 EXPECT_EQ(0, cache.disk_cache()->open_count()); |
2024 EXPECT_EQ(0, cache.disk_cache()->create_count()); | 2036 EXPECT_EQ(0, cache.disk_cache()->create_count()); |
2025 | 2037 |
2026 transaction.request_headers = | 2038 transaction.request_headers = |
2027 "If-Modified-Since: Wed, 28 Nov 2007 00:45:20 GMT\n" | 2039 "If-Modified-Since: Wed, 28 Nov 2007 00:45:20 GMT\n" |
| 2040 EXTRA_HEADER |
2028 "Range: bytes = 40-49\n"; | 2041 "Range: bytes = 40-49\n"; |
2029 RunTransactionTest(cache.http_cache(), transaction); | 2042 RunTransactionTest(cache.http_cache(), transaction); |
2030 | 2043 |
2031 EXPECT_EQ(2, cache.network_layer()->transaction_count()); | 2044 EXPECT_EQ(2, cache.network_layer()->transaction_count()); |
2032 EXPECT_EQ(0, cache.disk_cache()->open_count()); | 2045 EXPECT_EQ(0, cache.disk_cache()->open_count()); |
2033 EXPECT_EQ(0, cache.disk_cache()->create_count()); | 2046 EXPECT_EQ(0, cache.disk_cache()->create_count()); |
2034 | 2047 |
2035 transaction.request_headers = "If-Range: bla\n" | 2048 transaction.request_headers = "If-Range: bla\n" |
| 2049 EXTRA_HEADER |
2036 "Range: bytes = 40-49\n"; | 2050 "Range: bytes = 40-49\n"; |
2037 RunTransactionTest(cache.http_cache(), transaction); | 2051 RunTransactionTest(cache.http_cache(), transaction); |
2038 | 2052 |
2039 EXPECT_EQ(3, cache.network_layer()->transaction_count()); | 2053 EXPECT_EQ(3, cache.network_layer()->transaction_count()); |
2040 EXPECT_EQ(0, cache.disk_cache()->open_count()); | 2054 EXPECT_EQ(0, cache.disk_cache()->open_count()); |
2041 EXPECT_EQ(0, cache.disk_cache()->create_count()); | 2055 EXPECT_EQ(0, cache.disk_cache()->create_count()); |
2042 } | 2056 } |
2043 | 2057 |
2044 // Tests that receiving 206 for a regular request is handled correctly. | 2058 // Tests that receiving 206 for a regular request is handled correctly. |
2045 TEST(HttpCache, GET_Crazy206) { | 2059 TEST(HttpCache, GET_Crazy206) { |
2046 MockHttpCache cache; | 2060 MockHttpCache cache; |
2047 cache.http_cache()->set_enable_range_support(true); | 2061 cache.http_cache()->set_enable_range_support(true); |
2048 | 2062 |
2049 // Write to the cache. | 2063 // Write to the cache. |
2050 MockTransaction transaction(kRangeGET_TransactionOK); | 2064 MockTransaction transaction(kRangeGET_TransactionOK); |
2051 AddMockTransaction(&transaction); | 2065 AddMockTransaction(&transaction); |
2052 transaction.request_headers = ""; | 2066 transaction.request_headers = EXTRA_HEADER; |
2053 transaction.handler = NULL; | 2067 transaction.handler = NULL; |
2054 RunTransactionTest(cache.http_cache(), transaction); | 2068 RunTransactionTest(cache.http_cache(), transaction); |
2055 | 2069 |
2056 EXPECT_EQ(1, cache.network_layer()->transaction_count()); | 2070 EXPECT_EQ(1, cache.network_layer()->transaction_count()); |
2057 EXPECT_EQ(0, cache.disk_cache()->open_count()); | 2071 EXPECT_EQ(0, cache.disk_cache()->open_count()); |
2058 EXPECT_EQ(1, cache.disk_cache()->create_count()); | 2072 EXPECT_EQ(1, cache.disk_cache()->create_count()); |
2059 | 2073 |
2060 // This should read again from the net. | 2074 // This should read again from the net. |
2061 RunTransactionTest(cache.http_cache(), transaction); | 2075 RunTransactionTest(cache.http_cache(), transaction); |
2062 | 2076 |
(...skipping 27 matching lines...) Expand all Loading... |
2090 EXPECT_TRUE(Verify206Response(headers, 40, 49)); | 2104 EXPECT_TRUE(Verify206Response(headers, 40, 49)); |
2091 EXPECT_EQ(2, cache.network_layer()->transaction_count()); | 2105 EXPECT_EQ(2, cache.network_layer()->transaction_count()); |
2092 EXPECT_EQ(1, cache.disk_cache()->open_count()); | 2106 EXPECT_EQ(1, cache.disk_cache()->open_count()); |
2093 EXPECT_EQ(1, cache.disk_cache()->create_count()); | 2107 EXPECT_EQ(1, cache.disk_cache()->create_count()); |
2094 | 2108 |
2095 // Make sure we are done with the previous transaction. | 2109 // Make sure we are done with the previous transaction. |
2096 MessageLoop::current()->RunAllPending(); | 2110 MessageLoop::current()->RunAllPending(); |
2097 | 2111 |
2098 // Write to the cache (30-39). | 2112 // Write to the cache (30-39). |
2099 MockTransaction transaction(kRangeGET_TransactionOK); | 2113 MockTransaction transaction(kRangeGET_TransactionOK); |
2100 transaction.request_headers = "Range: bytes = 30-39\r\n"; | 2114 transaction.request_headers = "Range: bytes = 30-39\r\n" EXTRA_HEADER; |
2101 transaction.data = "rg: 30-39 "; | 2115 transaction.data = "rg: 30-39 "; |
2102 RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers); | 2116 RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers); |
2103 | 2117 |
2104 EXPECT_TRUE(Verify206Response(headers, 30, 39)); | 2118 EXPECT_TRUE(Verify206Response(headers, 30, 39)); |
2105 EXPECT_EQ(3, cache.network_layer()->transaction_count()); | 2119 EXPECT_EQ(3, cache.network_layer()->transaction_count()); |
2106 EXPECT_EQ(2, cache.disk_cache()->open_count()); | 2120 EXPECT_EQ(2, cache.disk_cache()->open_count()); |
2107 EXPECT_EQ(1, cache.disk_cache()->create_count()); | 2121 EXPECT_EQ(1, cache.disk_cache()->create_count()); |
2108 | 2122 |
2109 // Make sure we are done with the previous transaction. | 2123 // Make sure we are done with the previous transaction. |
2110 MessageLoop::current()->RunAllPending(); | 2124 MessageLoop::current()->RunAllPending(); |
2111 | 2125 |
2112 // Write and read from the cache (20-59). | 2126 // Write and read from the cache (20-59). |
2113 transaction.request_headers = "Range: bytes = 20-59\r\n"; | 2127 transaction.request_headers = "Range: bytes = 20-59\r\n" EXTRA_HEADER; |
2114 transaction.data = "rg: 20-29 rg: 30-39 rg: 40-49 rg: 50-59 "; | 2128 transaction.data = "rg: 20-29 rg: 30-39 rg: 40-49 rg: 50-59 "; |
2115 RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers); | 2129 RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers); |
2116 | 2130 |
2117 EXPECT_TRUE(Verify206Response(headers, 20, 59)); | 2131 EXPECT_TRUE(Verify206Response(headers, 20, 59)); |
2118 EXPECT_EQ(5, cache.network_layer()->transaction_count()); | 2132 EXPECT_EQ(5, cache.network_layer()->transaction_count()); |
2119 EXPECT_EQ(3, cache.disk_cache()->open_count()); | 2133 EXPECT_EQ(3, cache.disk_cache()->open_count()); |
2120 EXPECT_EQ(1, cache.disk_cache()->create_count()); | 2134 EXPECT_EQ(1, cache.disk_cache()->create_count()); |
2121 | 2135 |
2122 RemoveMockTransaction(&kRangeGET_TransactionOK); | 2136 RemoveMockTransaction(&kRangeGET_TransactionOK); |
2123 } | 2137 } |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2191 // Tests that we can cache range requests when the start or end is unknown. | 2205 // Tests that we can cache range requests when the start or end is unknown. |
2192 // We start with one suffix request, followed by a request from a given point. | 2206 // We start with one suffix request, followed by a request from a given point. |
2193 TEST(HttpCache, UnknownRangeGET_1) { | 2207 TEST(HttpCache, UnknownRangeGET_1) { |
2194 MockHttpCache cache; | 2208 MockHttpCache cache; |
2195 cache.http_cache()->set_enable_range_support(true); | 2209 cache.http_cache()->set_enable_range_support(true); |
2196 AddMockTransaction(&kRangeGET_TransactionOK); | 2210 AddMockTransaction(&kRangeGET_TransactionOK); |
2197 std::string headers; | 2211 std::string headers; |
2198 | 2212 |
2199 // Write to the cache (70-79). | 2213 // Write to the cache (70-79). |
2200 MockTransaction transaction(kRangeGET_TransactionOK); | 2214 MockTransaction transaction(kRangeGET_TransactionOK); |
2201 transaction.request_headers = "Range: bytes = -10\r\n"; | 2215 transaction.request_headers = "Range: bytes = -10\r\n" EXTRA_HEADER; |
2202 transaction.data = "rg: 70-79 "; | 2216 transaction.data = "rg: 70-79 "; |
2203 RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers); | 2217 RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers); |
2204 | 2218 |
2205 EXPECT_TRUE(Verify206Response(headers, 70, 79)); | 2219 EXPECT_TRUE(Verify206Response(headers, 70, 79)); |
2206 EXPECT_EQ(1, cache.network_layer()->transaction_count()); | 2220 EXPECT_EQ(1, cache.network_layer()->transaction_count()); |
2207 EXPECT_EQ(0, cache.disk_cache()->open_count()); | 2221 EXPECT_EQ(0, cache.disk_cache()->open_count()); |
2208 EXPECT_EQ(1, cache.disk_cache()->create_count()); | 2222 EXPECT_EQ(1, cache.disk_cache()->create_count()); |
2209 | 2223 |
2210 // Make sure we are done with the previous transaction. | 2224 // Make sure we are done with the previous transaction. |
2211 MessageLoop::current()->RunAllPending(); | 2225 MessageLoop::current()->RunAllPending(); |
2212 | 2226 |
2213 // Write and read from the cache (60-79). | 2227 // Write and read from the cache (60-79). |
2214 transaction.request_headers = "Range: bytes = 60-\r\n"; | 2228 transaction.request_headers = "Range: bytes = 60-\r\n" EXTRA_HEADER; |
2215 transaction.data = "rg: 60-69 rg: 70-79 "; | 2229 transaction.data = "rg: 60-69 rg: 70-79 "; |
2216 RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers); | 2230 RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers); |
2217 | 2231 |
2218 EXPECT_TRUE(Verify206Response(headers, 60, 79)); | 2232 EXPECT_TRUE(Verify206Response(headers, 60, 79)); |
2219 EXPECT_EQ(2, cache.network_layer()->transaction_count()); | 2233 EXPECT_EQ(2, cache.network_layer()->transaction_count()); |
2220 EXPECT_EQ(1, cache.disk_cache()->open_count()); | 2234 EXPECT_EQ(1, cache.disk_cache()->open_count()); |
2221 EXPECT_EQ(1, cache.disk_cache()->create_count()); | 2235 EXPECT_EQ(1, cache.disk_cache()->create_count()); |
2222 | 2236 |
2223 RemoveMockTransaction(&kRangeGET_TransactionOK); | 2237 RemoveMockTransaction(&kRangeGET_TransactionOK); |
2224 } | 2238 } |
2225 | 2239 |
2226 // Tests that we can cache range requests when the start or end is unknown. | 2240 // Tests that we can cache range requests when the start or end is unknown. |
2227 // We start with one request from a given point, followed by a suffix request. | 2241 // We start with one request from a given point, followed by a suffix request. |
2228 // We'll also verify that synchronous cache responses work as intended. | 2242 // We'll also verify that synchronous cache responses work as intended. |
2229 TEST(HttpCache, UnknownRangeGET_2) { | 2243 TEST(HttpCache, UnknownRangeGET_2) { |
2230 MockHttpCache cache; | 2244 MockHttpCache cache; |
2231 cache.http_cache()->set_enable_range_support(true); | 2245 cache.http_cache()->set_enable_range_support(true); |
2232 std::string headers; | 2246 std::string headers; |
2233 | 2247 |
2234 MockTransaction transaction(kRangeGET_TransactionOK); | 2248 MockTransaction transaction(kRangeGET_TransactionOK); |
2235 transaction.test_mode = TEST_MODE_SYNC_CACHE_START | | 2249 transaction.test_mode = TEST_MODE_SYNC_CACHE_START | |
2236 TEST_MODE_SYNC_CACHE_READ | | 2250 TEST_MODE_SYNC_CACHE_READ | |
2237 TEST_MODE_SYNC_CACHE_WRITE; | 2251 TEST_MODE_SYNC_CACHE_WRITE; |
2238 AddMockTransaction(&transaction); | 2252 AddMockTransaction(&transaction); |
2239 | 2253 |
2240 // Write to the cache (70-79). | 2254 // Write to the cache (70-79). |
2241 transaction.request_headers = "Range: bytes = 70-\r\n"; | 2255 transaction.request_headers = "Range: bytes = 70-\r\n" EXTRA_HEADER; |
2242 transaction.data = "rg: 70-79 "; | 2256 transaction.data = "rg: 70-79 "; |
2243 RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers); | 2257 RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers); |
2244 | 2258 |
2245 EXPECT_TRUE(Verify206Response(headers, 70, 79)); | 2259 EXPECT_TRUE(Verify206Response(headers, 70, 79)); |
2246 EXPECT_EQ(1, cache.network_layer()->transaction_count()); | 2260 EXPECT_EQ(1, cache.network_layer()->transaction_count()); |
2247 EXPECT_EQ(0, cache.disk_cache()->open_count()); | 2261 EXPECT_EQ(0, cache.disk_cache()->open_count()); |
2248 EXPECT_EQ(1, cache.disk_cache()->create_count()); | 2262 EXPECT_EQ(1, cache.disk_cache()->create_count()); |
2249 | 2263 |
2250 // Make sure we are done with the previous transaction. | 2264 // Make sure we are done with the previous transaction. |
2251 MessageLoop::current()->RunAllPending(); | 2265 MessageLoop::current()->RunAllPending(); |
2252 | 2266 |
2253 // Write and read from the cache (60-79). | 2267 // Write and read from the cache (60-79). |
2254 transaction.request_headers = "Range: bytes = -20\r\n"; | 2268 transaction.request_headers = "Range: bytes = -20\r\n" EXTRA_HEADER; |
2255 transaction.data = "rg: 60-69 rg: 70-79 "; | 2269 transaction.data = "rg: 60-69 rg: 70-79 "; |
2256 RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers); | 2270 RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers); |
2257 | 2271 |
2258 EXPECT_TRUE(Verify206Response(headers, 60, 79)); | 2272 EXPECT_TRUE(Verify206Response(headers, 60, 79)); |
2259 EXPECT_EQ(2, cache.network_layer()->transaction_count()); | 2273 EXPECT_EQ(2, cache.network_layer()->transaction_count()); |
2260 EXPECT_EQ(1, cache.disk_cache()->open_count()); | 2274 EXPECT_EQ(1, cache.disk_cache()->open_count()); |
2261 EXPECT_EQ(1, cache.disk_cache()->create_count()); | 2275 EXPECT_EQ(1, cache.disk_cache()->create_count()); |
2262 | 2276 |
2263 RemoveMockTransaction(&transaction); | 2277 RemoveMockTransaction(&transaction); |
2264 } | 2278 } |
2265 | 2279 |
2266 // Tests that receiving Not Modified when asking for an open range doesn't mess | 2280 // Tests that receiving Not Modified when asking for an open range doesn't mess |
2267 // up things. | 2281 // up things. |
2268 TEST(HttpCache, UnknownRangeGET_304) { | 2282 TEST(HttpCache, UnknownRangeGET_304) { |
2269 MockHttpCache cache; | 2283 MockHttpCache cache; |
2270 cache.http_cache()->set_enable_range_support(true); | 2284 cache.http_cache()->set_enable_range_support(true); |
2271 std::string headers; | 2285 std::string headers; |
2272 | 2286 |
2273 MockTransaction transaction(kRangeGET_TransactionOK); | 2287 MockTransaction transaction(kRangeGET_TransactionOK); |
2274 AddMockTransaction(&transaction); | 2288 AddMockTransaction(&transaction); |
2275 | 2289 |
2276 RangeTransactionServer handler; | 2290 RangeTransactionServer handler; |
2277 handler.set_not_modified(true); | 2291 handler.set_not_modified(true); |
2278 | 2292 |
2279 // Ask for the end of the file, without knowing the length. | 2293 // Ask for the end of the file, without knowing the length. |
2280 transaction.request_headers = "Range: bytes = 70-\r\n"; | 2294 transaction.request_headers = "Range: bytes = 70-\r\n" EXTRA_HEADER; |
2281 transaction.data = "rg: 70-79 "; | 2295 transaction.data = "rg: 70-79 "; |
2282 RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers); | 2296 RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers); |
2283 | 2297 |
2284 // We just bypass the cache. | 2298 // We just bypass the cache. |
2285 EXPECT_EQ(0U, headers.find("HTTP/1.1 304 Not Modified\n")); | 2299 EXPECT_EQ(0U, headers.find("HTTP/1.1 304 Not Modified\n")); |
2286 EXPECT_EQ(1, cache.network_layer()->transaction_count()); | 2300 EXPECT_EQ(1, cache.network_layer()->transaction_count()); |
2287 EXPECT_EQ(0, cache.disk_cache()->open_count()); | 2301 EXPECT_EQ(0, cache.disk_cache()->open_count()); |
2288 EXPECT_EQ(1, cache.disk_cache()->create_count()); | 2302 EXPECT_EQ(1, cache.disk_cache()->create_count()); |
2289 | 2303 |
2290 RunTransactionTest(cache.http_cache(), transaction); | 2304 RunTransactionTest(cache.http_cache(), transaction); |
(...skipping 13 matching lines...) Expand all Loading... |
2304 RunTransactionTestWithResponse(cache.http_cache(), kRangeGET_TransactionOK, | 2318 RunTransactionTestWithResponse(cache.http_cache(), kRangeGET_TransactionOK, |
2305 &headers); | 2319 &headers); |
2306 | 2320 |
2307 EXPECT_TRUE(Verify206Response(headers, 40, 49)); | 2321 EXPECT_TRUE(Verify206Response(headers, 40, 49)); |
2308 EXPECT_EQ(1, cache.network_layer()->transaction_count()); | 2322 EXPECT_EQ(1, cache.network_layer()->transaction_count()); |
2309 EXPECT_EQ(0, cache.disk_cache()->open_count()); | 2323 EXPECT_EQ(0, cache.disk_cache()->open_count()); |
2310 EXPECT_EQ(1, cache.disk_cache()->create_count()); | 2324 EXPECT_EQ(1, cache.disk_cache()->create_count()); |
2311 | 2325 |
2312 // Write and read from the cache (0-79), when not asked for a range. | 2326 // Write and read from the cache (0-79), when not asked for a range. |
2313 MockTransaction transaction(kRangeGET_TransactionOK); | 2327 MockTransaction transaction(kRangeGET_TransactionOK); |
2314 transaction.request_headers = ""; | 2328 transaction.request_headers = EXTRA_HEADER; |
2315 transaction.data = "rg: 00-09 rg: 10-19 rg: 20-29 rg: 30-39 rg: 40-49 " | 2329 transaction.data = "rg: 00-09 rg: 10-19 rg: 20-29 rg: 30-39 rg: 40-49 " |
2316 "rg: 50-59 rg: 60-69 rg: 70-79 "; | 2330 "rg: 50-59 rg: 60-69 rg: 70-79 "; |
2317 RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers); | 2331 RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers); |
2318 | 2332 |
2319 EXPECT_EQ(0U, headers.find("HTTP/1.1 200 OK\n")); | 2333 EXPECT_EQ(0U, headers.find("HTTP/1.1 200 OK\n")); |
2320 EXPECT_EQ(3, cache.network_layer()->transaction_count()); | 2334 EXPECT_EQ(3, cache.network_layer()->transaction_count()); |
2321 EXPECT_EQ(1, cache.disk_cache()->open_count()); | 2335 EXPECT_EQ(1, cache.disk_cache()->open_count()); |
2322 EXPECT_EQ(1, cache.disk_cache()->create_count()); | 2336 EXPECT_EQ(1, cache.disk_cache()->create_count()); |
2323 | 2337 |
2324 RemoveMockTransaction(&kRangeGET_TransactionOK); | 2338 RemoveMockTransaction(&kRangeGET_TransactionOK); |
2325 } | 2339 } |
2326 | 2340 |
2327 // Tests that we can handle non-range requests when we have cached the first | 2341 // Tests that we can handle non-range requests when we have cached the first |
2328 // part of the object and server replies with 304 (Not Modified). | 2342 // part of the object and server replies with 304 (Not Modified). |
2329 TEST(HttpCache, GET_Previous206_NotModified) { | 2343 TEST(HttpCache, GET_Previous206_NotModified) { |
2330 MockHttpCache cache; | 2344 MockHttpCache cache; |
2331 cache.http_cache()->set_enable_range_support(true); | 2345 cache.http_cache()->set_enable_range_support(true); |
2332 | 2346 |
2333 MockTransaction transaction(kRangeGET_TransactionOK); | 2347 MockTransaction transaction(kRangeGET_TransactionOK); |
2334 transaction.request_headers = "Range: bytes = 0-9\r\n"; | 2348 transaction.request_headers = "Range: bytes = 0-9\r\n" EXTRA_HEADER; |
2335 transaction.data = "rg: 00-09 "; | 2349 transaction.data = "rg: 00-09 "; |
2336 AddMockTransaction(&transaction); | 2350 AddMockTransaction(&transaction); |
2337 std::string headers; | 2351 std::string headers; |
2338 | 2352 |
2339 // Write to the cache (0-9). | 2353 // Write to the cache (0-9). |
2340 RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers); | 2354 RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers); |
2341 | 2355 |
2342 EXPECT_TRUE(Verify206Response(headers, 0, 9)); | 2356 EXPECT_TRUE(Verify206Response(headers, 0, 9)); |
2343 EXPECT_EQ(1, cache.network_layer()->transaction_count()); | 2357 EXPECT_EQ(1, cache.network_layer()->transaction_count()); |
2344 EXPECT_EQ(0, cache.disk_cache()->open_count()); | 2358 EXPECT_EQ(0, cache.disk_cache()->open_count()); |
2345 EXPECT_EQ(1, cache.disk_cache()->create_count()); | 2359 EXPECT_EQ(1, cache.disk_cache()->create_count()); |
2346 | 2360 |
2347 // Read from the cache (0-9), write and read from cache (10 - 79), | 2361 // Read from the cache (0-9), write and read from cache (10 - 79), |
2348 MockTransaction transaction2(kRangeGET_TransactionOK); | 2362 MockTransaction transaction2(kRangeGET_TransactionOK); |
2349 transaction2.request_headers = "Foo: bar\r\n"; | 2363 transaction2.request_headers = "Foo: bar\r\n" EXTRA_HEADER; |
2350 transaction2.data = "rg: 00-09 rg: 10-19 rg: 20-29 rg: 30-39 rg: 40-49 " | 2364 transaction2.data = "rg: 00-09 rg: 10-19 rg: 20-29 rg: 30-39 rg: 40-49 " |
2351 "rg: 50-59 rg: 60-69 rg: 70-79 "; | 2365 "rg: 50-59 rg: 60-69 rg: 70-79 "; |
2352 RunTransactionTestWithResponse(cache.http_cache(), transaction2, &headers); | 2366 RunTransactionTestWithResponse(cache.http_cache(), transaction2, &headers); |
2353 | 2367 |
2354 EXPECT_EQ(0U, headers.find("HTTP/1.1 200 OK\n")); | 2368 EXPECT_EQ(0U, headers.find("HTTP/1.1 200 OK\n")); |
2355 EXPECT_EQ(3, cache.network_layer()->transaction_count()); | 2369 EXPECT_EQ(3, cache.network_layer()->transaction_count()); |
2356 EXPECT_EQ(1, cache.disk_cache()->open_count()); | 2370 EXPECT_EQ(1, cache.disk_cache()->open_count()); |
2357 EXPECT_EQ(1, cache.disk_cache()->create_count()); | 2371 EXPECT_EQ(1, cache.disk_cache()->create_count()); |
2358 | 2372 |
2359 RemoveMockTransaction(&transaction); | 2373 RemoveMockTransaction(&transaction); |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2494 | 2508 |
2495 // Tests that we can handle a 200 response when dealing with sparse entries. | 2509 // Tests that we can handle a 200 response when dealing with sparse entries. |
2496 TEST(HttpCache, RangeRequestResultsIn200) { | 2510 TEST(HttpCache, RangeRequestResultsIn200) { |
2497 MockHttpCache cache; | 2511 MockHttpCache cache; |
2498 cache.http_cache()->set_enable_range_support(true); | 2512 cache.http_cache()->set_enable_range_support(true); |
2499 AddMockTransaction(&kRangeGET_TransactionOK); | 2513 AddMockTransaction(&kRangeGET_TransactionOK); |
2500 std::string headers; | 2514 std::string headers; |
2501 | 2515 |
2502 // Write to the cache (70-79). | 2516 // Write to the cache (70-79). |
2503 MockTransaction transaction(kRangeGET_TransactionOK); | 2517 MockTransaction transaction(kRangeGET_TransactionOK); |
2504 transaction.request_headers = "Range: bytes = -10\r\n"; | 2518 transaction.request_headers = "Range: bytes = -10\r\n" EXTRA_HEADER; |
2505 transaction.data = "rg: 70-79 "; | 2519 transaction.data = "rg: 70-79 "; |
2506 RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers); | 2520 RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers); |
2507 | 2521 |
2508 EXPECT_TRUE(Verify206Response(headers, 70, 79)); | 2522 EXPECT_TRUE(Verify206Response(headers, 70, 79)); |
2509 EXPECT_EQ(1, cache.network_layer()->transaction_count()); | 2523 EXPECT_EQ(1, cache.network_layer()->transaction_count()); |
2510 EXPECT_EQ(0, cache.disk_cache()->open_count()); | 2524 EXPECT_EQ(0, cache.disk_cache()->open_count()); |
2511 EXPECT_EQ(1, cache.disk_cache()->create_count()); | 2525 EXPECT_EQ(1, cache.disk_cache()->create_count()); |
2512 | 2526 |
2513 // Now we'll issue a request that results in a plain 200 response, but to | 2527 // Now we'll issue a request that results in a plain 200 response, but to |
2514 // the to the same URL that we used to store sparse data, and making sure | 2528 // the to the same URL that we used to store sparse data, and making sure |
(...skipping 29 matching lines...) Expand all Loading... |
2544 RunTransactionTestWithResponse(cache.http_cache(), kRangeGET_TransactionOK, | 2558 RunTransactionTestWithResponse(cache.http_cache(), kRangeGET_TransactionOK, |
2545 &headers); | 2559 &headers); |
2546 | 2560 |
2547 EXPECT_TRUE(Verify206Response(headers, 40, 49)); | 2561 EXPECT_TRUE(Verify206Response(headers, 40, 49)); |
2548 EXPECT_EQ(1, cache.network_layer()->transaction_count()); | 2562 EXPECT_EQ(1, cache.network_layer()->transaction_count()); |
2549 EXPECT_EQ(0, cache.disk_cache()->open_count()); | 2563 EXPECT_EQ(0, cache.disk_cache()->open_count()); |
2550 EXPECT_EQ(1, cache.disk_cache()->create_count()); | 2564 EXPECT_EQ(1, cache.disk_cache()->create_count()); |
2551 | 2565 |
2552 // A weird request should not delete this entry. Ask for bytes 120-. | 2566 // A weird request should not delete this entry. Ask for bytes 120-. |
2553 MockTransaction transaction(kRangeGET_TransactionOK); | 2567 MockTransaction transaction(kRangeGET_TransactionOK); |
2554 transaction.request_headers = "Range: bytes = 120-\r\n"; | 2568 transaction.request_headers = "Range: bytes = 120-\r\n" EXTRA_HEADER; |
2555 RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers); | 2569 RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers); |
2556 | 2570 |
2557 EXPECT_EQ(0U, headers.find("HTTP/1.1 416 ")); | 2571 EXPECT_EQ(0U, headers.find("HTTP/1.1 416 ")); |
2558 EXPECT_EQ(2, cache.network_layer()->transaction_count()); | 2572 EXPECT_EQ(2, cache.network_layer()->transaction_count()); |
2559 EXPECT_EQ(1, cache.disk_cache()->open_count()); | 2573 EXPECT_EQ(1, cache.disk_cache()->open_count()); |
2560 EXPECT_EQ(1, cache.disk_cache()->create_count()); | 2574 EXPECT_EQ(1, cache.disk_cache()->create_count()); |
2561 | 2575 |
2562 RunTransactionTest(cache.http_cache(), kRangeGET_TransactionOK); | 2576 RunTransactionTest(cache.http_cache(), kRangeGET_TransactionOK); |
2563 EXPECT_EQ(2, cache.disk_cache()->open_count()); | 2577 EXPECT_EQ(2, cache.disk_cache()->open_count()); |
2564 EXPECT_EQ(1, cache.disk_cache()->create_count()); | 2578 EXPECT_EQ(1, cache.disk_cache()->create_count()); |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2710 | 2724 |
2711 // Tests that if a server tells us conflicting information about a resource we | 2725 // Tests that if a server tells us conflicting information about a resource we |
2712 // ignore the response. | 2726 // ignore the response. |
2713 TEST(HttpCache, RangeGET_InvalidResponse3) { | 2727 TEST(HttpCache, RangeGET_InvalidResponse3) { |
2714 MockHttpCache cache; | 2728 MockHttpCache cache; |
2715 cache.http_cache()->set_enable_range_support(true); | 2729 cache.http_cache()->set_enable_range_support(true); |
2716 std::string headers; | 2730 std::string headers; |
2717 | 2731 |
2718 MockTransaction transaction(kRangeGET_TransactionOK); | 2732 MockTransaction transaction(kRangeGET_TransactionOK); |
2719 transaction.handler = NULL; | 2733 transaction.handler = NULL; |
2720 transaction.request_headers = "Range: bytes = 50-59\r\n"; | 2734 transaction.request_headers = "Range: bytes = 50-59\r\n" EXTRA_HEADER; |
2721 std::string response_headers(transaction.response_headers); | 2735 std::string response_headers(transaction.response_headers); |
2722 response_headers.append("Content-Range: bytes 50-59/160\n"); | 2736 response_headers.append("Content-Range: bytes 50-59/160\n"); |
2723 transaction.response_headers = response_headers.c_str(); | 2737 transaction.response_headers = response_headers.c_str(); |
2724 AddMockTransaction(&transaction); | 2738 AddMockTransaction(&transaction); |
2725 RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers); | 2739 RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers); |
2726 | 2740 |
2727 EXPECT_TRUE(Verify206Response(headers, 50, 59)); | 2741 EXPECT_TRUE(Verify206Response(headers, 50, 59)); |
2728 EXPECT_EQ(1, cache.network_layer()->transaction_count()); | 2742 EXPECT_EQ(1, cache.network_layer()->transaction_count()); |
2729 EXPECT_EQ(0, cache.disk_cache()->open_count()); | 2743 EXPECT_EQ(0, cache.disk_cache()->open_count()); |
2730 EXPECT_EQ(1, cache.disk_cache()->create_count()); | 2744 EXPECT_EQ(1, cache.disk_cache()->create_count()); |
(...skipping 26 matching lines...) Expand all Loading... |
2757 TEST(HttpCache, RangeGET_LargeValues) { | 2771 TEST(HttpCache, RangeGET_LargeValues) { |
2758 // We need a real sparse cache for this test. | 2772 // We need a real sparse cache for this test. |
2759 disk_cache::Backend* disk_cache = | 2773 disk_cache::Backend* disk_cache = |
2760 disk_cache::CreateInMemoryCacheBackend(1024 * 1024); | 2774 disk_cache::CreateInMemoryCacheBackend(1024 * 1024); |
2761 MockHttpCache cache(disk_cache); | 2775 MockHttpCache cache(disk_cache); |
2762 cache.http_cache()->set_enable_range_support(true); | 2776 cache.http_cache()->set_enable_range_support(true); |
2763 std::string headers; | 2777 std::string headers; |
2764 | 2778 |
2765 MockTransaction transaction(kRangeGET_TransactionOK); | 2779 MockTransaction transaction(kRangeGET_TransactionOK); |
2766 transaction.handler = NULL; | 2780 transaction.handler = NULL; |
2767 transaction.request_headers = "Range: bytes = 4294967288-4294967297\r\n"; | 2781 transaction.request_headers = "Range: bytes = 4294967288-4294967297\r\n" |
| 2782 EXTRA_HEADER; |
2768 transaction.response_headers = | 2783 transaction.response_headers = |
2769 "Content-Range: bytes 4294967288-4294967297/4294967299\n" | 2784 "Content-Range: bytes 4294967288-4294967297/4294967299\n" |
2770 "Content-Length: 10\n"; | 2785 "Content-Length: 10\n"; |
2771 AddMockTransaction(&transaction); | 2786 AddMockTransaction(&transaction); |
2772 RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers); | 2787 RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers); |
2773 | 2788 |
2774 std::string expected(transaction.status); | 2789 std::string expected(transaction.status); |
2775 expected.append("\n"); | 2790 expected.append("\n"); |
2776 expected.append(transaction.response_headers); | 2791 expected.append(transaction.response_headers); |
2777 EXPECT_EQ(expected, headers); | 2792 EXPECT_EQ(expected, headers); |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2961 EXPECT_TRUE(net::HttpCache::WriteResponseInfo(entry, &response, true, true)); | 2976 EXPECT_TRUE(net::HttpCache::WriteResponseInfo(entry, &response, true, true)); |
2962 | 2977 |
2963 scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(100)); | 2978 scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(100)); |
2964 int len = static_cast<int>(base::strlcpy(buf->data(), | 2979 int len = static_cast<int>(base::strlcpy(buf->data(), |
2965 "rg: 00-09 rg: 10-19 ", 100)); | 2980 "rg: 00-09 rg: 10-19 ", 100)); |
2966 EXPECT_EQ(len, entry->WriteData(1, 0, buf, len, NULL, true)); | 2981 EXPECT_EQ(len, entry->WriteData(1, 0, buf, len, NULL, true)); |
2967 | 2982 |
2968 // Now make a regular request. | 2983 // Now make a regular request. |
2969 std::string headers; | 2984 std::string headers; |
2970 MockTransaction transaction(kRangeGET_TransactionOK); | 2985 MockTransaction transaction(kRangeGET_TransactionOK); |
2971 transaction.request_headers = ""; | 2986 transaction.request_headers = EXTRA_HEADER; |
2972 transaction.data = "rg: 00-09 rg: 10-19 rg: 20-29 rg: 30-39 rg: 40-49 " | 2987 transaction.data = "rg: 00-09 rg: 10-19 rg: 20-29 rg: 30-39 rg: 40-49 " |
2973 "rg: 50-59 rg: 60-69 rg: 70-79 "; | 2988 "rg: 50-59 rg: 60-69 rg: 70-79 "; |
2974 RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers); | 2989 RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers); |
2975 | 2990 |
2976 // We update the headers with the ones received while revalidating. | 2991 // We update the headers with the ones received while revalidating. |
2977 std::string expected_headers( | 2992 std::string expected_headers( |
2978 "HTTP/1.1 200 OK\n" | 2993 "HTTP/1.1 200 OK\n" |
2979 "Last-Modified: Sat, 18 Apr 2009 01:10:43 GMT\n" | 2994 "Last-Modified: Sat, 18 Apr 2009 01:10:43 GMT\n" |
2980 "Accept-Ranges: bytes\n" | 2995 "Accept-Ranges: bytes\n" |
2981 "ETag: \"foo\"\n" | 2996 "ETag: \"foo\"\n" |
(...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3373 std::string headers; | 3388 std::string headers; |
3374 response.headers->GetNormalizedHeaders(&headers); | 3389 response.headers->GetNormalizedHeaders(&headers); |
3375 | 3390 |
3376 EXPECT_EQ("HTTP/1.1 200 OK\n" | 3391 EXPECT_EQ("HTTP/1.1 200 OK\n" |
3377 "Date: Wed, 22 Jul 2009 03:15:26 GMT\n" | 3392 "Date: Wed, 22 Jul 2009 03:15:26 GMT\n" |
3378 "Last-Modified: Wed, 06 Feb 2008 22:38:21 GMT\n", | 3393 "Last-Modified: Wed, 06 Feb 2008 22:38:21 GMT\n", |
3379 headers); | 3394 headers); |
3380 | 3395 |
3381 RemoveMockTransaction(&mock_network_response); | 3396 RemoveMockTransaction(&mock_network_response); |
3382 } | 3397 } |
OLD | NEW |