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
14namespace chrome {
15
16InterceptDownloadResourceThrottle::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
27InterceptDownloadResourceThrottle::~InterceptDownloadResourceThrottle() {
28}
29
30void InterceptDownloadResourceThrottle::WillProcessResponse(bool* defer) {
31  ProcessDownloadRequest();
32}
33
34const char* InterceptDownloadResourceThrottle::GetNameForLogging() const {
35  return "InterceptDownloadResourceThrottle";
36}
37
38void 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