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