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::WillStartRequest(bool* defer) { 31 ProcessDownloadRequest(); 32 } 33 34 void InterceptDownloadResourceThrottle::WillProcessResponse(bool* defer) { 35 ProcessDownloadRequest(); 36 } 37 38 const char* InterceptDownloadResourceThrottle::GetNameForLogging() const { 39 return "InterceptDownloadResourceThrottle"; 40 } 41 42 void InterceptDownloadResourceThrottle::ProcessDownloadRequest() { 43 if (request_->method() != net::HttpRequestHeaders::kGetMethod) 44 return; 45 46 // In general, if the request uses HTTP authorization, either with the origin 47 // or a proxy, then the network stack should handle the download. The one 48 // exception is a request that is fetched via the Chrome Proxy and does not 49 // authenticate with the origin. 50 if (request_->response_info().did_use_http_auth) { 51 #if defined(SPDY_PROXY_AUTH_ORIGIN) 52 net::HttpRequestHeaders headers; 53 request_->GetFullRequestHeaders(&headers); 54 if (headers.HasHeader(net::HttpRequestHeaders::kAuthorization) || 55 !(request_->response_info().headers && 56 data_reduction_proxy::HasDataReductionProxyViaHeader( 57 request_->response_info().headers))) { 58 return; 59 } 60 #else 61 return; 62 #endif 63 } 64 65 if (request_->url_chain().empty()) 66 return; 67 68 GURL url = request_->url_chain().back(); 69 if (!url.SchemeIsHTTPOrHTTPS()) 70 return; 71 72 content::DownloadControllerAndroid::Get()->CreateGETDownload( 73 render_process_id_, render_view_id_, request_id_); 74 controller()->Cancel(); 75 } 76 77 } // namespace chrome 78