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_transaction.h" | 5 #include "net/http/http_cache_transaction.h" |
6 | 6 |
7 #include "build/build_config.h" | 7 #include "build/build_config.h" |
8 | 8 |
9 #if defined(OS_POSIX) | 9 #if defined(OS_POSIX) |
10 #include <unistd.h> | 10 #include <unistd.h> |
11 #endif | 11 #endif |
12 | 12 |
13 #include <string> | 13 #include <string> |
14 | 14 |
15 #include "base/bind.h" | 15 #include "base/bind.h" |
16 #include "base/compiler_specific.h" | 16 #include "base/compiler_specific.h" |
17 #include "base/memory/ref_counted.h" | 17 #include "base/memory/ref_counted.h" |
18 #include "base/metrics/field_trial.h" | 18 #include "base/metrics/field_trial.h" |
19 #include "base/metrics/histogram.h" | 19 #include "base/metrics/histogram.h" |
20 #include "base/rand_util.h" | 20 #include "base/rand_util.h" |
21 #include "base/string_number_conversions.h" | 21 #include "base/string_number_conversions.h" |
22 #include "base/string_util.h" | 22 #include "base/string_util.h" |
23 #include "base/time.h" | 23 #include "base/time.h" |
24 #include "net/base/completion_callback.h" | 24 #include "net/base/completion_callback.h" |
25 #include "net/base/io_buffer.h" | 25 #include "net/base/io_buffer.h" |
26 #include "net/base/load_flags.h" | 26 #include "net/base/load_flags.h" |
| 27 #include "net/base/load_timing_info.h" |
27 #include "net/base/net_errors.h" | 28 #include "net/base/net_errors.h" |
28 #include "net/base/net_log.h" | 29 #include "net/base/net_log.h" |
29 #include "net/base/upload_data_stream.h" | 30 #include "net/base/upload_data_stream.h" |
30 #include "net/cert/cert_status_flags.h" | 31 #include "net/cert/cert_status_flags.h" |
31 #include "net/disk_cache/disk_cache.h" | 32 #include "net/disk_cache/disk_cache.h" |
32 #include "net/http/http_network_session.h" | 33 #include "net/http/http_network_session.h" |
33 #include "net/http/http_request_info.h" | 34 #include "net/http/http_request_info.h" |
34 #include "net/http/http_response_headers.h" | 35 #include "net/http/http_response_headers.h" |
35 #include "net/http/http_transaction.h" | 36 #include "net/http/http_transaction.h" |
36 #include "net/http/http_transaction_delegate.h" | 37 #include "net/http/http_transaction_delegate.h" |
(...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
481 UploadProgress HttpCache::Transaction::GetUploadProgress() const { | 482 UploadProgress HttpCache::Transaction::GetUploadProgress() const { |
482 if (network_trans_.get()) | 483 if (network_trans_.get()) |
483 return network_trans_->GetUploadProgress(); | 484 return network_trans_->GetUploadProgress(); |
484 return final_upload_progress_; | 485 return final_upload_progress_; |
485 } | 486 } |
486 | 487 |
487 bool HttpCache::Transaction::GetLoadTimingInfo( | 488 bool HttpCache::Transaction::GetLoadTimingInfo( |
488 LoadTimingInfo* load_timing_info) const { | 489 LoadTimingInfo* load_timing_info) const { |
489 if (network_trans_) | 490 if (network_trans_) |
490 return network_trans_->GetLoadTimingInfo(load_timing_info); | 491 return network_trans_->GetLoadTimingInfo(load_timing_info); |
491 // Don't modify |load_timing_info| when reading from the cache instead of the | 492 |
492 // network. | 493 if (last_network_trans_load_timing_) { |
493 return false; | 494 *load_timing_info = *last_network_trans_load_timing_; |
| 495 return true; |
| 496 } |
| 497 |
| 498 if (first_cache_access_since_.is_null()) |
| 499 return false; |
| 500 |
| 501 // If the cache entry was opened, return that time. |
| 502 load_timing_info->send_start = first_cache_access_since_; |
| 503 // This time doesn't make much sense when reading from the cache, so just use |
| 504 // the same time as send_start. |
| 505 load_timing_info->send_end = first_cache_access_since_; |
| 506 return true; |
494 } | 507 } |
495 | 508 |
496 void HttpCache::Transaction::SetPriority(RequestPriority priority) { | 509 void HttpCache::Transaction::SetPriority(RequestPriority priority) { |
497 priority_ = priority; | 510 priority_ = priority; |
498 if (network_trans_) | 511 if (network_trans_) |
499 network_trans_->SetPriority(priority_); | 512 network_trans_->SetPriority(priority_); |
500 } | 513 } |
501 | 514 |
502 //----------------------------------------------------------------------------- | 515 //----------------------------------------------------------------------------- |
503 | 516 |
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
819 DCHECK(!network_trans_.get()); | 832 DCHECK(!network_trans_.get()); |
820 | 833 |
821 send_request_since_ = TimeTicks::Now(); | 834 send_request_since_ = TimeTicks::Now(); |
822 | 835 |
823 // Create a network transaction. | 836 // Create a network transaction. |
824 int rv = cache_->network_layer_->CreateTransaction( | 837 int rv = cache_->network_layer_->CreateTransaction( |
825 priority_, &network_trans_, NULL); | 838 priority_, &network_trans_, NULL); |
826 if (rv != OK) | 839 if (rv != OK) |
827 return rv; | 840 return rv; |
828 | 841 |
| 842 // Old load timing information, if any, is now obsolete. |
| 843 last_network_trans_load_timing_.reset(); |
| 844 |
829 ReportNetworkActionStart(); | 845 ReportNetworkActionStart(); |
830 next_state_ = STATE_SEND_REQUEST_COMPLETE; | 846 next_state_ = STATE_SEND_REQUEST_COMPLETE; |
831 rv = network_trans_->Start(request_, io_callback_, net_log_); | 847 rv = network_trans_->Start(request_, io_callback_, net_log_); |
832 return rv; | 848 return rv; |
833 } | 849 } |
834 | 850 |
835 int HttpCache::Transaction::DoSendRequestComplete(int result) { | 851 int HttpCache::Transaction::DoSendRequestComplete(int result) { |
836 ReportNetworkActionFinish(); | 852 ReportNetworkActionFinish(); |
837 | 853 |
838 if (!cache_) | 854 if (!cache_) |
(...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1252 // the cached 200 response, is what will be returned to the user. | 1268 // the cached 200 response, is what will be returned to the user. |
1253 DoneWritingToEntry(true); | 1269 DoneWritingToEntry(true); |
1254 } else if (entry_ && !handling_206_) { | 1270 } else if (entry_ && !handling_206_) { |
1255 DCHECK_EQ(READ_WRITE, mode_); | 1271 DCHECK_EQ(READ_WRITE, mode_); |
1256 if (!partial_.get() || partial_->IsLastRange()) { | 1272 if (!partial_.get() || partial_->IsLastRange()) { |
1257 cache_->ConvertWriterToReader(entry_); | 1273 cache_->ConvertWriterToReader(entry_); |
1258 mode_ = READ; | 1274 mode_ = READ; |
1259 } | 1275 } |
1260 // We no longer need the network transaction, so destroy it. | 1276 // We no longer need the network transaction, so destroy it. |
1261 final_upload_progress_ = network_trans_->GetUploadProgress(); | 1277 final_upload_progress_ = network_trans_->GetUploadProgress(); |
| 1278 CacheLoadTimingInformation(); |
1262 network_trans_.reset(); | 1279 network_trans_.reset(); |
1263 } else if (entry_ && handling_206_ && truncated_ && | 1280 } else if (entry_ && handling_206_ && truncated_ && |
1264 partial_->initial_validation()) { | 1281 partial_->initial_validation()) { |
1265 // We just finished the validation of a truncated entry, and the server | 1282 // We just finished the validation of a truncated entry, and the server |
1266 // is willing to resume the operation. Now we go back and start serving | 1283 // is willing to resume the operation. Now we go back and start serving |
1267 // the first part to the user. | 1284 // the first part to the user. |
| 1285 CacheLoadTimingInformation(); |
1268 network_trans_.reset(); | 1286 network_trans_.reset(); |
1269 new_response_ = NULL; | 1287 new_response_ = NULL; |
1270 next_state_ = STATE_START_PARTIAL_CACHE_VALIDATION; | 1288 next_state_ = STATE_START_PARTIAL_CACHE_VALIDATION; |
1271 partial_->SetRangeToStartDownload(); | 1289 partial_->SetRangeToStartDownload(); |
1272 return OK; | 1290 return OK; |
1273 } | 1291 } |
1274 next_state_ = STATE_OVERWRITE_CACHED_RESPONSE; | 1292 next_state_ = STATE_OVERWRITE_CACHED_RESPONSE; |
1275 return OK; | 1293 return OK; |
1276 } | 1294 } |
1277 | 1295 |
(...skipping 1034 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2312 is_sparse_ = false; | 2330 is_sparse_ = false; |
2313 if (delete_object) | 2331 if (delete_object) |
2314 partial_.reset(NULL); | 2332 partial_.reset(NULL); |
2315 } | 2333 } |
2316 | 2334 |
2317 int HttpCache::Transaction::DoPartialNetworkReadCompleted(int result) { | 2335 int HttpCache::Transaction::DoPartialNetworkReadCompleted(int result) { |
2318 partial_->OnNetworkReadCompleted(result); | 2336 partial_->OnNetworkReadCompleted(result); |
2319 | 2337 |
2320 if (result == 0) { | 2338 if (result == 0) { |
2321 // We need to move on to the next range. | 2339 // We need to move on to the next range. |
| 2340 CacheLoadTimingInformation(); |
2322 network_trans_.reset(); | 2341 network_trans_.reset(); |
2323 next_state_ = STATE_START_PARTIAL_CACHE_VALIDATION; | 2342 next_state_ = STATE_START_PARTIAL_CACHE_VALIDATION; |
2324 } | 2343 } |
2325 return result; | 2344 return result; |
2326 } | 2345 } |
2327 | 2346 |
2328 int HttpCache::Transaction::DoPartialCacheReadCompleted(int result) { | 2347 int HttpCache::Transaction::DoPartialCacheReadCompleted(int result) { |
2329 partial_->OnCacheReadCompleted(result); | 2348 partial_->OnCacheReadCompleted(result); |
2330 | 2349 |
2331 if (result == 0 && mode_ == READ_WRITE) { | 2350 if (result == 0 && mode_ == READ_WRITE) { |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2554 } | 2573 } |
2555 } | 2574 } |
2556 | 2575 |
2557 int HttpCache::Transaction::ResetCacheIOStart(int return_value) { | 2576 int HttpCache::Transaction::ResetCacheIOStart(int return_value) { |
2558 DCHECK(cache_io_start_.is_null()); | 2577 DCHECK(cache_io_start_.is_null()); |
2559 if (return_value == ERR_IO_PENDING) | 2578 if (return_value == ERR_IO_PENDING) |
2560 cache_io_start_ = base::TimeTicks::Now(); | 2579 cache_io_start_ = base::TimeTicks::Now(); |
2561 return return_value; | 2580 return return_value; |
2562 } | 2581 } |
2563 | 2582 |
| 2583 void HttpCache::Transaction::CacheLoadTimingInformation() { |
| 2584 DCHECK(!last_network_trans_load_timing_); |
| 2585 last_network_trans_load_timing_.reset(new LoadTimingInfo()); |
| 2586 bool result = |
| 2587 network_trans_->GetLoadTimingInfo(last_network_trans_load_timing_.get()); |
| 2588 // This is only called after getting a response from the transaction, so it |
| 2589 // should have timing information. |
| 2590 DCHECK(result); |
| 2591 } |
| 2592 |
2564 } // namespace net | 2593 } // namespace net |
OLD | NEW |