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