1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/android/intercept_download_resource_throttle.h" 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/data_reduction_proxy/common/data_reduction_proxy_headers.h" 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/android/download_controller_android.h" 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/resource_controller.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/http/http_request_headers.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/http/http_response_headers.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/url_request/url_request.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace chrome { 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)InterceptDownloadResourceThrottle::InterceptDownloadResourceThrottle( 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::URLRequest* request, 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int render_process_id, 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int render_view_id, 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int request_id) 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : request_(request), 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) render_process_id_(render_process_id), 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) render_view_id_(render_view_id), 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) request_id_(request_id) { 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)InterceptDownloadResourceThrottle::~InterceptDownloadResourceThrottle() { 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void InterceptDownloadResourceThrottle::WillProcessResponse(bool* defer) { 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ProcessDownloadRequest(); 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const char* InterceptDownloadResourceThrottle::GetNameForLogging() const { 35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return "InterceptDownloadResourceThrottle"; 36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void InterceptDownloadResourceThrottle::ProcessDownloadRequest() { 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (request_->url_chain().empty()) 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GURL url = request_->url_chain().back(); 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!url.SchemeIsHTTPOrHTTPS()) 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (request_->method() != net::HttpRequestHeaders::kGetMethod) 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::HttpRequestHeaders headers; 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!request_->GetFullRequestHeaders(&headers)) 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // In general, if the request uses HTTP authorization, either with the origin 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // or a proxy, then the network stack should handle the download. The one 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // exception is a request that is fetched via the Chrome Proxy and does not 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // authenticate with the origin. 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (request_->response_info().did_use_http_auth) { 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (headers.HasHeader(net::HttpRequestHeaders::kAuthorization) || 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !(request_->response_info().headers && 60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data_reduction_proxy::HasDataReductionProxyViaHeader( 616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) request_->response_info().headers, NULL))) { 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::DownloadControllerAndroid::Get()->CreateGETDownload( 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) render_process_id_, render_view_id_, request_id_); 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controller()->Cancel(); 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} // namespace chrome 72