OLD | NEW |
---|---|
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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> |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
106 new_entry_(NULL), | 106 new_entry_(NULL), |
107 network_trans_(NULL), | 107 network_trans_(NULL), |
108 callback_(NULL), | 108 callback_(NULL), |
109 new_response_(NULL), | 109 new_response_(NULL), |
110 mode_(NONE), | 110 mode_(NONE), |
111 target_state_(STATE_NONE), | 111 target_state_(STATE_NONE), |
112 reading_(false), | 112 reading_(false), |
113 invalid_range_(false), | 113 invalid_range_(false), |
114 truncated_(false), | 114 truncated_(false), |
115 is_sparse_(false), | 115 is_sparse_(false), |
116 range_requested_(false), | |
116 handling_206_(false), | 117 handling_206_(false), |
117 cache_pending_(false), | 118 cache_pending_(false), |
118 done_reading_(false), | 119 done_reading_(false), |
119 read_offset_(0), | 120 read_offset_(0), |
120 effective_load_flags_(0), | 121 effective_load_flags_(0), |
121 write_len_(0), | 122 write_len_(0), |
122 final_upload_progress_(0), | 123 final_upload_progress_(0), |
123 ALLOW_THIS_IN_INITIALIZER_LIST( | 124 ALLOW_THIS_IN_INITIALIZER_LIST( |
124 io_callback_(this, &Transaction::OnIOComplete)), | 125 io_callback_(this, &Transaction::OnIOComplete)), |
125 ALLOW_THIS_IN_INITIALIZER_LIST( | 126 ALLOW_THIS_IN_INITIALIZER_LIST( |
(...skipping 542 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
668 } | 669 } |
669 } | 670 } |
670 } | 671 } |
671 | 672 |
672 // If must use cache, then we must fail. This can happen for back/forward | 673 // If must use cache, then we must fail. This can happen for back/forward |
673 // navigations to a page generated via a form post. | 674 // navigations to a page generated via a form post. |
674 if (!(mode_ & READ) && effective_load_flags_ & LOAD_ONLY_FROM_CACHE) | 675 if (!(mode_ & READ) && effective_load_flags_ & LOAD_ONLY_FROM_CACHE) |
675 return ERR_CACHE_MISS; | 676 return ERR_CACHE_MISS; |
676 | 677 |
677 if (mode_ == NONE) { | 678 if (mode_ == NONE) { |
678 if (partial_.get()) | 679 if (partial_.get()) { |
679 partial_->RestoreHeaders(&custom_request_->extra_headers); | 680 partial_->RestoreHeaders(&custom_request_->extra_headers); |
681 partial_.reset(); | |
682 } | |
680 next_state_ = STATE_SEND_REQUEST; | 683 next_state_ = STATE_SEND_REQUEST; |
681 } else { | 684 } else { |
682 next_state_ = STATE_INIT_ENTRY; | 685 next_state_ = STATE_INIT_ENTRY; |
683 } | 686 } |
684 | 687 |
688 // This is only set if we have something to do with the response. | |
689 range_requested_ = (partial_.get() != NULL); | |
690 | |
685 return OK; | 691 return OK; |
686 } | 692 } |
687 | 693 |
688 int HttpCache::Transaction::DoSendRequest() { | 694 int HttpCache::Transaction::DoSendRequest() { |
689 DCHECK(mode_ & WRITE || mode_ == NONE); | 695 DCHECK(mode_ & WRITE || mode_ == NONE); |
690 DCHECK(!network_trans_.get()); | 696 DCHECK(!network_trans_.get()); |
691 | 697 |
692 // Create a network transaction. | 698 // Create a network transaction. |
693 int rv = cache_->network_layer_->CreateTransaction(&network_trans_); | 699 int rv = cache_->network_layer_->CreateTransaction(&network_trans_); |
694 if (rv != OK) | 700 if (rv != OK) |
695 return rv; | 701 return rv; |
696 | 702 |
697 next_state_ = STATE_SEND_REQUEST_COMPLETE; | 703 next_state_ = STATE_SEND_REQUEST_COMPLETE; |
698 rv = network_trans_->Start(request_, &io_callback_, net_log_); | 704 rv = network_trans_->Start(request_, &io_callback_, net_log_); |
699 return rv; | 705 return rv; |
700 } | 706 } |
701 | 707 |
702 int HttpCache::Transaction::DoSendRequestComplete(int result) { | 708 int HttpCache::Transaction::DoSendRequestComplete(int result) { |
703 if (!cache_) | 709 if (!cache_) |
704 return ERR_UNEXPECTED; | 710 return ERR_UNEXPECTED; |
705 | 711 |
706 if (result == OK) { | 712 if (result == OK) { |
707 next_state_ = STATE_SUCCESSFUL_SEND_REQUEST; | 713 next_state_ = STATE_SUCCESSFUL_SEND_REQUEST; |
708 return OK; | 714 return OK; |
709 } | 715 } |
710 | 716 |
711 if (IsCertificateError(result)) { | 717 if (IsCertificateError(result)) { |
712 const HttpResponseInfo* response = network_trans_->GetResponseInfo(); | 718 const HttpResponseInfo* response = network_trans_->GetResponseInfo(); |
713 // If we get a certificate error, then there is a certificate in ssl_info, | 719 // If we get a certificate error, then there is a certificate in ssl_info, |
714 // so GetResponseInfo() should never returns NULL here. | 720 // so GetResponseInfo() should never return NULL here. |
715 DCHECK(response); | 721 DCHECK(response); |
716 response_.ssl_info = response->ssl_info; | 722 response_.ssl_info = response->ssl_info; |
717 } else if (result == ERR_SSL_CLIENT_AUTH_CERT_NEEDED) { | 723 } else if (result == ERR_SSL_CLIENT_AUTH_CERT_NEEDED) { |
718 const HttpResponseInfo* response = network_trans_->GetResponseInfo(); | 724 const HttpResponseInfo* response = network_trans_->GetResponseInfo(); |
719 DCHECK(response); | 725 DCHECK(response); |
720 response_.cert_request_info = response->cert_request_info; | 726 response_.cert_request_info = response->cert_request_info; |
721 } | 727 } |
722 return result; | 728 return result; |
723 } | 729 } |
724 | 730 |
(...skipping 540 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1265 DLOG(ERROR) << "ReadData failed: " << result; | 1271 DLOG(ERROR) << "ReadData failed: " << result; |
1266 return ERR_CACHE_READ_FAILURE; | 1272 return ERR_CACHE_READ_FAILURE; |
1267 } | 1273 } |
1268 | 1274 |
1269 return OK; | 1275 return OK; |
1270 } | 1276 } |
1271 | 1277 |
1272 int HttpCache::Transaction::DoCacheQueryData() { | 1278 int HttpCache::Transaction::DoCacheQueryData() { |
1273 next_state_ = STATE_CACHE_QUERY_DATA_COMPLETE; | 1279 next_state_ = STATE_CACHE_QUERY_DATA_COMPLETE; |
1274 | 1280 |
1275 // Balanced in ValidateEntryHeadersAndContinue. | 1281 // Balanced in DoCacheQueryDataComplete. |
gavinp
2011/07/21 22:11:23
So these were just plain wrong? Good catch. And
rvargas (doing something else)
2011/07/21 23:05:18
Left behind by some refactor.
| |
1276 cache_callback_->AddRef(); | 1282 cache_callback_->AddRef(); |
1277 return entry_->disk_entry->ReadyForSparseIO(cache_callback_); | 1283 return entry_->disk_entry->ReadyForSparseIO(cache_callback_); |
1278 } | 1284 } |
1279 | 1285 |
1280 int HttpCache::Transaction::DoCacheQueryDataComplete(int result) { | 1286 int HttpCache::Transaction::DoCacheQueryDataComplete(int result) { |
1281 DCHECK_EQ(OK, result); | 1287 DCHECK_EQ(OK, result); |
1282 // Balance the AddRef from BeginPartialCacheValidation. | 1288 // Balance the AddRef from DoCacheQueryData. |
1283 cache_callback_->Release(); | 1289 cache_callback_->Release(); |
1284 if (!cache_) | 1290 if (!cache_) |
1285 return ERR_UNEXPECTED; | 1291 return ERR_UNEXPECTED; |
1286 | 1292 |
1287 return ValidateEntryHeadersAndContinue(true); | 1293 return ValidateEntryHeadersAndContinue(); |
1288 } | 1294 } |
1289 | 1295 |
1290 int HttpCache::Transaction::DoCacheReadData() { | 1296 int HttpCache::Transaction::DoCacheReadData() { |
1291 DCHECK(entry_); | 1297 DCHECK(entry_); |
1292 next_state_ = STATE_CACHE_READ_DATA_COMPLETE; | 1298 next_state_ = STATE_CACHE_READ_DATA_COMPLETE; |
1293 cache_callback_->AddRef(); // Balanced in DoCacheReadDataComplete. | 1299 cache_callback_->AddRef(); // Balanced in DoCacheReadDataComplete. |
1294 | 1300 |
1295 if (net_log_.IsLoggingAllEvents()) | 1301 if (net_log_.IsLoggingAllEvents()) |
1296 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_READ_DATA, NULL); | 1302 net_log_.BeginEvent(NetLog::TYPE_HTTP_CACHE_READ_DATA, NULL); |
1297 if (partial_.get()) { | 1303 if (partial_.get()) { |
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1558 return OK; | 1564 return OK; |
1559 } | 1565 } |
1560 | 1566 |
1561 int HttpCache::Transaction::BeginPartialCacheValidation() { | 1567 int HttpCache::Transaction::BeginPartialCacheValidation() { |
1562 DCHECK(mode_ == READ_WRITE); | 1568 DCHECK(mode_ == READ_WRITE); |
1563 | 1569 |
1564 if (response_.headers->response_code() != 206 && !partial_.get() && | 1570 if (response_.headers->response_code() != 206 && !partial_.get() && |
1565 !truncated_) | 1571 !truncated_) |
1566 return BeginCacheValidation(); | 1572 return BeginCacheValidation(); |
1567 | 1573 |
1568 bool byte_range_requested = partial_.get() != NULL; | 1574 if (range_requested_) { |
1569 if (byte_range_requested) { | |
1570 next_state_ = STATE_CACHE_QUERY_DATA; | 1575 next_state_ = STATE_CACHE_QUERY_DATA; |
1571 return OK; | 1576 return OK; |
1572 } | 1577 } |
1573 // The request is not for a range, but we have stored just ranges. | 1578 // The request is not for a range, but we have stored just ranges. |
1574 partial_.reset(new PartialData()); | 1579 partial_.reset(new PartialData()); |
1575 partial_->SetHeaders(request_->extra_headers); | 1580 partial_->SetHeaders(request_->extra_headers); |
1576 if (!custom_request_.get()) { | 1581 if (!custom_request_.get()) { |
1577 custom_request_.reset(new HttpRequestInfo(*request_)); | 1582 custom_request_.reset(new HttpRequestInfo(*request_)); |
1578 request_ = custom_request_.get(); | 1583 request_ = custom_request_.get(); |
1579 } | 1584 } |
1580 | 1585 |
1581 return ValidateEntryHeadersAndContinue(false); | 1586 return ValidateEntryHeadersAndContinue(); |
1582 } | 1587 } |
1583 | 1588 |
1584 // This should only be called once per request. | 1589 // This should only be called once per request. |
1585 int HttpCache::Transaction::ValidateEntryHeadersAndContinue( | 1590 int HttpCache::Transaction::ValidateEntryHeadersAndContinue() { |
1586 bool byte_range_requested) { | |
1587 DCHECK(mode_ == READ_WRITE); | 1591 DCHECK(mode_ == READ_WRITE); |
1588 | 1592 |
1589 if (!partial_->UpdateFromStoredHeaders(response_.headers, entry_->disk_entry, | 1593 if (!partial_->UpdateFromStoredHeaders(response_.headers, entry_->disk_entry, |
1590 truncated_)) { | 1594 truncated_)) { |
1591 // The stored data cannot be used. Get rid of it and restart this request. | 1595 // The stored data cannot be used. Get rid of it and restart this request. |
1592 // We need to also reset the |truncated_| flag as a new entry is created. | 1596 // We need to also reset the |truncated_| flag as a new entry is created. |
1593 DoomPartialEntry(!byte_range_requested); | 1597 DoomPartialEntry(!range_requested_); |
1594 mode_ = WRITE; | 1598 mode_ = WRITE; |
1595 truncated_ = false; | 1599 truncated_ = false; |
1596 next_state_ = STATE_INIT_ENTRY; | 1600 next_state_ = STATE_INIT_ENTRY; |
1597 return OK; | 1601 return OK; |
1598 } | 1602 } |
1599 | 1603 |
1600 if (response_.headers->response_code() == 206) | 1604 if (response_.headers->response_code() == 206) |
1601 is_sparse_ = true; | 1605 is_sparse_ = true; |
1602 | 1606 |
1603 if (!partial_->IsRequestedRangeOK()) { | 1607 if (!partial_->IsRequestedRangeOK()) { |
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1825 | 1829 |
1826 if (response_code == 304 && partial_->ResponseHeadersOK(headers)) | 1830 if (response_code == 304 && partial_->ResponseHeadersOK(headers)) |
1827 return true; | 1831 return true; |
1828 } else { | 1832 } else { |
1829 // We asked for "If-Range: " so a 206 means just another range. | 1833 // We asked for "If-Range: " so a 206 means just another range. |
1830 if (partial_response && partial_->ResponseHeadersOK(headers)) { | 1834 if (partial_response && partial_->ResponseHeadersOK(headers)) { |
1831 handling_206_ = true; | 1835 handling_206_ = true; |
1832 return true; | 1836 return true; |
1833 } | 1837 } |
1834 | 1838 |
1839 if (response_code == 200 && !reading_ && !is_sparse_) { | |
1840 // The server is sending the whole resource, and we can save it. | |
1841 DCHECK((truncated_ && !partial_->IsLastRange()) || range_requested_); | |
1842 partial_.reset(); | |
1843 truncated_ = false; | |
1844 return true; | |
1845 } | |
1846 | |
1835 // 304 is not expected here, but we'll spare the entry (unless it was | 1847 // 304 is not expected here, but we'll spare the entry (unless it was |
1836 // truncated). | 1848 // truncated). |
1837 if (truncated_) { | 1849 if (truncated_) |
1838 if (!reading_ && response_code == 200) { | |
1839 // The server is sending the whole resource, and we can save it. | |
1840 DCHECK(!partial_->IsLastRange()); | |
1841 partial_.reset(); | |
1842 truncated_ = false; | |
1843 return true; | |
1844 } | |
1845 failure = true; | 1850 failure = true; |
1846 } | |
1847 } | 1851 } |
1848 | 1852 |
1849 if (failure) { | 1853 if (failure) { |
1850 // We cannot truncate this entry, it has to be deleted. | 1854 // We cannot truncate this entry, it has to be deleted. |
1851 DoomPartialEntry(false); | 1855 DoomPartialEntry(false); |
1852 mode_ = NONE; | 1856 mode_ = NONE; |
1853 if (!reading_ && !partial_->IsLastRange()) { | 1857 if (!reading_ && !partial_->IsLastRange()) { |
1854 // We'll attempt to issue another network request, this time without us | 1858 // We'll attempt to issue another network request, this time without us |
1855 // messing up the headers. | 1859 // messing up the headers. |
1856 partial_->RestoreHeaders(&custom_request_->extra_headers); | 1860 partial_->RestoreHeaders(&custom_request_->extra_headers); |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2041 return false; | 2045 return false; |
2042 | 2046 |
2043 return true; | 2047 return true; |
2044 } | 2048 } |
2045 | 2049 |
2046 void HttpCache::Transaction::OnIOComplete(int result) { | 2050 void HttpCache::Transaction::OnIOComplete(int result) { |
2047 DoLoop(result); | 2051 DoLoop(result); |
2048 } | 2052 } |
2049 | 2053 |
2050 } // namespace net | 2054 } // namespace net |
OLD | NEW |