Home | History | Annotate | Download | only in android
      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
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/android/intercept_download_resource_throttle.h"
      6 
      7 #include "components/data_reduction_proxy/common/data_reduction_proxy_headers.h"
      8 #include "content/public/browser/android/download_controller_android.h"
      9 #include "content/public/browser/resource_controller.h"
     10 #include "net/http/http_request_headers.h"
     11 #include "net/http/http_response_headers.h"
     12 #include "net/url_request/url_request.h"
     13 
     14 namespace chrome {
     15 
     16 InterceptDownloadResourceThrottle::InterceptDownloadResourceThrottle(
     17     net::URLRequest* request,
     18     int render_process_id,
     19     int render_view_id,
     20     int request_id)
     21     : request_(request),
     22       render_process_id_(render_process_id),
     23       render_view_id_(render_view_id),
     24       request_id_(request_id) {
     25 }
     26 
     27 InterceptDownloadResourceThrottle::~InterceptDownloadResourceThrottle() {
     28 }
     29 
     30 void InterceptDownloadResourceThrottle::WillProcessResponse(bool* defer) {
     31   ProcessDownloadRequest();
     32 }
     33 
     34 const char* InterceptDownloadResourceThrottle::GetNameForLogging() const {
     35   return "InterceptDownloadResourceThrottle";
     36 }
     37 
     38 void InterceptDownloadResourceThrottle::ProcessDownloadRequest() {
     39   if (request_->url_chain().empty())
     40     return;
     41 
     42   GURL url = request_->url_chain().back();
     43   if (!url.SchemeIsHTTPOrHTTPS())
     44     return;
     45 
     46   if (request_->method() != net::HttpRequestHeaders::kGetMethod)
     47     return;
     48 
     49   net::HttpRequestHeaders headers;
     50   if (!request_->GetFullRequestHeaders(&headers))
     51     return;
     52 
     53   // In general, if the request uses HTTP authorization, either with the origin
     54   // or a proxy, then the network stack should handle the download. The one
     55   // exception is a request that is fetched via the Chrome Proxy and does not
     56   // authenticate with the origin.
     57   if (request_->response_info().did_use_http_auth) {
     58     if (headers.HasHeader(net::HttpRequestHeaders::kAuthorization) ||
     59         !(request_->response_info().headers &&
     60             data_reduction_proxy::HasDataReductionProxyViaHeader(
     61                 request_->response_info().headers, NULL))) {
     62       return;
     63     }
     64   }
     65 
     66   content::DownloadControllerAndroid::Get()->CreateGETDownload(
     67       render_process_id_, render_view_id_, request_id_);
     68   controller()->Cancel();
     69 }
     70 
     71 }  // namespace chrome
     72