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