Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(188)

Side by Side Diff: chrome/browser/net/spdyproxy/data_reduction_proxy_settings.cc

Issue 30883003: Simple fallback implementation. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@patched
Patch Set: Unit tests passing, feedback applied. Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/net/spdyproxy/data_reduction_proxy_settings.h" 5 #include "chrome/browser/net/spdyproxy/data_reduction_proxy_settings.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/metrics/field_trial.h" 9 #include "base/metrics/field_trial.h"
10 #include "base/metrics/histogram.h" 10 #include "base/metrics/histogram.h"
11 #include "base/prefs/pref_member.h" 11 #include "base/prefs/pref_member.h"
12 #include "base/prefs/pref_service.h" 12 #include "base/prefs/pref_service.h"
13 #include "base/strings/string_number_conversions.h" 13 #include "base/strings/string_number_conversions.h"
14 #include "base/strings/string_util.h" 14 #include "base/strings/string_util.h"
15 #include "base/strings/stringprintf.h" 15 #include "base/strings/stringprintf.h"
16 #include "base/strings/utf_string_conversions.h" 16 #include "base/strings/utf_string_conversions.h"
17 #include "chrome/browser/browser_process.h" 17 #include "chrome/browser/browser_process.h"
18 #include "chrome/browser/prefs/proxy_prefs.h" 18 #include "chrome/browser/prefs/proxy_prefs.h"
19 #include "chrome/browser/prefs/scoped_user_pref_update.h" 19 #include "chrome/browser/prefs/scoped_user_pref_update.h"
20 #include "chrome/browser/profiles/profile.h" 20 #include "chrome/browser/profiles/profile.h"
21 #include "chrome/browser/profiles/profile_manager.h" 21 #include "chrome/browser/profiles/profile_manager.h"
22 #include "chrome/common/chrome_switches.h" 22 #include "chrome/common/chrome_switches.h"
23 #include "chrome/common/pref_names.h" 23 #include "chrome/common/pref_names.h"
24 #include "crypto/random.h"
25 #include "net/base/auth.h"
24 #include "net/base/host_port_pair.h" 26 #include "net/base/host_port_pair.h"
25 #include "net/base/load_flags.h" 27 #include "net/base/load_flags.h"
26 #include "net/base/net_errors.h" 28 #include "net/base/net_errors.h"
29 #include "net/http/http_auth.h"
30 #include "net/http/http_network_session.h"
27 #include "net/url_request/url_fetcher.h" 31 #include "net/url_request/url_fetcher.h"
28 #include "net/url_request/url_fetcher_delegate.h" 32 #include "net/url_request/url_fetcher_delegate.h"
29 #include "net/url_request/url_request_status.h" 33 #include "net/url_request/url_request_status.h"
30 #include "url/gurl.h" 34 #include "url/gurl.h"
31 35
32 using base::FieldTrialList; 36 using base::FieldTrialList;
33 using base::StringPrintf; 37 using base::StringPrintf;
34 38
35 namespace { 39 namespace {
36 40
37 // Key of the UMA DataReductionProxy.StartupState histogram. 41 // Key of the UMA DataReductionProxy.StartupState histogram.
38 const char kUMAProxyStartupStateHistogram[] = 42 const char kUMAProxyStartupStateHistogram[] =
39 "DataReductionProxy.StartupState"; 43 "DataReductionProxy.StartupState";
40 // Values of the UMA DataReductionProxy.StartupState histogram. 44 // Values of the UMA DataReductionProxy.StartupState histogram.
41 enum ProxyStartupState { 45 enum ProxyStartupState {
42 PROXY_NOT_AVAILABLE = 0, 46 PROXY_NOT_AVAILABLE = 0,
43 PROXY_DISABLED, 47 PROXY_DISABLED,
44 PROXY_ENABLED, 48 PROXY_ENABLED,
45 PROXY_STARTUP_STATE_COUNT, 49 PROXY_STARTUP_STATE_COUNT,
46 }; 50 };
47 51
48 const char kEnabled[] = "Enabled"; 52 const char kEnabled[] = "Enabled";
49 53
54 // TODO(marq): factor this string out into a constant here and in
bengr 2013/10/22 17:49:30 Factor
marq (ping after 24h) 2013/10/22 21:18:01 Done.
55 // http_auth_handler_spdyproxy.
56 const char kAuthenticationRealmName[] = "SpdyProxy";
57
50 int64 GetInt64PrefValue(const ListValue& list_value, size_t index) { 58 int64 GetInt64PrefValue(const ListValue& list_value, size_t index) {
51 int64 val = 0; 59 int64 val = 0;
52 std::string pref_value; 60 std::string pref_value;
53 bool rv = list_value.GetString(index, &pref_value); 61 bool rv = list_value.GetString(index, &pref_value);
54 DCHECK(rv); 62 DCHECK(rv);
55 if (rv) { 63 if (rv) {
56 rv = base::StringToInt64(pref_value, &val); 64 rv = base::StringToInt64(pref_value, &val);
57 DCHECK(rv); 65 DCHECK(rv);
58 } 66 }
59 return val; 67 return val;
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
100 RecordDataReductionInit(); 108 RecordDataReductionInit();
101 if (spdy_proxy_auth_enabled_.GetValue() || 109 if (spdy_proxy_auth_enabled_.GetValue() ||
102 command_line.HasSwitch(switches::kEnableSpdyProxyAuth)) { 110 command_line.HasSwitch(switches::kEnableSpdyProxyAuth)) {
103 MaybeActivateDataReductionProxy(true); 111 MaybeActivateDataReductionProxy(true);
104 } else { 112 } else {
105 // This is logged so we can use this information in user feedback. 113 // This is logged so we can use this information in user feedback.
106 LogProxyState(false /* enabled */, true /* at startup */); 114 LogProxyState(false /* enabled */, true /* at startup */);
107 } 115 }
108 } 116 }
109 117
118 void DataReductionProxySettings::InitDataReductionProxySession(
119 net::HttpNetworkSession* session) {
bengr 2013/10/22 17:49:30 indent +2
marq (ping after 24h) 2013/10/22 21:18:01 Done.
120 // This is a no-op unless the authentication params are compiled in.
bengr 2013/10/22 17:49:30 parameters
marq (ping after 24h) 2013/10/22 21:18:01 Done.
121 // (even though values for them may be specified on the command line).
bengr 2013/10/22 17:49:30 It's probably worth saying that when specified in
marq (ping after 24h) 2013/10/22 21:18:01 Done.
122 #if defined(SPDY_PROXY_AUTH_ORIGIN) && defined(SPDY_PROXY_AUTH_VALUE)
123 DCHECK(session);
124 int64 timestamp =
125 (base::Time::Now() - base::Time::UnixEpoch()).InMilliseconds() / 1000;
bengr 2013/10/22 17:49:30 indent -1
marq (ping after 24h) 2013/10/22 21:18:01 Done.
126
127 DataReductionProxyList proxies = GetDataReductionProxies();
128 for (DataReductionProxyList::iterator it = proxies.begin();
129 it != proxies.end(); ++it) {
130 net::HostPortPair auth_origin = *it;
bengr 2013/10/22 17:49:30 const ref?
marq (ping after 24h) 2013/10/22 21:18:01 Yes, but the code's changed slightly.
131 int32 rand1, rand2, rand3;
132 crypto::RandBytes(&rand1, sizeof(rand1));
133 crypto::RandBytes(&rand2, sizeof(rand2));
134 crypto::RandBytes(&rand3, sizeof(rand3));
135
136 std::string realm =
137 base::StringPrintf("%s%lld", kAuthenticationRealmName, timestamp);
138 std::string challenge = base::StringPrintf(
139 "%s realm=\"%s\", ps=\"%lld-%u-%u-%u\"",
140 kAuthenticationRealmName, realm.data(), timestamp, rand1, rand2, rand3);
141 base::string16 password = AuthHashForSalt(timestamp);
142
143 DVLOG(1) << "origin: [" << auth_origin.ToString() << "] realm: [" << realm
144 << "] challenge: [" << challenge << "] password: [" << password << "]";
145
146 net::AuthCredentials credentials(base::string16(), password);
147 session->http_auth_cache()->Add(GURL(auth_origin.ToString()), realm,
148 net::HttpAuth::AUTH_SCHEME_SPDYPROXY,
149 challenge, credentials, std::string("/"));
150 }
151 #endif // defined(SPDY_PROXY_AUTH_ORIGIN) && defined(SPDY_PROXY_AUTH_VALUE)
152 }
153
110 void DataReductionProxySettings::AddHostPatternToBypass( 154 void DataReductionProxySettings::AddHostPatternToBypass(
111 const std::string& pattern) { 155 const std::string& pattern) {
112 bypass_rules_.push_back(pattern); 156 bypass_rules_.push_back(pattern);
113 } 157 }
114 158
115 void DataReductionProxySettings::AddURLPatternToBypass( 159 void DataReductionProxySettings::AddURLPatternToBypass(
116 const std::string& pattern) { 160 const std::string& pattern) {
117 size_t pos = pattern.find("/"); 161 size_t pos = pattern.find("/");
118 if (pattern.find("/", pos + 1) == pos + 1) 162 if (pattern.find("/", pos + 1) == pos + 1)
119 pos = pattern.find("/", pos + 2); 163 pos = pattern.find("/", pos + 2);
(...skipping 16 matching lines...) Expand all
136 return IsProxyOriginSetOnCommandLine() || 180 return IsProxyOriginSetOnCommandLine() ||
137 (IsDataReductionProxyAllowed() && 181 (IsDataReductionProxyAllowed() &&
138 FieldTrialList::FindFullName("DataCompressionProxyPromoVisibility") == 182 FieldTrialList::FindFullName("DataCompressionProxyPromoVisibility") ==
139 kEnabled); 183 kEnabled);
140 } 184 }
141 185
142 std::string DataReductionProxySettings::GetDataReductionProxyOrigin() { 186 std::string DataReductionProxySettings::GetDataReductionProxyOrigin() {
143 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 187 const CommandLine& command_line = *CommandLine::ForCurrentProcess();
144 if (command_line.HasSwitch(switches::kSpdyProxyAuthOrigin)) 188 if (command_line.HasSwitch(switches::kSpdyProxyAuthOrigin))
145 return command_line.GetSwitchValueASCII(switches::kSpdyProxyAuthOrigin); 189 return command_line.GetSwitchValueASCII(switches::kSpdyProxyAuthOrigin);
146 #if defined(SPDY_PROXY_AUTH_ORIGIN) 190 return GetDefaultProxyHost();
147 return SPDY_PROXY_AUTH_ORIGIN;
148 #else
149 return std::string();
150 #endif
151 } 191 }
152 192
153 std::string DataReductionProxySettings::GetDataReductionProxyAuth() { 193 std::string DataReductionProxySettings::GetDataReductionProxyFallback() {
154 if (!IsDataReductionProxyAllowed()) 194 // Regardless of what else is defined, only return a value if the main proxy
195 // origin is defined.
196 if (GetDataReductionProxyOrigin().empty())
155 return std::string(); 197 return std::string();
156 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 198 const CommandLine& command_line = *CommandLine::ForCurrentProcess();
157 if (command_line.HasSwitch(switches::kSpdyProxyAuthOrigin)) { 199 if (command_line.HasSwitch(switches::kSpdyProxyAuthFallback))
158 // If an origin is provided via a switch, then only consider the value 200 return command_line.GetSwitchValueASCII(switches::kSpdyProxyAuthFallback);
159 // that is provided by a switch. Do not use the preprocessor constant. 201 return GetDefaultFallbackProxyHost();
160 // Don't expose SPDY_PROXY_AUTH_VALUE to a proxy passed in via the command 202 }
161 // line. 203
162 if (command_line.HasSwitch(switches::kSpdyProxyAuthValue)) 204 bool DataReductionProxySettings::IsAcceptableAuthChallenge(
163 return command_line.GetSwitchValueASCII(switches::kSpdyProxyAuthValue); 205 net::AuthChallengeInfo* auth_info) {
164 return std::string(); 206 // Challenge realm must start with the authentication realm name.
207 std::string realm_prefix =
208 auth_info->realm.substr(0, strlen(kAuthenticationRealmName));
209 if (realm_prefix != kAuthenticationRealmName)
210 return false;
211
212 // The challenger must be one of the configured proxies.
213 DataReductionProxyList proxies = GetDataReductionProxies();
214 for (DataReductionProxyList::iterator it = proxies.begin();
215 it != proxies.end(); ++it) {
216 net::HostPortPair origin_host = *it;
217 if (origin_host.Equals(auth_info->challenger))
218 return true;
165 } 219 }
166 #if defined(SPDY_PROXY_AUTH_VALUE) 220 return false;
167 return SPDY_PROXY_AUTH_VALUE; 221 }
168 #else 222
169 return std::string(); 223 base::string16 DataReductionProxySettings::GetTokenForAuthChallenge(
170 #endif 224 net::AuthChallengeInfo* auth_info) {
225 if (auth_info->realm.length() > strlen(kAuthenticationRealmName)) {
226 int64 salt;
227 std::string realm_suffix =
228 auth_info->realm.substr(strlen(kAuthenticationRealmName));
229 if (base::StringToInt64(realm_suffix, &salt)) {
230 return AuthHashForSalt(salt);
231 } else {
232 DVLOG(1) << "Unable to parse realm name " << auth_info->realm
233 << "into an int for salting.";
234 return base::string16();
235 }
236 } else {
237 return base::string16();
238 }
171 } 239 }
172 240
173 bool DataReductionProxySettings::IsDataReductionProxyEnabled() { 241 bool DataReductionProxySettings::IsDataReductionProxyEnabled() {
174 return spdy_proxy_auth_enabled_.GetValue(); 242 return spdy_proxy_auth_enabled_.GetValue();
175 } 243 }
176 244
177 bool DataReductionProxySettings::IsDataReductionProxyManaged() { 245 bool DataReductionProxySettings::IsDataReductionProxyManaged() {
178 return spdy_proxy_auth_enabled_.IsManaged(); 246 return spdy_proxy_auth_enabled_.IsManaged();
179 } 247 }
180 248
249 DataReductionProxySettings::DataReductionProxyList
250 DataReductionProxySettings::GetDataReductionProxies() {
251 DataReductionProxyList proxies;
252 std::string proxy = GetDataReductionProxyOrigin();
253 std::string fallback = GetDataReductionProxyFallback();
254
255 if (!proxy.empty())
256 proxies.push_back(net::HostPortPair::FromURL(GURL(proxy)));
257
258 if (!fallback.empty()) {
259 // Sanity check: fallback isn't the only proxy.
260 DCHECK(!proxies.empty());
261 proxies.push_back(net::HostPortPair::FromURL(GURL(fallback)));
262 }
263
264 return proxies;
265 }
266
181 void DataReductionProxySettings::SetDataReductionProxyEnabled(bool enabled) { 267 void DataReductionProxySettings::SetDataReductionProxyEnabled(bool enabled) {
182 // Prevent configuring the proxy when it is not allowed to be used. 268 // Prevent configuring the proxy when it is not allowed to be used.
183 if (!IsDataReductionProxyAllowed()) 269 if (!IsDataReductionProxyAllowed())
184 return; 270 return;
185 271
186 spdy_proxy_auth_enabled_.SetValue(enabled); 272 spdy_proxy_auth_enabled_.SetValue(enabled);
187 OnProxyEnabledPrefChange(); 273 OnProxyEnabledPrefChange();
188 } 274 }
189 275
190 int64 DataReductionProxySettings::GetDataReductionLastUpdateTime() { 276 int64 DataReductionProxySettings::GetDataReductionLastUpdateTime() {
191 PrefService* local_state = GetLocalStatePrefs(); 277 PrefService* local_state = GetLocalStatePrefs();
192 int64 last_update_internal = 278 int64 last_update_internal =
193 local_state->GetInt64(prefs::kDailyHttpContentLengthLastUpdateDate); 279 local_state->GetInt64(prefs::kDailyHttpContentLengthLastUpdateDate);
194 base::Time last_update = base::Time::FromInternalValue(last_update_internal); 280 base::Time last_update = base::Time::FromInternalValue(last_update_internal);
195 return static_cast<int64>(last_update.ToJsTime()); 281 return static_cast<int64>(last_update.ToJsTime());
196 } 282 }
197 283
198 std::vector<long long> 284 DataReductionProxySettings::ContentLengthList
199 DataReductionProxySettings::GetDailyOriginalContentLengths() { 285 DataReductionProxySettings::GetDailyOriginalContentLengths() {
200 return GetDailyContentLengths(prefs::kDailyHttpOriginalContentLength); 286 return GetDailyContentLengths(prefs::kDailyHttpOriginalContentLength);
201 } 287 }
202 288
203 std::vector<long long> 289 DataReductionProxySettings::ContentLengthList
204 DataReductionProxySettings::GetDailyReceivedContentLengths() { 290 DataReductionProxySettings::GetDailyReceivedContentLengths() {
205 return GetDailyContentLengths(prefs::kDailyHttpReceivedContentLength); 291 return GetDailyContentLengths(prefs::kDailyHttpReceivedContentLength);
206 } 292 }
207 293
208 void DataReductionProxySettings::OnURLFetchComplete( 294 void DataReductionProxySettings::OnURLFetchComplete(
209 const net::URLFetcher* source) { 295 const net::URLFetcher* source) {
210 net::URLRequestStatus status = source->GetStatus(); 296 net::URLRequestStatus status = source->GetStatus();
211 if (status.status() == net::URLRequestStatus::FAILED && 297 if (status.status() == net::URLRequestStatus::FAILED &&
212 status.error() == net::ERR_INTERNET_DISCONNECTED) { 298 status.error() == net::ERR_INTERNET_DISCONNECTED) {
213 return; 299 return;
(...skipping 16 matching lines...) Expand all
230 } 316 }
231 DVLOG(1) << "The data reduction proxy is blocked."; 317 DVLOG(1) << "The data reduction proxy is blocked.";
232 318
233 if (enabled_by_user_ && !disabled_by_carrier_) { 319 if (enabled_by_user_ && !disabled_by_carrier_) {
234 // Disable the proxy. 320 // Disable the proxy.
235 SetProxyConfigs(false, false); 321 SetProxyConfigs(false, false);
236 } 322 }
237 disabled_by_carrier_ = true; 323 disabled_by_carrier_ = true;
238 } 324 }
239 325
240 std::string DataReductionProxySettings::GetDataReductionProxyOriginHostPort() {
241 std::string spdy_proxy = GetDataReductionProxyOrigin();
242 if (spdy_proxy.empty()) {
243 DLOG(ERROR) << "A SPDY proxy has not been set.";
244 return spdy_proxy;
245 }
246 // Remove a trailing slash from the proxy string if one exists as well as
247 // leading HTTPS scheme.
248 return net::HostPortPair::FromURL(GURL(spdy_proxy)).ToString();
249 }
250
251 void DataReductionProxySettings::OnIPAddressChanged() { 326 void DataReductionProxySettings::OnIPAddressChanged() {
252 if (enabled_by_user_) { 327 if (enabled_by_user_) {
253 DCHECK(IsDataReductionProxyAllowed()); 328 DCHECK(IsDataReductionProxyAllowed());
254 ProbeWhetherDataReductionProxyIsAvailable(); 329 ProbeWhetherDataReductionProxyIsAvailable();
255 } 330 }
256 } 331 }
257 332
258 void DataReductionProxySettings::OnProxyEnabledPrefChange() { 333 void DataReductionProxySettings::OnProxyEnabledPrefChange() {
259 if (!IsDataReductionProxyAllowed()) 334 if (!IsDataReductionProxyAllowed())
260 return; 335 return;
(...skipping 16 matching lines...) Expand all
277 // feedback. 352 // feedback.
278 const char kAtStartup[] = "at startup"; 353 const char kAtStartup[] = "at startup";
279 const char kByUser[] = "by user action"; 354 const char kByUser[] = "by user action";
280 const char kOn[] = "ON"; 355 const char kOn[] = "ON";
281 const char kOff[] = "OFF"; 356 const char kOff[] = "OFF";
282 357
283 LOG(WARNING) << "SPDY proxy " << (enabled ? kOn : kOff) 358 LOG(WARNING) << "SPDY proxy " << (enabled ? kOn : kOff)
284 << " " << (at_startup ? kAtStartup : kByUser); 359 << " " << (at_startup ? kAtStartup : kByUser);
285 } 360 }
286 361
362 std::string DataReductionProxySettings::GetDefaultProxyHost() {
bengr 2013/10/22 17:49:30 Why isn't the handling of command line switch valu
marq (ping after 24h) 2013/10/22 21:18:01 These two methods are used so that unit tests can
363 #if defined(SPDY_PROXY_AUTH_ORIGIN)
364 return SPDY_PROXY_AUTH_ORIGIN;
365 #else
366 return std::string();
367 #endif
368 }
369
370 std::string DataReductionProxySettings::GetDefaultFallbackProxyHost() {
371 #if defined(DATA_REDUCTION_FALLBACK_HOST)
372 return DATA_REDUCTION_FALLBACK_HOST;
bengr 2013/10/22 17:49:30 why not check in this function if GetDefaultProxyH
marq (ping after 24h) 2013/10/22 21:18:01 I don't think the default value here is of necessi
373 #else
374 return std::string();
375 #endif
376 }
377
287 PrefService* DataReductionProxySettings::GetOriginalProfilePrefs() { 378 PrefService* DataReductionProxySettings::GetOriginalProfilePrefs() {
288 return g_browser_process->profile_manager()->GetLastUsedProfile()-> 379 return g_browser_process->profile_manager()->GetLastUsedProfile()->
289 GetOriginalProfile()->GetPrefs(); 380 GetOriginalProfile()->GetPrefs();
290 } 381 }
291 382
292 PrefService* DataReductionProxySettings::GetLocalStatePrefs() { 383 PrefService* DataReductionProxySettings::GetLocalStatePrefs() {
293 return g_browser_process->local_state(); 384 return g_browser_process->local_state();
294 } 385 }
295 386
296 bool DataReductionProxySettings::IsProxyOriginSetOnCommandLine() { 387 bool DataReductionProxySettings::IsProxyOriginSetOnCommandLine() {
(...skipping 20 matching lines...) Expand all
317 PrefService* prefs = GetOriginalProfilePrefs(); 408 PrefService* prefs = GetOriginalProfilePrefs();
318 409
319 // TODO(marq): Consider moving this so stats are wiped the first time the 410 // TODO(marq): Consider moving this so stats are wiped the first time the
320 // proxy settings are actually (not maybe) turned on. 411 // proxy settings are actually (not maybe) turned on.
321 if (spdy_proxy_auth_enabled_.GetValue() && 412 if (spdy_proxy_auth_enabled_.GetValue() &&
322 !prefs->GetBoolean(prefs::kSpdyProxyAuthWasEnabledBefore)) { 413 !prefs->GetBoolean(prefs::kSpdyProxyAuthWasEnabledBefore)) {
323 prefs->SetBoolean(prefs::kSpdyProxyAuthWasEnabledBefore, true); 414 prefs->SetBoolean(prefs::kSpdyProxyAuthWasEnabledBefore, true);
324 ResetDataReductionStatistics(); 415 ResetDataReductionStatistics();
325 } 416 }
326 417
327 std::string spdy_proxy_origin = GetDataReductionProxyOriginHostPort(); 418 std::string proxy = GetDataReductionProxyOrigin();
328
329 // Configure use of the data reduction proxy if it is enabled and the proxy 419 // Configure use of the data reduction proxy if it is enabled and the proxy
330 // origin is non-empty. 420 // origin is non-empty.
331 enabled_by_user_= 421 enabled_by_user_= spdy_proxy_auth_enabled_.GetValue() && !proxy.empty();
332 spdy_proxy_auth_enabled_.GetValue() && !spdy_proxy_origin.empty();
333 SetProxyConfigs(enabled_by_user_ && !disabled_by_carrier_, at_startup); 422 SetProxyConfigs(enabled_by_user_ && !disabled_by_carrier_, at_startup);
334 423
335 // Check if the proxy has been disabled explicitly by the carrier. 424 // Check if the proxy has been disabled explicitly by the carrier.
336 if (enabled_by_user_) 425 if (enabled_by_user_)
337 ProbeWhetherDataReductionProxyIsAvailable(); 426 ProbeWhetherDataReductionProxyIsAvailable();
338 } 427 }
339 428
340 void DataReductionProxySettings::SetProxyConfigs(bool enabled, 429 void DataReductionProxySettings::SetProxyConfigs(bool enabled,
341 bool at_startup) { 430 bool at_startup) {
342 LogProxyState(enabled, at_startup); 431 LogProxyState(enabled, at_startup);
343 PrefService* prefs = GetOriginalProfilePrefs(); 432 PrefService* prefs = GetOriginalProfilePrefs();
344 DCHECK(prefs); 433 DCHECK(prefs);
345 DictionaryPrefUpdate update(prefs, prefs::kProxy); 434 DictionaryPrefUpdate update(prefs, prefs::kProxy);
346 base::DictionaryValue* dict = update.Get(); 435 base::DictionaryValue* dict = update.Get();
347 if (enabled) { 436 if (enabled) {
437 std::string fallback = GetDataReductionProxyFallback();
348 std::string proxy_server_config = 438 std::string proxy_server_config =
349 "http=" + GetDataReductionProxyOrigin() + ",direct://;"; 439 "http=" + GetDataReductionProxyOrigin() +
440 (fallback.empty() ? "" : "," + fallback) +
441 ",direct://;";
350 dict->SetString("server", proxy_server_config); 442 dict->SetString("server", proxy_server_config);
351 dict->SetString("mode", 443 dict->SetString("mode",
352 ProxyModeToString(ProxyPrefs::MODE_FIXED_SERVERS)); 444 ProxyModeToString(ProxyPrefs::MODE_FIXED_SERVERS));
353 dict->SetString("bypass_list", JoinString(bypass_rules_, ", ")); 445 dict->SetString("bypass_list", JoinString(bypass_rules_, ", "));
354 } else { 446 } else {
355 dict->SetString("mode", ProxyModeToString(ProxyPrefs::MODE_SYSTEM)); 447 dict->SetString("mode", ProxyModeToString(ProxyPrefs::MODE_SYSTEM));
356 dict->SetString("server", ""); 448 dict->SetString("server", "");
357 dict->SetString("bypass_list", ""); 449 dict->SetString("bypass_list", "");
358 } 450 }
359 } 451 }
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
429 return command_line.GetSwitchValueASCII( 521 return command_line.GetSwitchValueASCII(
430 switches::kDataReductionProxyProbeURL); 522 switches::kDataReductionProxyProbeURL);
431 } 523 }
432 #if defined(DATA_REDUCTION_PROXY_PROBE_URL) 524 #if defined(DATA_REDUCTION_PROXY_PROBE_URL)
433 return DATA_REDUCTION_PROXY_PROBE_URL; 525 return DATA_REDUCTION_PROXY_PROBE_URL;
434 #else 526 #else
435 return std::string(); 527 return std::string();
436 #endif 528 #endif
437 } 529 }
438 530
531 base::string16 DataReductionProxySettings::AuthHashForSalt(int64 salt) {
532 if (!IsDataReductionProxyAllowed())
533 return base::string16();
534
535 std::string key;
536
537 const CommandLine& command_line = *CommandLine::ForCurrentProcess();
538 if (command_line.HasSwitch(switches::kSpdyProxyAuthOrigin)) {
539 // If an origin is provided via a switch, then only consider the value
540 // that is provided by a switch. Do not use the preprocessor constant.
541 // Don't expose SPDY_PROXY_AUTH_VALUE to a proxy passed in via the command
542 // line.
543 if (!command_line.HasSwitch(switches::kSpdyProxyAuthValue))
544 return base::string16();
545 key = command_line.GetSwitchValueASCII(switches::kSpdyProxyAuthValue);
546 } else {
547 #if defined(SPDY_PROXY_AUTH_VALUE)
548 key = SPDY_PROXY_AUTH_VALUE;
549 #else
550 return base::string16();
551 #endif
552 }
553
554 DCHECK(!key.empty());
555
556 std::string salted_key =
557 base::StringPrintf("%lld%s%lld", salt, key.c_str(), salt);
558 return UTF8ToUTF16(base::MD5String(salted_key));
559 }
560
439 net::URLFetcher* DataReductionProxySettings::GetURLFetcher() { 561 net::URLFetcher* DataReductionProxySettings::GetURLFetcher() {
440 std::string url = GetProxyCheckURL(); 562 std::string url = GetProxyCheckURL();
441 if (url.empty()) 563 if (url.empty())
442 return NULL; 564 return NULL;
443 net::URLFetcher* fetcher = net::URLFetcher::Create(GURL(url), 565 net::URLFetcher* fetcher = net::URLFetcher::Create(GURL(url),
444 net::URLFetcher::GET, 566 net::URLFetcher::GET,
445 this); 567 this);
446 fetcher->SetLoadFlags(net::LOAD_DISABLE_CACHE); 568 fetcher->SetLoadFlags(net::LOAD_DISABLE_CACHE);
447 fetcher->SetLoadFlags(net::LOAD_BYPASS_PROXY); 569 fetcher->SetLoadFlags(net::LOAD_BYPASS_PROXY);
448 Profile* profile = g_browser_process->profile_manager()-> 570 Profile* profile = g_browser_process->profile_manager()->
449 GetDefaultProfile(); 571 GetDefaultProfile();
450 fetcher->SetRequestContext(profile->GetRequestContext()); 572 fetcher->SetRequestContext(profile->GetRequestContext());
451 // Configure max retries to be at most kMaxRetries times for 5xx errors. 573 // Configure max retries to be at most kMaxRetries times for 5xx errors.
452 static const int kMaxRetries = 5; 574 static const int kMaxRetries = 5;
453 fetcher->SetMaxRetriesOn5xx(kMaxRetries); 575 fetcher->SetMaxRetriesOn5xx(kMaxRetries);
454 return fetcher; 576 return fetcher;
455 } 577 }
456 578
457 void 579 void
458 DataReductionProxySettings::ProbeWhetherDataReductionProxyIsAvailable() { 580 DataReductionProxySettings::ProbeWhetherDataReductionProxyIsAvailable() {
459 net::URLFetcher* fetcher = GetURLFetcher(); 581 net::URLFetcher* fetcher = GetURLFetcher();
460 if (!fetcher) 582 if (!fetcher)
461 return; 583 return;
462 fetcher_.reset(fetcher); 584 fetcher_.reset(fetcher);
463 fetcher_->Start(); 585 fetcher_->Start();
464 } 586 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698