Chromium Code Reviews| Index: chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_settings.cc |
| diff --git a/chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_settings.cc b/chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_settings.cc |
| index f01181a7c2f0870e703b2d7c2a941dfc68422341..22e476ed0c259a70f25a091376983eb74b9dda15 100644 |
| --- a/chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_settings.cc |
| +++ b/chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_settings.cc |
| @@ -6,6 +6,7 @@ |
| #include <string> |
| +#include "base/base64.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "base/metrics/histogram_macros.h" |
| #include "base/prefs/pref_service.h" |
| @@ -59,6 +60,15 @@ bool ContainsDataReductionProxyDefaultHostSuffix( |
| proxy_rules.proxies_for_https); |
| } |
| +// Extract the embedded |pac_script| from the given |pac_url|. Returns true if |
| +// extraction was successful, otherwise returns false. |
| +bool GetEmbeddedPacScript(const std::string& pac_url, std::string* pac_script) { |
|
bengr
2015/06/08 18:26:33
Can the pac_script be const? Can it ever be null?
sclittle
2015/06/08 18:47:45
I've updated the comment to clarify that pac_scrip
|
| + const std::string kPacURLPrefix = |
| + "data:application/x-ns-proxy-autoconfig;base64,"; |
| + return StartsWithASCII(pac_url, kPacURLPrefix, true) && |
| + base::Base64Decode(pac_url.substr(kPacURLPrefix.size()), pac_script); |
|
bengr
2015/06/08 18:26:33
Will the pac always be base64?
sclittle
2015/06/08 18:47:45
Yes, according to the way that the DRP was enabled
|
| +} |
| + |
| } // namespace |
| // The Data Reduction Proxy has been turned into a "best effort" proxy, |
| @@ -70,6 +80,8 @@ void DataReductionProxyChromeSettings::MigrateDataReductionProxyOffProxyPrefs( |
| PrefService* prefs) { |
| ProxyPrefMigrationResult proxy_pref_status = |
| MigrateDataReductionProxyOffProxyPrefsHelper(prefs); |
| + LOG(WARNING) << "MigrateDataReductionProxyOffProxyPrefs " |
| + << proxy_pref_status; |
| UMA_HISTOGRAM_ENUMERATION("DataReductionProxy.ProxyPrefMigrationResult", |
| proxy_pref_status, |
| DataReductionProxyChromeSettings::PROXY_PREF_MAX); |
| @@ -98,27 +110,54 @@ DataReductionProxyChromeSettings::MigrateDataReductionProxyOffProxyPrefsHelper( |
| prefs->ClearPref(prefs::kProxy); |
| return PROXY_PREF_CLEARED_MODE_SYSTEM; |
| } |
| - if (ProxyModeToString(ProxyPrefs::MODE_FIXED_SERVERS) != mode) |
| - return PROXY_PREF_NOT_CLEARED; |
| - std::string proxy_server; |
| - if (!dict->GetString("server", &proxy_server)) |
| - return PROXY_PREF_NOT_CLEARED; |
| - net::ProxyConfig::ProxyRules proxy_rules; |
| - proxy_rules.ParseFromString(proxy_server); |
| - // Clear the proxy pref if it matches a currently configured Data Reduction |
| - // Proxy, or if the proxy host ends with ".googlezip.net", in order to ensure |
| - // that any DRP in the pref is cleared even if the DRP configuration was |
| - // changed. See http://crbug.com/476610. |
| - ProxyPrefMigrationResult rv; |
| - if (Config()->ContainsDataReductionProxy(proxy_rules)) |
| - rv = PROXY_PREF_CLEARED_DRP; |
| - else if (ContainsDataReductionProxyDefaultHostSuffix(proxy_rules)) |
| - rv = PROXY_PREF_CLEARED_GOOGLEZIP; |
| - else |
| - return PROXY_PREF_NOT_CLEARED; |
| - prefs->ClearPref(prefs::kProxy); |
| - return rv; |
| + // From M36 to M40, the DRP was configured using MODE_FIXED_SERVERS in the |
| + // proxy pref. |
| + if (ProxyModeToString(ProxyPrefs::MODE_FIXED_SERVERS) == mode) { |
| + std::string proxy_server; |
| + if (!dict->GetString("server", &proxy_server)) |
| + return PROXY_PREF_NOT_CLEARED; |
| + net::ProxyConfig::ProxyRules proxy_rules; |
| + proxy_rules.ParseFromString(proxy_server); |
| + // Clear the proxy pref if it matches a currently configured Data Reduction |
| + // Proxy, or if the proxy host ends with ".googlezip.net", in order to |
| + // ensure that any DRP in the pref is cleared even if the DRP configuration |
| + // was changed. See http://crbug.com/476610. |
| + ProxyPrefMigrationResult rv; |
| + if (Config()->ContainsDataReductionProxy(proxy_rules)) |
| + rv = PROXY_PREF_CLEARED_DRP; |
| + else if (ContainsDataReductionProxyDefaultHostSuffix(proxy_rules)) |
| + rv = PROXY_PREF_CLEARED_GOOGLEZIP; |
| + else |
| + return PROXY_PREF_NOT_CLEARED; |
| + |
| + prefs->ClearPref(prefs::kProxy); |
| + return rv; |
| + } |
| + |
| + // Before M35, the DRP was configured using a PAC script base64 encoded into a |
| + // PAC url. |
| + if (ProxyModeToString(ProxyPrefs::MODE_PAC_SCRIPT) == mode) { |
| + std::string pac_url; |
| + std::string pac_script; |
| + if (!dict->GetString("pac_url", &pac_url) || |
| + !GetEmbeddedPacScript(pac_url, &pac_script)) { |
| + return PROXY_PREF_NOT_CLEARED; |
| + } |
| + |
| + // In M35 and earlier, the way of specifying the DRP in a PAC script would |
| + // always include the port number after the host even if the port number |
| + // could be implied, so searching for ".googlezip.net:" in the PAC script |
| + // indicates whether there's a proxy in that PAC script with a host of the |
| + // form "*.googlezip.net". |
| + if (pac_script.find(".googlezip.net:") == std::string::npos) |
| + return PROXY_PREF_NOT_CLEARED; |
| + |
| + prefs->ClearPref(prefs::kProxy); |
| + return PROXY_PREF_CLEARED_PAC_GOOGLEZIP; |
| + } |
| + |
| + return PROXY_PREF_NOT_CLEARED; |
| } |
| DataReductionProxyChromeSettings::DataReductionProxyChromeSettings() |