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> |
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
300 while (v.GetNext()) { | 300 while (v.GetNext()) { |
301 if (LowerCaseEqualsASCII(v.value_begin(), v.value_end(), search->value)) | 301 if (LowerCaseEqualsASCII(v.value_begin(), v.value_end(), search->value)) |
302 return true; | 302 return true; |
303 } | 303 } |
304 } | 304 } |
305 return false; | 305 return false; |
306 } | 306 } |
307 | 307 |
308 //----------------------------------------------------------------------------- | 308 //----------------------------------------------------------------------------- |
309 | 309 |
310 HttpCache::Transaction::Transaction( | 310 HttpCache::Transaction::Transaction(RequestPriority priority, HttpCache* cache) |
311 RequestPriority priority, | |
312 HttpCache* cache) | |
313 : next_state_(STATE_NONE), | 311 : next_state_(STATE_NONE), |
314 request_(NULL), | 312 request_(NULL), |
315 priority_(priority), | 313 priority_(priority), |
316 cache_(cache->GetWeakPtr()), | 314 cache_(cache->GetWeakPtr()), |
317 entry_(NULL), | 315 entry_(NULL), |
318 new_entry_(NULL), | 316 new_entry_(NULL), |
319 new_response_(NULL), | 317 new_response_(NULL), |
320 mode_(NONE), | 318 mode_(NONE), |
321 target_state_(STATE_NONE), | 319 target_state_(STATE_NONE), |
322 reading_(false), | 320 reading_(false), |
323 invalid_range_(false), | 321 invalid_range_(false), |
324 truncated_(false), | 322 truncated_(false), |
325 is_sparse_(false), | 323 is_sparse_(false), |
326 range_requested_(false), | 324 range_requested_(false), |
327 handling_206_(false), | 325 handling_206_(false), |
328 cache_pending_(false), | 326 cache_pending_(false), |
329 done_reading_(false), | 327 done_reading_(false), |
330 vary_mismatch_(false), | 328 vary_mismatch_(false), |
331 couldnt_conditionalize_request_(false), | 329 couldnt_conditionalize_request_(false), |
332 bypass_lock_for_test_(false), | 330 bypass_lock_for_test_(false), |
| 331 fail_conditionalization_for_test_(false), |
333 io_buf_len_(0), | 332 io_buf_len_(0), |
334 read_offset_(0), | 333 read_offset_(0), |
335 effective_load_flags_(0), | 334 effective_load_flags_(0), |
336 write_len_(0), | 335 write_len_(0), |
337 transaction_pattern_(PATTERN_UNDEFINED), | 336 transaction_pattern_(PATTERN_UNDEFINED), |
338 total_received_bytes_(0), | 337 total_received_bytes_(0), |
339 websocket_handshake_stream_base_create_helper_(NULL), | 338 websocket_handshake_stream_base_create_helper_(NULL), |
340 weak_factory_(this) { | 339 weak_factory_(this) { |
341 COMPILE_ASSERT(HttpCache::Transaction::kNumValidationHeaders == | 340 COMPILE_ASSERT(HttpCache::Transaction::kNumValidationHeaders == |
342 arraysize(kValidationHeaders), | 341 arraysize(kValidationHeaders), |
(...skipping 869 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1212 partial_.reset(); | 1211 partial_.reset(); |
1213 } | 1212 } |
1214 | 1213 |
1215 new_response_ = new_response; | 1214 new_response_ = new_response; |
1216 if (authentication_failure || | 1215 if (authentication_failure || |
1217 (!ValidatePartialResponse() && !auth_response_.headers.get())) { | 1216 (!ValidatePartialResponse() && !auth_response_.headers.get())) { |
1218 // Something went wrong with this request and we have to restart it. | 1217 // Something went wrong with this request and we have to restart it. |
1219 // If we have an authentication response, we are exposed to weird things | 1218 // If we have an authentication response, we are exposed to weird things |
1220 // hapenning if the user cancels the authentication before we receive | 1219 // hapenning if the user cancels the authentication before we receive |
1221 // the new response. | 1220 // the new response. |
| 1221 net_log_.AddEvent(NetLog::TYPE_HTTP_CACHE_RE_SEND_PARTIAL_REQUEST); |
1222 UpdateTransactionPattern(PATTERN_NOT_COVERED); | 1222 UpdateTransactionPattern(PATTERN_NOT_COVERED); |
1223 response_ = HttpResponseInfo(); | 1223 response_ = HttpResponseInfo(); |
1224 ResetNetworkTransaction(); | 1224 ResetNetworkTransaction(); |
1225 new_response_ = NULL; | 1225 new_response_ = NULL; |
1226 next_state_ = STATE_SEND_REQUEST; | 1226 next_state_ = STATE_SEND_REQUEST; |
1227 return OK; | 1227 return OK; |
1228 } | 1228 } |
1229 | 1229 |
1230 if (handling_206_ && mode_ == READ_WRITE && !truncated_ && !is_sparse_) { | 1230 if (handling_206_ && mode_ == READ_WRITE && !truncated_ && !is_sparse_) { |
1231 // We have stored the full entry, but it changed and the server is | 1231 // We have stored the full entry, but it changed and the server is |
(...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1703 response_ = *new_response_; | 1703 response_ = *new_response_; |
1704 | 1704 |
1705 if (request_->method == "HEAD") { | 1705 if (request_->method == "HEAD") { |
1706 // This response is replacing the cached one. | 1706 // This response is replacing the cached one. |
1707 DoneWritingToEntry(false); | 1707 DoneWritingToEntry(false); |
1708 mode_ = NONE; | 1708 mode_ = NONE; |
1709 new_response_ = NULL; | 1709 new_response_ = NULL; |
1710 return OK; | 1710 return OK; |
1711 } | 1711 } |
1712 | 1712 |
| 1713 if (handling_206_ && !CanResume(false)) { |
| 1714 // There is no point in storing this resource because it will never be used. |
| 1715 // This may change if we support LOAD_ONLY_FROM_CACHE with sparse entries. |
| 1716 DoneWritingToEntry(false); |
| 1717 if (partial_.get()) |
| 1718 partial_->FixResponseHeaders(response_.headers.get(), true); |
| 1719 next_state_ = STATE_PARTIAL_HEADERS_RECEIVED; |
| 1720 return OK; |
| 1721 } |
| 1722 |
1713 target_state_ = STATE_TRUNCATE_CACHED_DATA; | 1723 target_state_ = STATE_TRUNCATE_CACHED_DATA; |
1714 next_state_ = truncated_ ? STATE_CACHE_WRITE_TRUNCATED_RESPONSE : | 1724 next_state_ = truncated_ ? STATE_CACHE_WRITE_TRUNCATED_RESPONSE : |
1715 STATE_CACHE_WRITE_RESPONSE; | 1725 STATE_CACHE_WRITE_RESPONSE; |
1716 return OK; | 1726 return OK; |
1717 } | 1727 } |
1718 | 1728 |
1719 int HttpCache::Transaction::DoTruncateCachedData() { | 1729 int HttpCache::Transaction::DoTruncateCachedData() { |
1720 // TODO(vadimt): Remove ScopedTracker below once crbug.com/422516 is fixed. | 1730 // TODO(vadimt): Remove ScopedTracker below once crbug.com/422516 is fixed. |
1721 tracked_objects::ScopedTracker tracking_profile( | 1731 tracked_objects::ScopedTracker tracking_profile( |
1722 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 1732 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1969 next_state_ = STATE_CACHE_QUERY_DATA_COMPLETE; | 1979 next_state_ = STATE_CACHE_QUERY_DATA_COMPLETE; |
1970 return entry_->disk_entry->ReadyForSparseIO(io_callback_); | 1980 return entry_->disk_entry->ReadyForSparseIO(io_callback_); |
1971 } | 1981 } |
1972 | 1982 |
1973 int HttpCache::Transaction::DoCacheQueryDataComplete(int result) { | 1983 int HttpCache::Transaction::DoCacheQueryDataComplete(int result) { |
1974 // TODO(vadimt): Remove ScopedTracker below once crbug.com/422516 is fixed. | 1984 // TODO(vadimt): Remove ScopedTracker below once crbug.com/422516 is fixed. |
1975 tracked_objects::ScopedTracker tracking_profile( | 1985 tracked_objects::ScopedTracker tracking_profile( |
1976 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 1986 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
1977 "422516 HttpCache::Transaction::DoCacheQueryDataComplete")); | 1987 "422516 HttpCache::Transaction::DoCacheQueryDataComplete")); |
1978 | 1988 |
1979 if (result == ERR_NOT_IMPLEMENTED) { | |
1980 // Restart the request overwriting the cache entry. | |
1981 // TODO(pasko): remove this workaround as soon as the SimpleBackendImpl | |
1982 // supports Sparse IO. | |
1983 return DoRestartPartialRequest(); | |
1984 } | |
1985 DCHECK_EQ(OK, result); | 1989 DCHECK_EQ(OK, result); |
1986 if (!cache_.get()) | 1990 if (!cache_.get()) |
1987 return ERR_UNEXPECTED; | 1991 return ERR_UNEXPECTED; |
1988 | 1992 |
1989 return ValidateEntryHeadersAndContinue(); | 1993 return ValidateEntryHeadersAndContinue(); |
1990 } | 1994 } |
1991 | 1995 |
1992 int HttpCache::Transaction::DoCacheReadData() { | 1996 int HttpCache::Transaction::DoCacheReadData() { |
1993 // TODO(vadimt): Remove ScopedTracker below once crbug.com/422516 is fixed. | 1997 // TODO(vadimt): Remove ScopedTracker below once crbug.com/422516 is fixed. |
1994 tracked_objects::ScopedTracker tracking_profile( | 1998 tracked_objects::ScopedTracker tracking_profile( |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2204 const HeaderNameAndValue* search; | 2208 const HeaderNameAndValue* search; |
2205 int load_flag; | 2209 int load_flag; |
2206 } kSpecialHeaders[] = { | 2210 } kSpecialHeaders[] = { |
2207 { kPassThroughHeaders, LOAD_DISABLE_CACHE }, | 2211 { kPassThroughHeaders, LOAD_DISABLE_CACHE }, |
2208 { kForceFetchHeaders, LOAD_BYPASS_CACHE }, | 2212 { kForceFetchHeaders, LOAD_BYPASS_CACHE }, |
2209 { kForceValidateHeaders, LOAD_VALIDATE_CACHE }, | 2213 { kForceValidateHeaders, LOAD_VALIDATE_CACHE }, |
2210 }; | 2214 }; |
2211 | 2215 |
2212 bool range_found = false; | 2216 bool range_found = false; |
2213 bool external_validation_error = false; | 2217 bool external_validation_error = false; |
| 2218 bool special_headers = false; |
2214 | 2219 |
2215 if (request_->extra_headers.HasHeader(HttpRequestHeaders::kRange)) | 2220 if (request_->extra_headers.HasHeader(HttpRequestHeaders::kRange)) |
2216 range_found = true; | 2221 range_found = true; |
2217 | 2222 |
2218 for (size_t i = 0; i < arraysize(kSpecialHeaders); ++i) { | 2223 for (size_t i = 0; i < arraysize(kSpecialHeaders); ++i) { |
2219 if (HeaderMatches(request_->extra_headers, kSpecialHeaders[i].search)) { | 2224 if (HeaderMatches(request_->extra_headers, kSpecialHeaders[i].search)) { |
2220 effective_load_flags_ |= kSpecialHeaders[i].load_flag; | 2225 effective_load_flags_ |= kSpecialHeaders[i].load_flag; |
| 2226 special_headers = true; |
2221 break; | 2227 break; |
2222 } | 2228 } |
2223 } | 2229 } |
2224 | 2230 |
2225 // Check for conditionalization headers which may correspond with a | 2231 // Check for conditionalization headers which may correspond with a |
2226 // cache validation request. | 2232 // cache validation request. |
2227 for (size_t i = 0; i < arraysize(kValidationHeaders); ++i) { | 2233 for (size_t i = 0; i < arraysize(kValidationHeaders); ++i) { |
2228 const ValidationHeaderInfo& info = kValidationHeaders[i]; | 2234 const ValidationHeaderInfo& info = kValidationHeaders[i]; |
2229 std::string validation_value; | 2235 std::string validation_value; |
2230 if (request_->extra_headers.GetHeader( | 2236 if (request_->extra_headers.GetHeader( |
2231 info.request_header_name, &validation_value)) { | 2237 info.request_header_name, &validation_value)) { |
2232 if (!external_validation_.values[i].empty() || | 2238 if (!external_validation_.values[i].empty() || |
2233 validation_value.empty()) { | 2239 validation_value.empty()) { |
2234 external_validation_error = true; | 2240 external_validation_error = true; |
2235 } | 2241 } |
2236 external_validation_.values[i] = validation_value; | 2242 external_validation_.values[i] = validation_value; |
2237 external_validation_.initialized = true; | 2243 external_validation_.initialized = true; |
2238 } | 2244 } |
2239 } | 2245 } |
2240 | 2246 |
| 2247 if (range_found || special_headers || external_validation_.initialized) { |
| 2248 // Log the headers before request_ is modified. |
| 2249 std::string empty; |
| 2250 net_log_.AddEvent( |
| 2251 NetLog::TYPE_HTTP_CACHE_CALLER_REQUEST_HEADERS, |
| 2252 base::Bind(&HttpRequestHeaders::NetLogCallback, |
| 2253 base::Unretained(&request_->extra_headers), &empty)); |
| 2254 } |
| 2255 |
2241 // We don't support ranges and validation headers. | 2256 // We don't support ranges and validation headers. |
2242 if (range_found && external_validation_.initialized) { | 2257 if (range_found && external_validation_.initialized) { |
2243 LOG(WARNING) << "Byte ranges AND validation headers found."; | 2258 LOG(WARNING) << "Byte ranges AND validation headers found."; |
2244 effective_load_flags_ |= LOAD_DISABLE_CACHE; | 2259 effective_load_flags_ |= LOAD_DISABLE_CACHE; |
2245 } | 2260 } |
2246 | 2261 |
2247 // If there is more than one validation header, we can't treat this request as | 2262 // If there is more than one validation header, we can't treat this request as |
2248 // a cache validation, since we don't know for sure which header the server | 2263 // a cache validation, since we don't know for sure which header the server |
2249 // will give us a response for (and they could be contradictory). | 2264 // will give us a response for (and they could be contradictory). |
2250 if (external_validation_error) { | 2265 if (external_validation_error) { |
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2563 | 2578 |
2564 if (request_->method == "PUT" || request_->method == "DELETE") | 2579 if (request_->method == "PUT" || request_->method == "DELETE") |
2565 return false; | 2580 return false; |
2566 | 2581 |
2567 // This only makes sense for cached 200 or 206 responses. | 2582 // This only makes sense for cached 200 or 206 responses. |
2568 if (response_.headers->response_code() != 200 && | 2583 if (response_.headers->response_code() != 200 && |
2569 response_.headers->response_code() != 206) { | 2584 response_.headers->response_code() != 206) { |
2570 return false; | 2585 return false; |
2571 } | 2586 } |
2572 | 2587 |
2573 if (response_.headers->response_code() == 206 && | 2588 if (fail_conditionalization_for_test_) |
2574 !response_.headers->HasStrongValidators()) { | |
2575 return false; | 2589 return false; |
2576 } | 2590 |
| 2591 DCHECK(response_.headers->response_code() != 206 || |
| 2592 response_.headers->HasStrongValidators()); |
2577 | 2593 |
2578 // Just use the first available ETag and/or Last-Modified header value. | 2594 // Just use the first available ETag and/or Last-Modified header value. |
2579 // TODO(darin): Or should we use the last? | 2595 // TODO(darin): Or should we use the last? |
2580 | 2596 |
2581 std::string etag_value; | 2597 std::string etag_value; |
2582 if (response_.headers->GetHttpVersion() >= HttpVersion(1, 1)) | 2598 if (response_.headers->GetHttpVersion() >= HttpVersion(1, 1)) |
2583 response_.headers->EnumerateHeader(NULL, "etag", &etag_value); | 2599 response_.headers->EnumerateHeader(NULL, "etag", &etag_value); |
2584 | 2600 |
2585 std::string last_modified_value; | 2601 std::string last_modified_value; |
2586 if (!vary_mismatch_) { | 2602 if (!vary_mismatch_) { |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2705 | 2721 |
2706 if (partial_->IsCurrentRangeCached()) { | 2722 if (partial_->IsCurrentRangeCached()) { |
2707 // We asked for "If-None-Match: " so a 206 means a new object. | 2723 // We asked for "If-None-Match: " so a 206 means a new object. |
2708 if (partial_response) | 2724 if (partial_response) |
2709 failure = true; | 2725 failure = true; |
2710 | 2726 |
2711 if (response_code == 304 && partial_->ResponseHeadersOK(headers)) | 2727 if (response_code == 304 && partial_->ResponseHeadersOK(headers)) |
2712 return true; | 2728 return true; |
2713 } else { | 2729 } else { |
2714 // We asked for "If-Range: " so a 206 means just another range. | 2730 // We asked for "If-Range: " so a 206 means just another range. |
2715 if (partial_response && partial_->ResponseHeadersOK(headers)) { | 2731 if (partial_response) { |
2716 handling_206_ = true; | 2732 if (partial_->ResponseHeadersOK(headers)) { |
2717 return true; | 2733 handling_206_ = true; |
| 2734 return true; |
| 2735 } else { |
| 2736 failure = true; |
| 2737 } |
2718 } | 2738 } |
2719 | 2739 |
2720 if (!reading_ && !is_sparse_ && !partial_response) { | 2740 if (!reading_ && !is_sparse_ && !partial_response) { |
2721 // See if we can ignore the fact that we issued a byte range request. | 2741 // See if we can ignore the fact that we issued a byte range request. |
2722 // If the server sends 200, just store it. If it sends an error, redirect | 2742 // If the server sends 200, just store it. If it sends an error, redirect |
2723 // or something else, we may store the response as long as we didn't have | 2743 // or something else, we may store the response as long as we didn't have |
2724 // anything already stored. | 2744 // anything already stored. |
2725 if (response_code == 200 || | 2745 if (response_code == 200 || |
2726 (!truncated_ && response_code != 304 && response_code != 416)) { | 2746 (!truncated_ && response_code != 304 && response_code != 416)) { |
2727 // The server is sending something else, and we can save it. | 2747 // The server is sending something else, and we can save it. |
2728 DCHECK((truncated_ && !partial_->IsLastRange()) || range_requested_); | 2748 DCHECK((truncated_ && !partial_->IsLastRange()) || range_requested_); |
2729 partial_.reset(); | 2749 partial_.reset(); |
2730 truncated_ = false; | 2750 truncated_ = false; |
2731 return true; | 2751 return true; |
2732 } | 2752 } |
2733 } | 2753 } |
2734 | 2754 |
2735 // 304 is not expected here, but we'll spare the entry (unless it was | 2755 // 304 is not expected here, but we'll spare the entry (unless it was |
2736 // truncated). | 2756 // truncated). |
2737 if (truncated_) | 2757 if (truncated_) |
2738 failure = true; | 2758 failure = true; |
2739 } | 2759 } |
2740 | 2760 |
2741 if (failure) { | 2761 if (failure) { |
2742 // We cannot truncate this entry, it has to be deleted. | 2762 // We cannot truncate this entry, it has to be deleted. |
2743 UpdateTransactionPattern(PATTERN_NOT_COVERED); | 2763 UpdateTransactionPattern(PATTERN_NOT_COVERED); |
2744 DoomPartialEntry(false); | |
2745 mode_ = NONE; | 2764 mode_ = NONE; |
2746 if (!reading_ && !partial_->IsLastRange()) { | 2765 if (is_sparse_ || truncated_) { |
2747 // We'll attempt to issue another network request, this time without us | 2766 // There was something cached to start with, either sparsed data (206), or |
2748 // messing up the headers. | 2767 // a truncated 200, which means that we probably modified the request, |
2749 partial_->RestoreHeaders(&custom_request_->extra_headers); | 2768 // adding a byte range or modifying the range requested by the caller. |
2750 partial_.reset(); | 2769 if (!reading_ && !partial_->IsLastRange()) { |
2751 truncated_ = false; | 2770 // We have not returned anything to the caller yet so it should be safe |
2752 return false; | 2771 // to issue another network request, this time without us messing up the |
| 2772 // headers. |
| 2773 ResetPartialState(true); |
| 2774 return false; |
| 2775 } |
| 2776 LOG(WARNING) << "Failed to revalidate partial entry"; |
2753 } | 2777 } |
2754 LOG(WARNING) << "Failed to revalidate partial entry"; | 2778 DoomPartialEntry(true); |
2755 partial_.reset(); | |
2756 return true; | 2779 return true; |
2757 } | 2780 } |
2758 | 2781 |
2759 IgnoreRangeRequest(); | 2782 IgnoreRangeRequest(); |
2760 return true; | 2783 return true; |
2761 } | 2784 } |
2762 | 2785 |
2763 void HttpCache::Transaction::IgnoreRangeRequest() { | 2786 void HttpCache::Transaction::IgnoreRangeRequest() { |
2764 // We have a problem. We may or may not be reading already (in which case we | 2787 // We have a problem. We may or may not be reading already (in which case we |
2765 // returned the headers), but we'll just pretend that this request is not | 2788 // returned the headers), but we'll just pretend that this request is not |
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2972 OnIOComplete(ERR_CACHE_LOCK_TIMEOUT); | 2995 OnIOComplete(ERR_CACHE_LOCK_TIMEOUT); |
2973 } | 2996 } |
2974 | 2997 |
2975 void HttpCache::Transaction::DoomPartialEntry(bool delete_object) { | 2998 void HttpCache::Transaction::DoomPartialEntry(bool delete_object) { |
2976 DVLOG(2) << "DoomPartialEntry"; | 2999 DVLOG(2) << "DoomPartialEntry"; |
2977 int rv = cache_->DoomEntry(cache_key_, NULL); | 3000 int rv = cache_->DoomEntry(cache_key_, NULL); |
2978 DCHECK_EQ(OK, rv); | 3001 DCHECK_EQ(OK, rv); |
2979 cache_->DoneWithEntry(entry_, this, false); | 3002 cache_->DoneWithEntry(entry_, this, false); |
2980 entry_ = NULL; | 3003 entry_ = NULL; |
2981 is_sparse_ = false; | 3004 is_sparse_ = false; |
| 3005 truncated_ = false; |
2982 if (delete_object) | 3006 if (delete_object) |
2983 partial_.reset(NULL); | 3007 partial_.reset(NULL); |
2984 } | 3008 } |
2985 | 3009 |
2986 int HttpCache::Transaction::DoPartialNetworkReadCompleted(int result) { | 3010 int HttpCache::Transaction::DoPartialNetworkReadCompleted(int result) { |
2987 partial_->OnNetworkReadCompleted(result); | 3011 partial_->OnNetworkReadCompleted(result); |
2988 | 3012 |
2989 if (result == 0) { | 3013 if (result == 0) { |
2990 // We need to move on to the next range. | 3014 // We need to move on to the next range. |
2991 ResetNetworkTransaction(); | 3015 ResetNetworkTransaction(); |
2992 next_state_ = STATE_START_PARTIAL_CACHE_VALIDATION; | 3016 next_state_ = STATE_START_PARTIAL_CACHE_VALIDATION; |
2993 } | 3017 } |
2994 return result; | 3018 return result; |
2995 } | 3019 } |
2996 | 3020 |
2997 int HttpCache::Transaction::DoPartialCacheReadCompleted(int result) { | 3021 int HttpCache::Transaction::DoPartialCacheReadCompleted(int result) { |
2998 partial_->OnCacheReadCompleted(result); | 3022 partial_->OnCacheReadCompleted(result); |
2999 | 3023 |
3000 if (result == 0 && mode_ == READ_WRITE) { | 3024 if (result == 0 && mode_ == READ_WRITE) { |
3001 // We need to move on to the next range. | 3025 // We need to move on to the next range. |
3002 next_state_ = STATE_START_PARTIAL_CACHE_VALIDATION; | 3026 next_state_ = STATE_START_PARTIAL_CACHE_VALIDATION; |
3003 } else if (result < 0) { | 3027 } else if (result < 0) { |
3004 return OnCacheReadError(result, false); | 3028 return OnCacheReadError(result, false); |
3005 } | 3029 } |
3006 return result; | 3030 return result; |
3007 } | 3031 } |
3008 | 3032 |
3009 int HttpCache::Transaction::DoRestartPartialRequest() { | 3033 int HttpCache::Transaction::DoRestartPartialRequest() { |
3010 // The stored data cannot be used. Get rid of it and restart this request. | 3034 // The stored data cannot be used. Get rid of it and restart this request. |
3011 // We need to also reset the |truncated_| flag as a new entry is created. | 3035 net_log_.AddEvent(NetLog::TYPE_HTTP_CACHE_RESTART_PARTIAL_REQUEST); |
3012 DoomPartialEntry(!range_requested_); | 3036 |
| 3037 // WRITE + Doom + STATE_INIT_ENTRY == STATE_CREATE_ENTRY (without an attempt |
| 3038 // to Doom the entry again). |
3013 mode_ = WRITE; | 3039 mode_ = WRITE; |
3014 truncated_ = false; | 3040 ResetPartialState(!range_requested_); |
3015 next_state_ = STATE_INIT_ENTRY; | 3041 next_state_ = STATE_CREATE_ENTRY; |
3016 return OK; | 3042 return OK; |
3017 } | 3043 } |
3018 | 3044 |
| 3045 void HttpCache::Transaction::ResetPartialState(bool delete_object) { |
| 3046 partial_->RestoreHeaders(&custom_request_->extra_headers); |
| 3047 DoomPartialEntry(delete_object); |
| 3048 |
| 3049 if (!delete_object) { |
| 3050 // The simplest way to re-initialize partial_ is to create a new object. |
| 3051 partial_.reset(new PartialData()); |
| 3052 if (partial_->Init(request_->extra_headers)) |
| 3053 partial_->SetHeaders(custom_request_->extra_headers); |
| 3054 else |
| 3055 partial_.reset(); |
| 3056 } |
| 3057 } |
| 3058 |
3019 void HttpCache::Transaction::ResetNetworkTransaction() { | 3059 void HttpCache::Transaction::ResetNetworkTransaction() { |
3020 DCHECK(!old_network_trans_load_timing_); | 3060 DCHECK(!old_network_trans_load_timing_); |
3021 DCHECK(network_trans_); | 3061 DCHECK(network_trans_); |
3022 LoadTimingInfo load_timing; | 3062 LoadTimingInfo load_timing; |
3023 if (network_trans_->GetLoadTimingInfo(&load_timing)) | 3063 if (network_trans_->GetLoadTimingInfo(&load_timing)) |
3024 old_network_trans_load_timing_.reset(new LoadTimingInfo(load_timing)); | 3064 old_network_trans_load_timing_.reset(new LoadTimingInfo(load_timing)); |
3025 total_received_bytes_ += network_trans_->GetTotalReceivedBytes(); | 3065 total_received_bytes_ += network_trans_->GetTotalReceivedBytes(); |
3026 network_trans_.reset(); | 3066 network_trans_.reset(); |
3027 } | 3067 } |
3028 | 3068 |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3147 | 3187 |
3148 void HttpCache::Transaction::OnIOComplete(int result) { | 3188 void HttpCache::Transaction::OnIOComplete(int result) { |
3149 // TODO(vadimt): Remove ScopedTracker below once crbug.com/422516 is fixed. | 3189 // TODO(vadimt): Remove ScopedTracker below once crbug.com/422516 is fixed. |
3150 tracked_objects::ScopedTracker tracking_profile( | 3190 tracked_objects::ScopedTracker tracking_profile( |
3151 FROM_HERE_WITH_EXPLICIT_FUNCTION("422516 Transaction::OnIOComplete")); | 3191 FROM_HERE_WITH_EXPLICIT_FUNCTION("422516 Transaction::OnIOComplete")); |
3152 | 3192 |
3153 DoLoop(result); | 3193 DoLoop(result); |
3154 } | 3194 } |
3155 | 3195 |
3156 } // namespace net | 3196 } // namespace net |
OLD | NEW |