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