| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "components/cronet/stale_host_resolver.h" | 5 #include "components/cronet/stale_host_resolver.h" |
| 6 | 6 |
| 7 #include "base/callback_helpers.h" | 7 #include "base/callback_helpers.h" |
| 8 #include "base/memory/ptr_util.h" | 8 #include "base/memory/ptr_util.h" |
| 9 #include "base/metrics/histogram_macros.h" | 9 #include "base/metrics/histogram_macros.h" |
| 10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 132 bool have_handle() const { return handle_ != nullptr; } | 132 bool have_handle() const { return handle_ != nullptr; } |
| 133 | 133 |
| 134 // Callback for |stale_timer_| that returns stale results. | 134 // Callback for |stale_timer_| that returns stale results. |
| 135 void OnStaleDelayElapsed(); | 135 void OnStaleDelayElapsed(); |
| 136 // Callback for network request that returns fresh results if the request | 136 // Callback for network request that returns fresh results if the request |
| 137 // hasn't already returned stale results, and completes the request. | 137 // hasn't already returned stale results, and completes the request. |
| 138 void OnNetworkRequestComplete(int error); | 138 void OnNetworkRequestComplete(int error); |
| 139 void OnHandleDestroyed(); | 139 void OnHandleDestroyed(); |
| 140 | 140 |
| 141 // Fills |*result_addresses_| if rv is OK and returns rv. | 141 // Fills |*result_addresses_| if rv is OK and returns rv. |
| 142 int HandleResult(int rv, net::AddressList* addresses); | 142 int HandleResult(int rv, const net::AddressList& addresses); |
| 143 // Fills |*result_addresses_| if rv is OK and calls |result_callback_| with | 143 // Fills |*result_addresses_| if rv is OK and calls |result_callback_| with |
| 144 // rv. | 144 // rv. |
| 145 void ReturnResult(int rv, net::AddressList* addresses); | 145 void ReturnResult(int rv, const net::AddressList& addresses); |
| 146 | 146 |
| 147 void MaybeDeleteThis(); | 147 void MaybeDeleteThis(); |
| 148 | 148 |
| 149 void RecordSynchronousRequest(); | 149 void RecordSynchronousRequest(); |
| 150 void RecordNetworkRequest(int error, bool returned_stale_data); | 150 void RecordNetworkRequest(int error, bool returned_stale_data); |
| 151 void RecordCanceledRequest(); | 151 void RecordCanceledRequest(); |
| 152 | 152 |
| 153 // The address list passed into |Start()| to be filled in when the request | 153 // The address list passed into |Start()| to be filled in when the request |
| 154 // returns. | 154 // returns. |
| 155 net::AddressList* result_addresses_; | 155 net::AddressList* result_addresses_; |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 206 | 206 |
| 207 result_addresses_ = addresses; | 207 result_addresses_ = addresses; |
| 208 | 208 |
| 209 net::AddressList cache_addresses; | 209 net::AddressList cache_addresses; |
| 210 net::HostCache::EntryStaleness stale_info; | 210 net::HostCache::EntryStaleness stale_info; |
| 211 int cache_rv = resolver->ResolveStaleFromCache(info, &cache_addresses, | 211 int cache_rv = resolver->ResolveStaleFromCache(info, &cache_addresses, |
| 212 &stale_info, net_log); | 212 &stale_info, net_log); |
| 213 // If it's a fresh cache hit (or literal), return it synchronously. | 213 // If it's a fresh cache hit (or literal), return it synchronously. |
| 214 if (cache_rv != net::ERR_DNS_CACHE_MISS && !stale_info.is_stale()) { | 214 if (cache_rv != net::ERR_DNS_CACHE_MISS && !stale_info.is_stale()) { |
| 215 RecordSynchronousRequest(); | 215 RecordSynchronousRequest(); |
| 216 return HandleResult(cache_rv, &cache_addresses); | 216 return HandleResult(cache_rv, cache_addresses); |
| 217 } | 217 } |
| 218 | 218 |
| 219 result_callback_ = result_callback; | 219 result_callback_ = result_callback; |
| 220 handle_ = new Handle(this); | 220 handle_ = new Handle(this); |
| 221 *out_req = std::unique_ptr<net::HostResolver::Request>(handle_); | 221 *out_req = std::unique_ptr<net::HostResolver::Request>(handle_); |
| 222 | 222 |
| 223 if (cache_rv != net::ERR_DNS_CACHE_MISS && usable_callback.Run(stale_info)) { | 223 if (cache_rv != net::ERR_DNS_CACHE_MISS && usable_callback.Run(stale_info)) { |
| 224 stale_error_ = cache_rv; | 224 stale_error_ = cache_rv; |
| 225 stale_addresses_ = cache_addresses; | 225 stale_addresses_ = cache_addresses; |
| 226 // |stale_timer_| is deleted when the Request is deleted, so it's safe to | 226 // |stale_timer_| is deleted when the Request is deleted, so it's safe to |
| (...skipping 20 matching lines...) Expand all Loading... |
| 247 net::RequestPriority priority) { | 247 net::RequestPriority priority) { |
| 248 DCHECK(have_network_request()); | 248 DCHECK(have_network_request()); |
| 249 | 249 |
| 250 network_request_->ChangeRequestPriority(priority); | 250 network_request_->ChangeRequestPriority(priority); |
| 251 } | 251 } |
| 252 | 252 |
| 253 void StaleHostResolver::RequestImpl::OnStaleDelayElapsed() { | 253 void StaleHostResolver::RequestImpl::OnStaleDelayElapsed() { |
| 254 DCHECK(!have_returned()); | 254 DCHECK(!have_returned()); |
| 255 DCHECK(have_stale_data()); | 255 DCHECK(have_stale_data()); |
| 256 | 256 |
| 257 ReturnResult(stale_error_, &stale_addresses_); | 257 ReturnResult(stale_error_, stale_addresses_); |
| 258 | 258 |
| 259 // The request needs to wait for both the network request to complete (to | 259 // The request needs to wait for both the network request to complete (to |
| 260 // backfill the cache) and the caller to delete the handle before deleting | 260 // backfill the cache) and the caller to delete the handle before deleting |
| 261 // itself. | 261 // itself. |
| 262 DCHECK(have_network_request()); | 262 DCHECK(have_network_request()); |
| 263 } | 263 } |
| 264 | 264 |
| 265 void StaleHostResolver::RequestImpl::OnNetworkRequestComplete(int error) { | 265 void StaleHostResolver::RequestImpl::OnNetworkRequestComplete(int error) { |
| 266 DCHECK(have_network_request()); | 266 DCHECK(have_network_request()); |
| 267 network_request_.reset(); | 267 network_request_.reset(); |
| 268 | 268 |
| 269 RecordNetworkRequest(error, /* returned_stale_data = */ have_returned()); | 269 RecordNetworkRequest(error, /* returned_stale_data = */ have_returned()); |
| 270 | 270 |
| 271 if (!have_returned()) { | 271 if (!have_returned()) { |
| 272 if (have_stale_data()) | 272 if (have_stale_data()) |
| 273 stale_timer_.Stop(); | 273 stale_timer_.Stop(); |
| 274 ReturnResult(error, &network_addresses_); | 274 ReturnResult(error, network_addresses_); |
| 275 } | 275 } |
| 276 | 276 |
| 277 if (!have_handle()) | 277 if (!have_handle()) |
| 278 delete this; | 278 delete this; |
| 279 } | 279 } |
| 280 | 280 |
| 281 void StaleHostResolver::RequestImpl::OnHandleDestroyed() { | 281 void StaleHostResolver::RequestImpl::OnHandleDestroyed() { |
| 282 DCHECK(have_handle()); | 282 DCHECK(have_handle()); |
| 283 handle_ = nullptr; | 283 handle_ = nullptr; |
| 284 | 284 |
| 285 // If the caller deletes the handle *before* the request has returned, treat | 285 // If the caller deletes the handle *before* the request has returned, treat |
| 286 // it as a cancel. | 286 // it as a cancel. |
| 287 if (!have_returned()) { | 287 if (!have_returned()) { |
| 288 network_request_.reset(); | 288 network_request_.reset(); |
| 289 result_callback_ = net::CompletionCallback(); | 289 result_callback_ = net::CompletionCallback(); |
| 290 RecordCanceledRequest(); | 290 RecordCanceledRequest(); |
| 291 } | 291 } |
| 292 | 292 |
| 293 if (!returning_result_ && !have_handle() && !have_network_request()) | 293 if (!returning_result_ && !have_handle() && !have_network_request()) |
| 294 delete this; | 294 delete this; |
| 295 } | 295 } |
| 296 | 296 |
| 297 int StaleHostResolver::RequestImpl::HandleResult(int rv, | 297 int StaleHostResolver::RequestImpl::HandleResult( |
| 298 net::AddressList* addresses) { | 298 int rv, |
| 299 const net::AddressList& addresses) { |
| 299 DCHECK(result_addresses_); | 300 DCHECK(result_addresses_); |
| 300 | 301 |
| 301 if (rv == net::OK) { | 302 if (rv == net::OK) |
| 302 *result_addresses_ = *addresses; | 303 *result_addresses_ = addresses; |
| 303 addresses->clear(); | |
| 304 } | |
| 305 result_addresses_ = nullptr; | 304 result_addresses_ = nullptr; |
| 306 return rv; | 305 return rv; |
| 307 } | 306 } |
| 308 | 307 |
| 309 void StaleHostResolver::RequestImpl::ReturnResult(int rv, | 308 void StaleHostResolver::RequestImpl::ReturnResult( |
| 310 net::AddressList* addresses) { | 309 int rv, |
| 310 const net::AddressList& addresses) { |
| 311 DCHECK(result_callback_); | 311 DCHECK(result_callback_); |
| 312 returning_result_ = true; | 312 returning_result_ = true; |
| 313 base::ResetAndReturn(&result_callback_).Run(HandleResult(rv, addresses)); | 313 base::ResetAndReturn(&result_callback_).Run(HandleResult(rv, addresses)); |
| 314 returning_result_ = false; | 314 returning_result_ = false; |
| 315 } | 315 } |
| 316 | 316 |
| 317 void StaleHostResolver::RequestImpl::RecordSynchronousRequest() { | 317 void StaleHostResolver::RequestImpl::RecordSynchronousRequest() { |
| 318 RecordRequestOutcome(SYNCHRONOUS); | 318 RecordRequestOutcome(SYNCHRONOUS); |
| 319 } | 319 } |
| 320 | 320 |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 391 | 391 |
| 392 net::HostCache* StaleHostResolver::GetHostCache() { | 392 net::HostCache* StaleHostResolver::GetHostCache() { |
| 393 return inner_resolver_->GetHostCache(); | 393 return inner_resolver_->GetHostCache(); |
| 394 } | 394 } |
| 395 | 395 |
| 396 std::unique_ptr<base::Value> StaleHostResolver::GetDnsConfigAsValue() const { | 396 std::unique_ptr<base::Value> StaleHostResolver::GetDnsConfigAsValue() const { |
| 397 return inner_resolver_->GetDnsConfigAsValue(); | 397 return inner_resolver_->GetDnsConfigAsValue(); |
| 398 } | 398 } |
| 399 | 399 |
| 400 } // namespace net | 400 } // namespace net |
| OLD | NEW |