| Index: content/browser/loader/async_revalidation_driver.cc
|
| diff --git a/content/browser/loader/async_revalidation_driver.cc b/content/browser/loader/async_revalidation_driver.cc
|
| deleted file mode 100644
|
| index 795990e21132cfffe59f397b7b6dc1b3aebc7f0e..0000000000000000000000000000000000000000
|
| --- a/content/browser/loader/async_revalidation_driver.cc
|
| +++ /dev/null
|
| @@ -1,264 +0,0 @@
|
| -// Copyright 2015 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "content/browser/loader/async_revalidation_driver.h"
|
| -
|
| -#include <utility>
|
| -
|
| -#include "base/callback_helpers.h"
|
| -#include "base/location.h"
|
| -#include "base/logging.h"
|
| -#include "base/memory/ref_counted.h"
|
| -#include "base/metrics/histogram_macros.h"
|
| -#include "base/metrics/sparse_histogram.h"
|
| -#include "base/single_thread_task_runner.h"
|
| -#include "base/threading/thread_task_runner_handle.h"
|
| -#include "base/time/time.h"
|
| -#include "net/base/net_errors.h"
|
| -#include "net/url_request/url_request_status.h"
|
| -
|
| -namespace content {
|
| -
|
| -namespace {
|
| -// This matches the maximum allocation size of AsyncResourceHandler.
|
| -const int kReadBufSize = 32 * 1024;
|
| -
|
| -// The time to wait for a response. Since this includes the time taken to
|
| -// connect, this has been set to match the connect timeout
|
| -// kTransportConnectJobTimeoutInSeconds.
|
| -const int kResponseTimeoutInSeconds = 240; // 4 minutes.
|
| -
|
| -// This value should not be too large, as this request may be tying up a socket
|
| -// that could be used for something better. However, if it is too small, the
|
| -// cache entry will be truncated for no good reason.
|
| -// TODO(ricea): Find a more scientific way to set this timeout.
|
| -const int kReadTimeoutInSeconds = 30;
|
| -} // namespace
|
| -
|
| -AsyncRevalidationDriver::AsyncRevalidationDriver(
|
| - std::unique_ptr<net::URLRequest> request,
|
| - std::unique_ptr<ResourceThrottle> throttle,
|
| - const base::Closure& completion_callback)
|
| - : request_(std::move(request)),
|
| - throttle_(std::move(throttle)),
|
| - completion_callback_(completion_callback),
|
| - weak_ptr_factory_(this) {
|
| - request_->set_delegate(this);
|
| - throttle_->set_delegate(this);
|
| -}
|
| -
|
| -AsyncRevalidationDriver::~AsyncRevalidationDriver() {}
|
| -
|
| -void AsyncRevalidationDriver::StartRequest() {
|
| - // Give the handler a chance to delay the URLRequest from being started.
|
| - bool defer_start = false;
|
| - throttle_->WillStartRequest(&defer_start);
|
| -
|
| - if (defer_start) {
|
| - RecordDefer();
|
| - } else {
|
| - StartRequestInternal();
|
| - }
|
| -}
|
| -
|
| -void AsyncRevalidationDriver::OnReceivedRedirect(
|
| - net::URLRequest* request,
|
| - const net::RedirectInfo& redirect_info,
|
| - bool* defer) {
|
| - DCHECK_EQ(request_.get(), request);
|
| -
|
| - // The async revalidation should not follow redirects, because caching is
|
| - // a property of an individual HTTP resource.
|
| - DVLOG(1) << "OnReceivedRedirect: " << request_->url().spec();
|
| - CancelRequestInternal(net::ERR_ABORTED, RESULT_GOT_REDIRECT);
|
| -}
|
| -
|
| -void AsyncRevalidationDriver::OnAuthRequired(
|
| - net::URLRequest* request,
|
| - net::AuthChallengeInfo* auth_info) {
|
| - DCHECK_EQ(request_.get(), request);
|
| - // This error code doesn't have exactly the right semantics, but it should
|
| - // be sufficient to narrow down the problem in net logs.
|
| - CancelRequestInternal(net::ERR_ACCESS_DENIED, RESULT_AUTH_FAILED);
|
| -}
|
| -
|
| -void AsyncRevalidationDriver::OnResponseStarted(net::URLRequest* request) {
|
| - DCHECK_EQ(request_.get(), request);
|
| -
|
| - DVLOG(1) << "OnResponseStarted: " << request_->url().spec();
|
| -
|
| - // We have the response. No need to wait any longer.
|
| - timer_.Stop();
|
| -
|
| - if (!request_->status().is_success()) {
|
| - UMA_HISTOGRAM_SPARSE_SLOWLY("Net.AsyncRevalidation.ResponseError",
|
| - -request_->status().ToNetError());
|
| - ResponseCompleted(RESULT_NET_ERROR);
|
| - // |this| may be deleted after this point.
|
| - return;
|
| - }
|
| -
|
| - const net::HttpResponseInfo& response_info = request_->response_info();
|
| - if (!response_info.response_time.is_null() && response_info.was_cached) {
|
| - // The cached entry was revalidated. No need to read it in.
|
| - ResponseCompleted(RESULT_REVALIDATED);
|
| - // |this| may be deleted after this point.
|
| - return;
|
| - }
|
| -
|
| - bool defer = false;
|
| - throttle_->WillProcessResponse(&defer);
|
| - DCHECK(!defer);
|
| -
|
| - // Set up the timer for reading the body. This use of base::Unretained() is
|
| - // guaranteed safe by the semantics of base::OneShotTimer.
|
| - timer_.Start(FROM_HERE, base::TimeDelta::FromSeconds(kReadTimeoutInSeconds),
|
| - base::Bind(&AsyncRevalidationDriver::OnTimeout,
|
| - base::Unretained(this), RESULT_BODY_TIMEOUT));
|
| - StartReading(false); // Read the first chunk.
|
| -}
|
| -
|
| -void AsyncRevalidationDriver::OnReadCompleted(net::URLRequest* request,
|
| - int bytes_read) {
|
| - // request_ could be NULL if a timeout happened while OnReadCompleted() was
|
| - // queued to run asynchronously.
|
| - if (!request_)
|
| - return;
|
| - DCHECK_EQ(request_.get(), request);
|
| - DCHECK(!is_deferred_);
|
| - DVLOG(1) << "OnReadCompleted: \"" << request_->url().spec() << "\""
|
| - << " bytes_read = " << bytes_read;
|
| -
|
| - // bytes_read == 0 is EOF.
|
| - if (bytes_read == 0) {
|
| - ResponseCompleted(RESULT_LOADED);
|
| - return;
|
| - }
|
| - // bytes_read == -1 is an error.
|
| - if (bytes_read == -1 || !request_->status().is_success()) {
|
| - UMA_HISTOGRAM_SPARSE_SLOWLY("Net.AsyncRevalidation.ReadError",
|
| - -request_->status().ToNetError());
|
| - ResponseCompleted(RESULT_READ_ERROR);
|
| - // |this| may be deleted after this point.
|
| - return;
|
| - }
|
| -
|
| - DCHECK_GT(bytes_read, 0);
|
| - StartReading(true); // Read the next chunk.
|
| -}
|
| -
|
| -void AsyncRevalidationDriver::Resume() {
|
| - DCHECK(is_deferred_);
|
| - DCHECK(request_);
|
| - is_deferred_ = false;
|
| - request_->LogUnblocked();
|
| - StartRequestInternal();
|
| -}
|
| -
|
| -void AsyncRevalidationDriver::Cancel() {
|
| - NOTREACHED();
|
| -}
|
| -
|
| -void AsyncRevalidationDriver::CancelAndIgnore() {
|
| - NOTREACHED();
|
| -}
|
| -
|
| -void AsyncRevalidationDriver::CancelWithError(int error_code) {
|
| - NOTREACHED();
|
| -}
|
| -
|
| -void AsyncRevalidationDriver::StartRequestInternal() {
|
| - DCHECK(request_);
|
| - DCHECK(!request_->is_pending());
|
| -
|
| - // Start the response timer. This use of base::Unretained() is guaranteed safe
|
| - // by the semantics of base::OneShotTimer.
|
| - timer_.Start(FROM_HERE,
|
| - base::TimeDelta::FromSeconds(kResponseTimeoutInSeconds),
|
| - base::Bind(&AsyncRevalidationDriver::OnTimeout,
|
| - base::Unretained(this), RESULT_RESPONSE_TIMEOUT));
|
| - request_->Start();
|
| -}
|
| -
|
| -void AsyncRevalidationDriver::CancelRequestInternal(
|
| - int error,
|
| - AsyncRevalidationResult result) {
|
| - DVLOG(1) << "CancelRequestInternal: " << request_->url().spec();
|
| -
|
| - // Set the error code since this will be reported to the NetworkDelegate and
|
| - // recorded in the NetLog.
|
| - request_->CancelWithError(error);
|
| -
|
| - // The ResourceScheduler needs to be able to examine the request when the
|
| - // ResourceThrottle is destroyed, so delete it first.
|
| - throttle_.reset();
|
| -
|
| - // Destroy the request so that it doesn't try to send an asynchronous
|
| - // notification of completion.
|
| - request_.reset();
|
| -
|
| - // Cancel timer to prevent OnTimeout() being called.
|
| - timer_.Stop();
|
| -
|
| - ResponseCompleted(result);
|
| - // |this| may deleted after this point.
|
| -}
|
| -
|
| -void AsyncRevalidationDriver::StartReading(bool is_continuation) {
|
| - int bytes_read = 0;
|
| - ReadMore(&bytes_read);
|
| -
|
| - // If IO is pending, wait for the URLRequest to call OnReadCompleted.
|
| - if (request_->status().is_io_pending())
|
| - return;
|
| -
|
| - if (!is_continuation || bytes_read <= 0) {
|
| - OnReadCompleted(request_.get(), bytes_read);
|
| - } else {
|
| - // Else, trigger OnReadCompleted asynchronously to avoid starving the IO
|
| - // thread in case the URLRequest can provide data synchronously.
|
| - scoped_refptr<base::SingleThreadTaskRunner> single_thread_task_runner =
|
| - base::ThreadTaskRunnerHandle::Get();
|
| - single_thread_task_runner->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&AsyncRevalidationDriver::OnReadCompleted,
|
| - weak_ptr_factory_.GetWeakPtr(), request_.get(), bytes_read));
|
| - }
|
| -}
|
| -
|
| -void AsyncRevalidationDriver::ReadMore(int* bytes_read) {
|
| - DCHECK(!is_deferred_);
|
| -
|
| - if (!read_buffer_)
|
| - read_buffer_ = new net::IOBuffer(kReadBufSize);
|
| -
|
| - timer_.Reset();
|
| - request_->Read(read_buffer_.get(), kReadBufSize, bytes_read);
|
| -
|
| - // No need to check the return value here as we'll detect errors by
|
| - // inspecting the URLRequest's status.
|
| -}
|
| -
|
| -void AsyncRevalidationDriver::ResponseCompleted(
|
| - AsyncRevalidationResult result) {
|
| - DVLOG(1) << "ResponseCompleted: "
|
| - << (request_ ? request_->url().spec() : "(request deleted)")
|
| - << "result = " << result;
|
| - UMA_HISTOGRAM_ENUMERATION("Net.AsyncRevalidation.Result", result, RESULT_MAX);
|
| - DCHECK(!completion_callback_.is_null());
|
| - base::ResetAndReturn(&completion_callback_).Run();
|
| - // |this| may be deleted after this point.
|
| -}
|
| -
|
| -void AsyncRevalidationDriver::OnTimeout(AsyncRevalidationResult result) {
|
| - CancelRequestInternal(net::ERR_TIMED_OUT, result);
|
| -}
|
| -
|
| -void AsyncRevalidationDriver::RecordDefer() {
|
| - request_->LogBlockedBy(throttle_->GetNameForLogging());
|
| - DCHECK(!is_deferred_);
|
| - is_deferred_ = true;
|
| -}
|
| -
|
| -} // namespace content
|
|
|