OLD | NEW |
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" |
(...skipping 19 matching lines...) Expand all Loading... |
30 #include "net/http/http_auth_cache.h" | 30 #include "net/http/http_auth_cache.h" |
31 #include "net/http/http_network_session.h" | 31 #include "net/http/http_network_session.h" |
32 #include "net/http/http_response_headers.h" | 32 #include "net/http/http_response_headers.h" |
33 #include "net/url_request/url_fetcher.h" | 33 #include "net/url_request/url_fetcher.h" |
34 #include "net/url_request/url_fetcher_delegate.h" | 34 #include "net/url_request/url_fetcher_delegate.h" |
35 #include "net/url_request/url_request_status.h" | 35 #include "net/url_request/url_request_status.h" |
36 #include "url/gurl.h" | 36 #include "url/gurl.h" |
37 | 37 |
38 using base::FieldTrialList; | 38 using base::FieldTrialList; |
39 using base::StringPrintf; | 39 using base::StringPrintf; |
| 40 using spdyproxy::ProbeURLFetchResult; |
| 41 using spdyproxy::ProxyStartupState; |
40 | 42 |
41 namespace { | 43 namespace { |
42 | 44 |
43 // Key of the UMA DataReductionProxy.StartupState histogram. | 45 // Key of the UMA DataReductionProxy.StartupState histogram. |
44 const char kUMAProxyStartupStateHistogram[] = | 46 const char kUMAProxyStartupStateHistogram[] = |
45 "DataReductionProxy.StartupState"; | 47 "DataReductionProxy.StartupState"; |
46 // Values of the UMA DataReductionProxy.StartupState histogram. | |
47 enum ProxyStartupState { | |
48 PROXY_NOT_AVAILABLE = 0, | |
49 PROXY_DISABLED, | |
50 PROXY_ENABLED, | |
51 PROXY_STARTUP_STATE_COUNT, | |
52 }; | |
53 | 48 |
54 // Key of the UMA DataReductionProxy.ProbeURL histogram. | 49 // Key of the UMA DataReductionProxy.ProbeURL histogram. |
55 const char kUMAProxyProbeURL[] = "DataReductionProxy.ProbeURL"; | 50 const char kUMAProxyProbeURL[] = "DataReductionProxy.ProbeURL"; |
56 // Values of the UMA DataReductionProxy.ProbeURL histogram. | |
57 // This enum must remain synchronized with DataReductionProxyProbeURLFetchResult | |
58 // in metrics/histograms/histograms.xml. | |
59 enum ProbeURLFetchResult { | |
60 // The probe failed because the internet was disconnected. | |
61 INTERNET_DISCONNECTED = 0, | |
62 | 51 |
63 // The probe failed for any other reason, and as a result, the proxy was | |
64 // disabled. | |
65 FAILED_PROXY_DISABLED, | |
66 | |
67 // The probe failed, but the proxy was already disabled. | |
68 FAILED_PROXY_ALREADY_DISABLED, | |
69 | |
70 // THe probe succeeded, and as a result the proxy was enabled. | |
71 SUCCEEDED_PROXY_ENABLED, | |
72 | |
73 // The probe succeeded, but the proxy was already enabled. | |
74 SUCCEEDED_PROXY_ALREADY_ENABLED, | |
75 | |
76 // This must always be last. | |
77 FETCH_RESULT_COUNT | |
78 }; | |
79 | |
80 void RecordProbeURLFetchResult(ProbeURLFetchResult result) { | |
81 UMA_HISTOGRAM_ENUMERATION(kUMAProxyProbeURL, result, FETCH_RESULT_COUNT); | |
82 } | |
83 | 52 |
84 const char kEnabled[] = "Enabled"; | 53 const char kEnabled[] = "Enabled"; |
85 | 54 |
86 // TODO(marq): Factor this string out into a constant here and in | 55 // TODO(marq): Factor this string out into a constant here and in |
87 // http_auth_handler_spdyproxy. | 56 // http_auth_handler_spdyproxy. |
88 const char kAuthenticationRealmName[] = "SpdyProxy"; | 57 const char kAuthenticationRealmName[] = "SpdyProxy"; |
89 | 58 |
90 int64 GetInt64PrefValue(const base::ListValue& list_value, size_t index) { | 59 int64 GetInt64PrefValue(const base::ListValue& list_value, size_t index) { |
91 int64 val = 0; | 60 int64 val = 0; |
92 std::string pref_value; | 61 std::string pref_value; |
(...skipping 26 matching lines...) Expand all Loading... |
119 void DataReductionProxySettings::InitPrefMembers() { | 88 void DataReductionProxySettings::InitPrefMembers() { |
120 spdy_proxy_auth_enabled_.Init( | 89 spdy_proxy_auth_enabled_.Init( |
121 prefs::kSpdyProxyAuthEnabled, | 90 prefs::kSpdyProxyAuthEnabled, |
122 GetOriginalProfilePrefs(), | 91 GetOriginalProfilePrefs(), |
123 base::Bind(&DataReductionProxySettings::OnProxyEnabledPrefChange, | 92 base::Bind(&DataReductionProxySettings::OnProxyEnabledPrefChange, |
124 base::Unretained(this))); | 93 base::Unretained(this))); |
125 } | 94 } |
126 | 95 |
127 void DataReductionProxySettings::InitDataReductionProxySettings() { | 96 void DataReductionProxySettings::InitDataReductionProxySettings() { |
128 InitPrefMembers(); | 97 InitPrefMembers(); |
| 98 RecordDataReductionInit(); |
129 | 99 |
130 // Disable the proxy if it is not allowed to be used. | 100 // Disable the proxy if it is not allowed to be used. |
131 if (!IsDataReductionProxyAllowed()) | 101 if (!IsDataReductionProxyAllowed()) |
132 return; | 102 return; |
133 | 103 |
134 AddDefaultProxyBypassRules(); | 104 AddDefaultProxyBypassRules(); |
135 net::NetworkChangeNotifier::AddIPAddressObserver(this); | 105 net::NetworkChangeNotifier::AddIPAddressObserver(this); |
136 | 106 |
137 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); | 107 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); |
138 | 108 |
139 // Setting the kEnableSpdyProxyAuth switch has the same effect as enabling | 109 // Setting the kEnableSpdyProxyAuth switch has the same effect as enabling |
140 // the feature via settings, in that once set, the preference will be sticky | 110 // the feature via settings, in that once set, the preference will be sticky |
141 // across instances of Chrome. Disabling the feature can only be done through | 111 // across instances of Chrome. Disabling the feature can only be done through |
142 // the settings menu. | 112 // the settings menu. |
143 RecordDataReductionInit(); | |
144 if (spdy_proxy_auth_enabled_.GetValue() || | 113 if (spdy_proxy_auth_enabled_.GetValue() || |
145 command_line.HasSwitch(switches::kEnableSpdyProxyAuth)) { | 114 command_line.HasSwitch(switches::kEnableSpdyProxyAuth)) { |
146 MaybeActivateDataReductionProxy(true); | 115 MaybeActivateDataReductionProxy(true); |
147 } else { | 116 } else { |
148 // This is logged so we can use this information in user feedback. | 117 // This is logged so we can use this information in user feedback. |
149 LogProxyState(false /* enabled */, | 118 LogProxyState(false /* enabled */, |
150 false /* restricted */, | 119 false /* restricted */, |
151 true /* at startup */); | 120 true /* at startup */); |
152 } | 121 } |
153 } | 122 } |
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
374 DataReductionProxySettings::ContentLengthList | 343 DataReductionProxySettings::ContentLengthList |
375 DataReductionProxySettings::GetDailyReceivedContentLengths() { | 344 DataReductionProxySettings::GetDailyReceivedContentLengths() { |
376 return GetDailyContentLengths(prefs::kDailyHttpReceivedContentLength); | 345 return GetDailyContentLengths(prefs::kDailyHttpReceivedContentLength); |
377 } | 346 } |
378 | 347 |
379 void DataReductionProxySettings::OnURLFetchComplete( | 348 void DataReductionProxySettings::OnURLFetchComplete( |
380 const net::URLFetcher* source) { | 349 const net::URLFetcher* source) { |
381 net::URLRequestStatus status = source->GetStatus(); | 350 net::URLRequestStatus status = source->GetStatus(); |
382 if (status.status() == net::URLRequestStatus::FAILED && | 351 if (status.status() == net::URLRequestStatus::FAILED && |
383 status.error() == net::ERR_INTERNET_DISCONNECTED) { | 352 status.error() == net::ERR_INTERNET_DISCONNECTED) { |
384 RecordProbeURLFetchResult(INTERNET_DISCONNECTED); | 353 RecordProbeURLFetchResult(spdyproxy::INTERNET_DISCONNECTED); |
385 return; | 354 return; |
386 } | 355 } |
387 | 356 |
388 std::string response; | 357 std::string response; |
389 source->GetResponseAsString(&response); | 358 source->GetResponseAsString(&response); |
390 | 359 |
391 if ("OK" == response.substr(0, 2)) { | 360 if ("OK" == response.substr(0, 2)) { |
392 DVLOG(1) << "The data reduction proxy is unrestricted."; | 361 DVLOG(1) << "The data reduction proxy is unrestricted."; |
393 | 362 |
394 if (enabled_by_user_) { | 363 if (enabled_by_user_) { |
395 if (restricted_by_carrier_) { | 364 if (restricted_by_carrier_) { |
396 // The user enabled the proxy, but sometime previously in the session, | 365 // The user enabled the proxy, but sometime previously in the session, |
397 // the network operator had blocked the canary and restricted the user. | 366 // the network operator had blocked the canary and restricted the user. |
398 // The current network doesn't block the canary, so don't restrict the | 367 // The current network doesn't block the canary, so don't restrict the |
399 // proxy configurations. | 368 // proxy configurations. |
400 SetProxyConfigs(true /* enabled */, | 369 SetProxyConfigs(true /* enabled */, |
401 false /* restricted */, | 370 false /* restricted */, |
402 false /* at_startup */); | 371 false /* at_startup */); |
403 RecordProbeURLFetchResult(SUCCEEDED_PROXY_ENABLED); | 372 RecordProbeURLFetchResult(spdyproxy::SUCCEEDED_PROXY_ENABLED); |
404 } else { | 373 } else { |
405 RecordProbeURLFetchResult(SUCCEEDED_PROXY_ALREADY_ENABLED); | 374 RecordProbeURLFetchResult(spdyproxy::SUCCEEDED_PROXY_ALREADY_ENABLED); |
406 } | 375 } |
407 } | 376 } |
408 restricted_by_carrier_ = false; | 377 restricted_by_carrier_ = false; |
409 return; | 378 return; |
410 } | 379 } |
411 DVLOG(1) << "The data reduction proxy is restricted to the configured " | 380 DVLOG(1) << "The data reduction proxy is restricted to the configured " |
412 << "fallback proxy."; | 381 << "fallback proxy."; |
413 | 382 |
414 if (enabled_by_user_) { | 383 if (enabled_by_user_) { |
415 if (!restricted_by_carrier_) { | 384 if (!restricted_by_carrier_) { |
416 // Restrict the proxy. | 385 // Restrict the proxy. |
417 SetProxyConfigs(true /* enabled */, | 386 SetProxyConfigs(true /* enabled */, |
418 true /* restricted */, | 387 true /* restricted */, |
419 false /* at_startup */); | 388 false /* at_startup */); |
420 RecordProbeURLFetchResult(FAILED_PROXY_DISABLED); | 389 RecordProbeURLFetchResult(spdyproxy::FAILED_PROXY_DISABLED); |
421 } else { | 390 } else { |
422 RecordProbeURLFetchResult(FAILED_PROXY_ALREADY_DISABLED); | 391 RecordProbeURLFetchResult(spdyproxy::FAILED_PROXY_ALREADY_DISABLED); |
423 } | 392 } |
424 } | 393 } |
425 restricted_by_carrier_ = true; | 394 restricted_by_carrier_ = true; |
426 } | 395 } |
427 | 396 |
428 void DataReductionProxySettings::OnIPAddressChanged() { | 397 void DataReductionProxySettings::OnIPAddressChanged() { |
429 if (enabled_by_user_) { | 398 if (enabled_by_user_) { |
430 DCHECK(IsDataReductionProxyAllowed()); | 399 DCHECK(IsDataReductionProxyAllowed()); |
431 ProbeWhetherDataReductionProxyIsAvailable(); | 400 ProbeWhetherDataReductionProxyIsAvailable(); |
432 } | 401 } |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
546 dict->SetString("bypass_list", JoinString(bypass_rules_, ", ")); | 515 dict->SetString("bypass_list", JoinString(bypass_rules_, ", ")); |
547 } else { | 516 } else { |
548 dict->SetString("mode", ProxyModeToString(ProxyPrefs::MODE_SYSTEM)); | 517 dict->SetString("mode", ProxyModeToString(ProxyPrefs::MODE_SYSTEM)); |
549 dict->SetString("server", ""); | 518 dict->SetString("server", ""); |
550 dict->SetString("bypass_list", ""); | 519 dict->SetString("bypass_list", ""); |
551 } | 520 } |
552 } | 521 } |
553 | 522 |
554 // Metrics methods | 523 // Metrics methods |
555 void DataReductionProxySettings::RecordDataReductionInit() { | 524 void DataReductionProxySettings::RecordDataReductionInit() { |
556 ProxyStartupState state = PROXY_NOT_AVAILABLE; | 525 ProxyStartupState state = spdyproxy::PROXY_NOT_AVAILABLE; |
557 if (IsDataReductionProxyAllowed()) | 526 if (IsDataReductionProxyAllowed()) { |
558 state = IsDataReductionProxyEnabled() ? PROXY_ENABLED : PROXY_DISABLED; | 527 if (IsDataReductionProxyEnabled()) |
| 528 state = spdyproxy::PROXY_ENABLED; |
| 529 else |
| 530 state = spdyproxy::PROXY_DISABLED; |
| 531 } |
| 532 |
| 533 RecordStartupState(state); |
| 534 } |
| 535 |
| 536 void DataReductionProxySettings::RecordProbeURLFetchResult( |
| 537 ProbeURLFetchResult result) { |
| 538 UMA_HISTOGRAM_ENUMERATION(kUMAProxyProbeURL, |
| 539 result, |
| 540 spdyproxy::PROBE_URL_FETCH_RESULT_COUNT); |
| 541 } |
| 542 |
| 543 void DataReductionProxySettings::RecordStartupState(ProxyStartupState state) { |
559 UMA_HISTOGRAM_ENUMERATION(kUMAProxyStartupStateHistogram, | 544 UMA_HISTOGRAM_ENUMERATION(kUMAProxyStartupStateHistogram, |
560 state, | 545 state, |
561 PROXY_STARTUP_STATE_COUNT); | 546 spdyproxy::PROXY_STARTUP_STATE_COUNT); |
562 } | 547 } |
563 | 548 |
564 DataReductionProxySettings::ContentLengthList | 549 DataReductionProxySettings::ContentLengthList |
565 DataReductionProxySettings::GetDailyContentLengths(const char* pref_name) { | 550 DataReductionProxySettings::GetDailyContentLengths(const char* pref_name) { |
566 DataReductionProxySettings::ContentLengthList content_lengths; | 551 DataReductionProxySettings::ContentLengthList content_lengths; |
567 const base::ListValue* list_value = GetLocalStatePrefs()->GetList(pref_name); | 552 const base::ListValue* list_value = GetLocalStatePrefs()->GetList(pref_name); |
568 if (list_value->GetSize() == spdyproxy::kNumDaysInHistory) { | 553 if (list_value->GetSize() == spdyproxy::kNumDaysInHistory) { |
569 for (size_t i = 0; i < spdyproxy::kNumDaysInHistory; ++i) { | 554 for (size_t i = 0; i < spdyproxy::kNumDaysInHistory; ++i) { |
570 content_lengths.push_back(GetInt64PrefValue(*list_value, i)); | 555 content_lengths.push_back(GetInt64PrefValue(*list_value, i)); |
571 } | 556 } |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
679 } | 664 } |
680 | 665 |
681 void | 666 void |
682 DataReductionProxySettings::ProbeWhetherDataReductionProxyIsAvailable() { | 667 DataReductionProxySettings::ProbeWhetherDataReductionProxyIsAvailable() { |
683 net::URLFetcher* fetcher = GetURLFetcher(); | 668 net::URLFetcher* fetcher = GetURLFetcher(); |
684 if (!fetcher) | 669 if (!fetcher) |
685 return; | 670 return; |
686 fetcher_.reset(fetcher); | 671 fetcher_.reset(fetcher); |
687 fetcher_->Start(); | 672 fetcher_->Start(); |
688 } | 673 } |
OLD | NEW |