| 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 "net/http/http_cache.h" | 5 #include "net/http/http_cache.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/memory/scoped_vector.h" | 9 #include "base/memory/scoped_vector.h" |
| 10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 149 } | 149 } |
| 150 scoped_ptr<net::HttpTransaction> trans; | 150 scoped_ptr<net::HttpTransaction> trans; |
| 151 int rv = cache->CreateTransaction( | 151 int rv = cache->CreateTransaction( |
| 152 net::DEFAULT_PRIORITY, &trans, delegate.get()); | 152 net::DEFAULT_PRIORITY, &trans, delegate.get()); |
| 153 EXPECT_EQ(net::OK, rv); | 153 EXPECT_EQ(net::OK, rv); |
| 154 ASSERT_TRUE(trans.get()); | 154 ASSERT_TRUE(trans.get()); |
| 155 | 155 |
| 156 rv = trans->Start(&request, callback.callback(), net_log); | 156 rv = trans->Start(&request, callback.callback(), net_log); |
| 157 if (rv == net::ERR_IO_PENDING) | 157 if (rv == net::ERR_IO_PENDING) |
| 158 rv = callback.WaitForResult(); | 158 rv = callback.WaitForResult(); |
| 159 ASSERT_EQ(net::OK, rv); | 159 ASSERT_EQ(trans_info.return_code, rv); |
| 160 |
| 161 if (net::OK != rv) |
| 162 return; |
| 160 | 163 |
| 161 const net::HttpResponseInfo* response = trans->GetResponseInfo(); | 164 const net::HttpResponseInfo* response = trans->GetResponseInfo(); |
| 162 ASSERT_TRUE(response); | 165 ASSERT_TRUE(response); |
| 163 | 166 |
| 164 if (response_info) | 167 if (response_info) |
| 165 *response_info = *response; | 168 *response_info = *response; |
| 166 | 169 |
| 167 ReadAndVerifyTransaction(trans.get(), trans_info); | 170 ReadAndVerifyTransaction(trans.get(), trans_info); |
| 168 } | 171 } |
| 169 | 172 |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 243 "GET", | 246 "GET", |
| 244 base::Time(), | 247 base::Time(), |
| 245 "", | 248 "", |
| 246 net::LOAD_VALIDATE_CACHE, | 249 net::LOAD_VALIDATE_CACHE, |
| 247 "HTTP/1.1 200 OK", | 250 "HTTP/1.1 200 OK", |
| 248 "Cache-Control: max-age=10000\n", | 251 "Cache-Control: max-age=10000\n", |
| 249 base::Time(), | 252 base::Time(), |
| 250 "<html><body>Google Blah Blah</body></html>", | 253 "<html><body>Google Blah Blah</body></html>", |
| 251 TEST_MODE_SYNC_NET_START, | 254 TEST_MODE_SYNC_NET_START, |
| 252 &FastTransactionServer::FastNoStoreHandler, | 255 &FastTransactionServer::FastNoStoreHandler, |
| 253 0 | 256 0, |
| 257 net::OK |
| 254 }; | 258 }; |
| 255 | 259 |
| 256 // This class provides a handler for kRangeGET_TransactionOK so that the range | 260 // This class provides a handler for kRangeGET_TransactionOK so that the range |
| 257 // request can be served on demand. | 261 // request can be served on demand. |
| 258 class RangeTransactionServer { | 262 class RangeTransactionServer { |
| 259 public: | 263 public: |
| 260 RangeTransactionServer() { | 264 RangeTransactionServer() { |
| 261 not_modified_ = false; | 265 not_modified_ = false; |
| 262 modified_ = false; | 266 modified_ = false; |
| 263 bad_200_ = false; | 267 bad_200_ = false; |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 384 net::LOAD_NORMAL, | 388 net::LOAD_NORMAL, |
| 385 "HTTP/1.1 206 Partial Content", | 389 "HTTP/1.1 206 Partial Content", |
| 386 "Last-Modified: Sat, 18 Apr 2007 01:10:43 GMT\n" | 390 "Last-Modified: Sat, 18 Apr 2007 01:10:43 GMT\n" |
| 387 "ETag: \"foo\"\n" | 391 "ETag: \"foo\"\n" |
| 388 "Accept-Ranges: bytes\n" | 392 "Accept-Ranges: bytes\n" |
| 389 "Content-Length: 10\n", | 393 "Content-Length: 10\n", |
| 390 base::Time(), | 394 base::Time(), |
| 391 "rg: 40-49 ", | 395 "rg: 40-49 ", |
| 392 TEST_MODE_NORMAL, | 396 TEST_MODE_NORMAL, |
| 393 &RangeTransactionServer::RangeHandler, | 397 &RangeTransactionServer::RangeHandler, |
| 394 0 | 398 0, |
| 399 net::OK |
| 395 }; | 400 }; |
| 396 | 401 |
| 397 // Verifies the response headers (|response|) match a partial content | 402 // Verifies the response headers (|response|) match a partial content |
| 398 // response for the range starting at |start| and ending at |end|. | 403 // response for the range starting at |start| and ending at |end|. |
| 399 void Verify206Response(std::string response, int start, int end) { | 404 void Verify206Response(std::string response, int start, int end) { |
| 400 std::string raw_headers(net::HttpUtil::AssembleRawHeaders(response.data(), | 405 std::string raw_headers(net::HttpUtil::AssembleRawHeaders(response.data(), |
| 401 response.size())); | 406 response.size())); |
| 402 scoped_refptr<net::HttpResponseHeaders> headers( | 407 scoped_refptr<net::HttpResponseHeaders> headers( |
| 403 new net::HttpResponseHeaders(raw_headers)); | 408 new net::HttpResponseHeaders(raw_headers)); |
| 404 | 409 |
| (...skipping 435 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 840 transaction.load_flags |= net::LOAD_PREFERRING_CACHE; | 845 transaction.load_flags |= net::LOAD_PREFERRING_CACHE; |
| 841 transaction.request_headers = "Foo: none\n"; | 846 transaction.request_headers = "Foo: none\n"; |
| 842 RunTransactionTest(cache.http_cache(), transaction); | 847 RunTransactionTest(cache.http_cache(), transaction); |
| 843 | 848 |
| 844 EXPECT_EQ(2, cache.network_layer()->transaction_count()); | 849 EXPECT_EQ(2, cache.network_layer()->transaction_count()); |
| 845 EXPECT_EQ(1, cache.disk_cache()->open_count()); | 850 EXPECT_EQ(1, cache.disk_cache()->open_count()); |
| 846 EXPECT_EQ(1, cache.disk_cache()->create_count()); | 851 EXPECT_EQ(1, cache.disk_cache()->create_count()); |
| 847 RemoveMockTransaction(&transaction); | 852 RemoveMockTransaction(&transaction); |
| 848 } | 853 } |
| 849 | 854 |
| 855 // Tests that LOAD_FROM_CACHE_IF_OFFLINE returns proper response on |
| 856 // network success |
| 857 TEST(HttpCache, SimpleGET_CacheOverride_Network) { |
| 858 MockHttpCache cache; |
| 859 |
| 860 // Prime cache. |
| 861 MockTransaction transaction(kSimpleGET_Transaction); |
| 862 transaction.load_flags |= net::LOAD_FROM_CACHE_IF_OFFLINE; |
| 863 transaction.response_headers = "Cache-Control: no-cache\n"; |
| 864 |
| 865 AddMockTransaction(&transaction); |
| 866 RunTransactionTest(cache.http_cache(), transaction); |
| 867 EXPECT_EQ(1, cache.network_layer()->transaction_count()); |
| 868 EXPECT_EQ(1, cache.disk_cache()->create_count()); |
| 869 RemoveMockTransaction(&transaction); |
| 870 |
| 871 // Re-run transaction; make sure the result came from the network, |
| 872 // not the cache. |
| 873 transaction.data = "Changed data."; |
| 874 AddMockTransaction(&transaction); |
| 875 net::HttpResponseInfo response_info; |
| 876 RunTransactionTestWithResponseInfo(cache.http_cache(), transaction, |
| 877 &response_info); |
| 878 |
| 879 EXPECT_EQ(2, cache.network_layer()->transaction_count()); |
| 880 EXPECT_FALSE(response_info.server_data_unavailable); |
| 881 |
| 882 RemoveMockTransaction(&transaction); |
| 883 } |
| 884 |
| 885 // Tests that LOAD_FROM_CACHE_IF_OFFLINE returns proper response on |
| 886 // offline failure |
| 887 TEST(HttpCache, SimpleGET_CacheOverride_Offline) { |
| 888 MockHttpCache cache; |
| 889 |
| 890 // Prime cache. |
| 891 MockTransaction transaction(kSimpleGET_Transaction); |
| 892 transaction.load_flags |= net::LOAD_FROM_CACHE_IF_OFFLINE; |
| 893 transaction.response_headers = "Cache-Control: no-cache\n"; |
| 894 |
| 895 AddMockTransaction(&transaction); |
| 896 RunTransactionTest(cache.http_cache(), transaction); |
| 897 EXPECT_EQ(1, cache.network_layer()->transaction_count()); |
| 898 EXPECT_EQ(1, cache.disk_cache()->create_count()); |
| 899 RemoveMockTransaction(&transaction); |
| 900 |
| 901 // Network failure with offline error; should return cache entry above + |
| 902 // flag signalling stale data. |
| 903 transaction.return_code = net::ERR_NAME_NOT_RESOLVED; |
| 904 AddMockTransaction(&transaction); |
| 905 |
| 906 MockHttpRequest request(transaction); |
| 907 net::TestCompletionCallback callback; |
| 908 scoped_ptr<net::HttpTransaction> trans; |
| 909 int rv = cache.http_cache()->CreateTransaction( |
| 910 net::DEFAULT_PRIORITY, &trans, NULL); |
| 911 EXPECT_EQ(net::OK, rv); |
| 912 ASSERT_TRUE(trans.get()); |
| 913 rv = trans->Start(&request, callback.callback(), net::BoundNetLog()); |
| 914 EXPECT_EQ(net::OK, callback.GetResult(rv)); |
| 915 |
| 916 const net::HttpResponseInfo* response_info = trans->GetResponseInfo(); |
| 917 ASSERT_TRUE(response_info); |
| 918 EXPECT_TRUE(response_info->server_data_unavailable); |
| 919 EXPECT_TRUE(response_info->was_cached); |
| 920 ReadAndVerifyTransaction(trans.get(), transaction); |
| 921 EXPECT_EQ(2, cache.network_layer()->transaction_count()); |
| 922 |
| 923 RemoveMockTransaction(&transaction); |
| 924 } |
| 925 |
| 926 // Tests that LOAD_FROM_CACHE_IF_OFFLINE returns proper response on |
| 927 // non-offline failure failure |
| 928 TEST(HttpCache, SimpleGET_CacheOverride_NonOffline) { |
| 929 MockHttpCache cache; |
| 930 |
| 931 // Prime cache. |
| 932 MockTransaction transaction(kSimpleGET_Transaction); |
| 933 transaction.load_flags |= net::LOAD_FROM_CACHE_IF_OFFLINE; |
| 934 transaction.response_headers = "Cache-Control: no-cache\n"; |
| 935 |
| 936 AddMockTransaction(&transaction); |
| 937 RunTransactionTest(cache.http_cache(), transaction); |
| 938 EXPECT_EQ(1, cache.network_layer()->transaction_count()); |
| 939 EXPECT_EQ(1, cache.disk_cache()->create_count()); |
| 940 RemoveMockTransaction(&transaction); |
| 941 |
| 942 // Network failure with non-offline error; should fail with that error. |
| 943 transaction.return_code = net::ERR_PROXY_CONNECTION_FAILED; |
| 944 AddMockTransaction(&transaction); |
| 945 |
| 946 net::HttpResponseInfo response_info2; |
| 947 RunTransactionTestWithResponseInfo(cache.http_cache(), transaction, |
| 948 &response_info2); |
| 949 |
| 950 EXPECT_EQ(2, cache.network_layer()->transaction_count()); |
| 951 EXPECT_FALSE(response_info2.server_data_unavailable); |
| 952 |
| 953 RemoveMockTransaction(&transaction); |
| 954 } |
| 955 |
| 850 TEST(HttpCache, SimpleGET_LoadBypassCache) { | 956 TEST(HttpCache, SimpleGET_LoadBypassCache) { |
| 851 MockHttpCache cache; | 957 MockHttpCache cache; |
| 852 | 958 |
| 853 // Write to the cache. | 959 // Write to the cache. |
| 854 RunTransactionTest(cache.http_cache(), kSimpleGET_Transaction); | 960 RunTransactionTest(cache.http_cache(), kSimpleGET_Transaction); |
| 855 | 961 |
| 856 // Force this transaction to write to the cache again. | 962 // Force this transaction to write to the cache again. |
| 857 MockTransaction transaction(kSimpleGET_Transaction); | 963 MockTransaction transaction(kSimpleGET_Transaction); |
| 858 transaction.load_flags |= net::LOAD_BYPASS_CACHE; | 964 transaction.load_flags |= net::LOAD_BYPASS_CACHE; |
| 859 | 965 |
| (...skipping 4700 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5560 | 5666 |
| 5561 // Force this transaction to read from the cache. | 5667 // Force this transaction to read from the cache. |
| 5562 MockTransaction transaction(kSimpleGET_Transaction); | 5668 MockTransaction transaction(kSimpleGET_Transaction); |
| 5563 transaction.load_flags |= net::LOAD_ONLY_FROM_CACHE; | 5669 transaction.load_flags |= net::LOAD_ONLY_FROM_CACHE; |
| 5564 | 5670 |
| 5565 RunTransactionTestWithDelegate(cache.http_cache(), | 5671 RunTransactionTestWithDelegate(cache.http_cache(), |
| 5566 kSimpleGET_Transaction, | 5672 kSimpleGET_Transaction, |
| 5567 5, | 5673 5, |
| 5568 0); | 5674 0); |
| 5569 } | 5675 } |
| OLD | NEW |