1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// found in the LICENSE file.
4010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "components/data_reduction_proxy/browser/data_reduction_proxy_auth_request_handler.h"
6010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/bind.h"
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/command_line.h"
96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/single_thread_task_runner.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/strings/string_split.h"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/strings/stringprintf.h"
12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/strings/utf_string_conversions.h"
13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/time/time.h"
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/data_reduction_proxy/browser/data_reduction_proxy_params.h"
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/data_reduction_proxy/browser/data_reduction_proxy_protocol.h"
16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "components/data_reduction_proxy/browser/data_reduction_proxy_settings.h"
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/data_reduction_proxy/common/data_reduction_proxy_headers.h"
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/data_reduction_proxy/common/data_reduction_proxy_switches.h"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/data_reduction_proxy/common/version.h"
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "crypto/random.h"
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/base/host_port_pair.h"
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/proxy/proxy_server.h"
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/url_request/url_request.h"
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "url/gurl.h"
25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace data_reduction_proxy {
27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// The empty version for the authentication protocol. Currently used by
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Android webview.
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(OS_ANDROID)
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kAndroidWebViewProtocolVersion[] = "";
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// The clients supported by the data reduction proxy.
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kClientAndroidWebview[] = "webview";
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kClientChromeAndroid[] = "android";
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kClientChromeIOS[] = "ios";
38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// static
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool DataReductionProxyAuthRequestHandler::IsKeySetOnCommandLine() {
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const CommandLine& command_line = *CommandLine::ForCurrentProcess();
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return command_line.HasSwitch(
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      data_reduction_proxy::switches::kDataReductionProxyKey);
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DataReductionProxyAuthRequestHandler::DataReductionProxyAuthRequestHandler(
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const std::string& client,
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DataReductionProxyParams* params,
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    scoped_refptr<base::SingleThreadTaskRunner> network_task_runner)
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : client_(client),
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      data_reduction_proxy_params_(params),
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      network_task_runner_(network_task_runner) {
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GetChromiumBuildAndPatch(ChromiumVersion(), &build_number_, &patch_number_);
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Init();
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciDataReductionProxyAuthRequestHandler::DataReductionProxyAuthRequestHandler(
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::string& client,
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const std::string& version,
606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    DataReductionProxyParams* params,
616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    scoped_refptr<base::SingleThreadTaskRunner> network_task_runner)
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : client_(client),
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      data_reduction_proxy_params_(params),
646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      network_task_runner_(network_task_runner) {
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GetChromiumBuildAndPatch(version, &build_number_, &patch_number_);
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  Init();
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistd::string DataReductionProxyAuthRequestHandler::ChromiumVersion() const {
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(PRODUCT_VERSION)
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return PRODUCT_VERSION;
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return std::string();
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid DataReductionProxyAuthRequestHandler::GetChromiumBuildAndPatch(
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::string& version,
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    std::string* build,
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    std::string* patch) const {
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<std::string> version_parts;
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::SplitString(version, '.', &version_parts);
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (version_parts.size() != 4)
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  *build = version_parts[2];
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  *patch = version_parts[3];
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid DataReductionProxyAuthRequestHandler::Init() {
9134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  InitAuthentication(GetDefaultKey());
92010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
95010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)DataReductionProxyAuthRequestHandler::~DataReductionProxyAuthRequestHandler() {
96010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
97010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// static
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbase::string16 DataReductionProxyAuthRequestHandler::AuthHashForSalt(
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    int64 salt,
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string& key) {
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::string salted_key =
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::StringPrintf("%lld%s%lld",
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                         static_cast<long long>(salt),
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                         key.c_str(),
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                         static_cast<long long>(salt));
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return base::UTF8ToUTF16(base::MD5String(salted_key));
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbase::Time DataReductionProxyAuthRequestHandler::Now() const {
113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return base::Time::Now();
114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
116116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid DataReductionProxyAuthRequestHandler::RandBytes(
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    void* output, size_t length) {
118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  crypto::RandBytes(output, length);
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid DataReductionProxyAuthRequestHandler::MaybeAddRequestHeader(
122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    net::URLRequest* request,
123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const net::ProxyServer& proxy_server,
124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    net::HttpRequestHeaders* request_headers) {
1256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK(network_task_runner_->BelongsToCurrentThread());
126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!proxy_server.is_valid())
127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (proxy_server.is_direct())
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MaybeAddRequestHeaderImpl(proxy_server.host_port_pair(),
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            false,
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            request_headers);
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid DataReductionProxyAuthRequestHandler::MaybeAddProxyTunnelRequestHandler(
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const net::HostPortPair& proxy_server,
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    net::HttpRequestHeaders* request_headers) {
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(network_task_runner_->BelongsToCurrentThread());
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MaybeAddRequestHeaderImpl(proxy_server, true, request_headers);
140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
142116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid DataReductionProxyAuthRequestHandler::AddAuthorizationHeader(
143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    net::HttpRequestHeaders* headers) {
1446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  base::Time now = Now();
1456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (now - last_update_time_ > base::TimeDelta::FromHours(24)) {
1466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    last_update_time_ = now;
1476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ComputeCredentials(last_update_time_, &session_, &credentials_);
1486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const char kChromeProxyHeader[] = "Chrome-Proxy";
150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::string header_value;
151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (headers->HasHeader(kChromeProxyHeader)) {
152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    headers->GetHeader(kChromeProxyHeader, &header_value);
153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    headers->RemoveHeader(kChromeProxyHeader);
154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    header_value += ", ";
155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  header_value +=
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "ps=" + session_ + ", sid=" + credentials_;
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!build_number_.empty() && !patch_number_.empty())
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    header_value += ", b=" + build_number_ + ", p=" + patch_number_;
160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!client_.empty())
161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    header_value += ", c=" + client_;
162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  headers->SetHeader(kChromeProxyHeader, header_value);
163010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
164010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void DataReductionProxyAuthRequestHandler::ComputeCredentials(
1666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const base::Time& now,
1676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    std::string* session,
1686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    std::string* credentials) {
1696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK(session);
1706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK(credentials);
171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int64 timestamp =
1726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      (now - base::Time::UnixEpoch()).InMilliseconds() / 1000;
173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int32 rand[3];
175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  RandBytes(rand, 3 * sizeof(rand[0]));
1766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  *session = base::StringPrintf("%lld-%u-%u-%u",
1776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                static_cast<long long>(timestamp),
1786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                rand[0],
1796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                rand[1],
1806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                rand[2]);
1816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  *credentials = base::UTF16ToUTF8(AuthHashForSalt(timestamp, key_));
1826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DVLOG(1) << "session: [" << *session << "] "
1846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)           << "password: [" << *credentials  << "]";
1856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void DataReductionProxyAuthRequestHandler::InitAuthentication(
1886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const std::string& key) {
18934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  if (!network_task_runner_->BelongsToCurrentThread()) {
19034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    network_task_runner_->PostTask(
19134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)        FROM_HERE,
19234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)        base::Bind(&DataReductionProxyAuthRequestHandler::InitAuthentication,
19334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)                   base::Unretained(this),
19434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)                   key));
19534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    return;
19634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  }
19734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)
19834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  if (key.empty())
19934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    return;
20034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)
2016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  key_ = key;
2026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  last_update_time_ = Now();
2036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ComputeCredentials(last_update_time_, &session_, &credentials_);
204010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
206116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstd::string DataReductionProxyAuthRequestHandler::GetDefaultKey() const {
207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const CommandLine& command_line = *CommandLine::ForCurrentProcess();
208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::string key =
209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    command_line.GetSwitchValueASCII(switches::kDataReductionProxyKey);
210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(SPDY_PROXY_AUTH_VALUE)
211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (key.empty())
212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    key = SPDY_PROXY_AUTH_VALUE;
213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return key;
215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
216010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid DataReductionProxyAuthRequestHandler::MaybeAddRequestHeaderImpl(
2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const net::HostPortPair& proxy_server,
2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bool expect_ssl,
2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    net::HttpRequestHeaders* request_headers) {
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (proxy_server.IsEmpty())
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (data_reduction_proxy_params_ &&
2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      data_reduction_proxy_params_->IsDataReductionProxy(proxy_server, NULL) &&
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      net::HostPortPair::FromURL(
2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          data_reduction_proxy_params_->ssl_origin()).Equals(
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              proxy_server) == expect_ssl) {
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    AddAuthorizationHeader(request_headers);
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
232010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}  // namespace data_reduction_proxy
233