| Index: components/data_reduction_proxy/content/browser/data_reduction_proxy_resource_throttle.cc
|
| diff --git a/components/data_reduction_proxy/content/browser/data_reduction_proxy_resource_throttle.cc b/components/data_reduction_proxy/content/browser/data_reduction_proxy_resource_throttle.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..2eaa6cdf95894be03bfc54f05c467421b88067df
|
| --- /dev/null
|
| +++ b/components/data_reduction_proxy/content/browser/data_reduction_proxy_resource_throttle.cc
|
| @@ -0,0 +1,135 @@
|
| +// Copyright 2014 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 "components/data_reduction_proxy/content/browser/data_reduction_proxy_resource_throttle.h"
|
| +
|
| +#include "components/data_reduction_proxy/content/browser/data_reduction_proxy_ui_service.h"
|
| +#include "components/data_reduction_proxy/core/common/data_reduction_proxy_params.h"
|
| +#include "content/public/browser/browser_thread.h"
|
| +#include "content/public/browser/resource_controller.h"
|
| +#include "content/public/browser/resource_request_info.h"
|
| +#include "net/base/load_flags.h"
|
| +#include "net/http/http_response_headers.h"
|
| +#include "net/url_request/url_request.h"
|
| +
|
| +namespace data_reduction_proxy {
|
| +
|
| +namespace {
|
| +
|
| +const char kResouceThrottleLogName[] = "DataReductionProxyResourceThrottle";
|
| +
|
| +} // namespace
|
| +
|
| +DataReductionProxyResourceThrottle::DataReductionProxyResourceThrottle(
|
| + const net::URLRequest* request,
|
| + content::ResourceType resource_type,
|
| + const DataReductionProxyUIService* ui_service,
|
| + const DataReductionProxyParams* params)
|
| + : state_(NOT_BYPASSED),
|
| + request_(request),
|
| + ui_service_(ui_service),
|
| + params_(params),
|
| + is_subresource_(resource_type != content::RESOURCE_TYPE_MAIN_FRAME) {
|
| + DCHECK(request);
|
| + DCHECK(ui_service);
|
| + DCHECK(params);
|
| +}
|
| +
|
| +DataReductionProxyResourceThrottle::~DataReductionProxyResourceThrottle() {
|
| +}
|
| +
|
| +// Displays an interstitial when the proxy will not be used for a request
|
| +// because it isn't configured.
|
| +void DataReductionProxyResourceThrottle::WillStartUsingNetwork(bool* defer) {
|
| + DCHECK(state_ == NOT_BYPASSED);
|
| + if (!params_->AreDataReductionProxiesBypassed(*request_, NULL))
|
| + return;
|
| + if (request_->load_flags() & net::LOAD_PREFETCH) {
|
| + // Don't prefetch resources that bypass, disallow them.
|
| + controller()->Cancel();
|
| + return;
|
| + }
|
| + // Do not display the interstitial if bypassed by local rules.
|
| + if (params_->IsBypassedByDataReductionProxyLocalRules(
|
| + *request_, ui_service_->data_reduction_proxy_config())) {
|
| + state_ = LOCAL_BYPASS;
|
| + return;
|
| + }
|
| + DisplayBlockingPage(defer);
|
| +}
|
| +
|
| +// Displays an intersitital when the Data Reduction Proxy explicitly returns a
|
| +// response that triggers a bypass.
|
| +void DataReductionProxyResourceThrottle::WillRedirectRequest(
|
| + const GURL& new_url,
|
| + bool* defer) {
|
| + // If the interstitial has already been shown, do not show it again. The
|
| + // LOAD_BYPASS_PROXY flag makes it so that proxiesare not resolved. This
|
| + // override is used when downloading PAC files. If the request does not have
|
| + // the LOAD_BYPASS_PROXY flag, do not show the interstitial.
|
| + if (state_ != NOT_BYPASSED ||
|
| + !(request_->load_flags() & net::LOAD_BYPASS_PROXY)) {
|
| + return;
|
| + }
|
| + DisplayBlockingPage(defer);
|
| +}
|
| +
|
| +// Already checked if the proxy is bypassed by local rules and if the Data
|
| +// Reduction Proxy sent an explicit bypass. If the response isn't from the Data
|
| +// Reduction Proxy and the scheme type can be proxied by the Data Reduction
|
| +// Proxy there is connection error, display the interstitial.
|
| +void DataReductionProxyResourceThrottle::WillProcessResponse(bool* defer) {
|
| + if (state_ != NOT_BYPASSED)
|
| + return;
|
| + if (params_->IsDataReductionProxy(request_->proxy_server(), NULL) ||
|
| + !DataReductionProxyParams::CanProxyURLScheme(request_->url())) {
|
| + return;
|
| + }
|
| + DisplayBlockingPage(defer);
|
| +}
|
| +
|
| +const char* DataReductionProxyResourceThrottle::GetNameForLogging() const {
|
| + return kResouceThrottleLogName;
|
| +}
|
| +
|
| +// static
|
| +void DataReductionProxyResourceThrottle::StartDisplayingBlockingPage(
|
| + scoped_refptr<DataReductionProxyUIManager> ui_manager,
|
| + const DataReductionProxyUIManager::BypassResource& resource) {
|
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
|
| + ui_manager->DisplayBlockingPage(resource);
|
| +}
|
| +
|
| +void DataReductionProxyResourceThrottle::DisplayBlockingPage(bool* defer) {
|
| + const content::ResourceRequestInfo* info =
|
| + content::ResourceRequestInfo::ForRequest(request_);
|
| + DCHECK(info);
|
| +
|
| + state_ = REMOTE_BYPASS;
|
| + *defer = true;
|
| +
|
| + DataReductionProxyUIManager::BypassResource resource;
|
| + resource.url = request_->url();
|
| + resource.is_subresource = is_subresource_;
|
| + resource.callback = base::Bind(
|
| + &DataReductionProxyResourceThrottle::OnBlockingPageComplete, AsWeakPtr());
|
| + resource.render_process_host_id = info->GetChildID();
|
| + resource.render_view_id = info->GetRouteID();
|
| +
|
| + content::BrowserThread::PostTask(
|
| + content::BrowserThread::UI, FROM_HERE,
|
| + base::Bind(
|
| + &DataReductionProxyResourceThrottle::StartDisplayingBlockingPage,
|
| + ui_service_->ui_manager(), resource));
|
| +}
|
| +
|
| +void DataReductionProxyResourceThrottle::OnBlockingPageComplete(bool proceed) {
|
| + state_ = NOT_BYPASSED;
|
| + if (proceed)
|
| + controller()->Resume();
|
| + else
|
| + controller()->Cancel();
|
| +}
|
| +
|
| +} // namespace data_reduction_proxy
|
|
|