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 14namespace chrome { 15 16InterceptDownloadResourceThrottle::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 27InterceptDownloadResourceThrottle::~InterceptDownloadResourceThrottle() { 28} 29 30void InterceptDownloadResourceThrottle::WillProcessResponse(bool* defer) { 31 ProcessDownloadRequest(); 32} 33 34const char* InterceptDownloadResourceThrottle::GetNameForLogging() const { 35 return "InterceptDownloadResourceThrottle"; 36} 37 38void 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