1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/importer/firefox_proxy_settings.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/file_path.h" 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_tokenizer.h" 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h" 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/values.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/importer/firefox_importer_utils.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/proxy/proxy_config.h" 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace { 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char* const kNetworkProxyTypeKey = "network.proxy.type"; 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char* const kHTTPProxyKey = "network.proxy.http"; 183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char* const kHTTPProxyPortKey = "network.proxy.http_port"; 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char* const kSSLProxyKey = "network.proxy.ssl"; 203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char* const kSSLProxyPortKey = "network.proxy.ssl_port"; 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char* const kFTPProxyKey = "network.proxy.ftp"; 223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char* const kFTPProxyPortKey = "network.proxy.ftp_port"; 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char* const kGopherProxyKey = "network.proxy.gopher"; 243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char* const kGopherProxyPortKey = "network.proxy.gopher_port"; 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char* const kSOCKSHostKey = "network.proxy.socks"; 263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char* const kSOCKSHostPortKey = "network.proxy.socks_port"; 273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char* const kSOCKSVersionKey = "network.proxy.socks_version"; 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char* const kAutoconfigURL = "network.proxy.autoconfig_url"; 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char* const kNoProxyListKey = "network.proxy.no_proxies_on"; 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char* const kPrefFileName = "prefs.js"; 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochFirefoxProxySettings::ProxyConfig IntToProxyConfig(int type) { 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch switch (type) { 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case 1: 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return FirefoxProxySettings::MANUAL; 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case 2: 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return FirefoxProxySettings::AUTO_FROM_URL; 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case 4: 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return FirefoxProxySettings::AUTO_DETECT; 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case 5: 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return FirefoxProxySettings::SYSTEM; 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch default: 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOG(ERROR) << "Unknown Firefox proxy config type: " << type; 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return FirefoxProxySettings::NO_PROXY; 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochFirefoxProxySettings::SOCKSVersion IntToSOCKSVersion(int type) { 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch switch (type) { 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case 4: 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return FirefoxProxySettings::V4; 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case 5: 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return FirefoxProxySettings::V5; 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch default: 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOG(ERROR) << "Unknown Firefox proxy config type: " << type; 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return FirefoxProxySettings::UNKNONW; 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochFirefoxProxySettings::FirefoxProxySettings() { 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Reset(); 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochFirefoxProxySettings::~FirefoxProxySettings() { 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid FirefoxProxySettings::Reset() { 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch config_type_ = NO_PROXY; 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch http_proxy_.clear(); 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch http_proxy_port_ = 0; 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ssl_proxy_.clear(); 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ssl_proxy_port_ = 0; 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ftp_proxy_.clear(); 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ftp_proxy_port_ = 0; 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gopher_proxy_.clear(); 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gopher_proxy_port_ = 0; 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socks_host_.clear(); 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socks_port_ = 0; 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socks_version_ = UNKNONW; 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch proxy_bypass_list_.clear(); 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch autoconfig_url_.clear(); 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool FirefoxProxySettings::GetSettings(FirefoxProxySettings* settings) { 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(settings); 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch settings->Reset(); 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath profile_path = GetFirefoxProfilePath(); 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (profile_path.empty()) 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath pref_file = profile_path.AppendASCII(kPrefFileName); 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return GetSettingsFromFile(pref_file, settings); 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool FirefoxProxySettings::ToProxyConfig(net::ProxyConfig* config) { 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch switch (config_type()) { 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case NO_PROXY: 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *config = net::ProxyConfig::CreateDirect(); 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case AUTO_DETECT: 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *config = net::ProxyConfig::CreateAutoDetect(); 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case AUTO_FROM_URL: 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *config = net::ProxyConfig::CreateFromCustomPacURL( 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL(autoconfig_url())); 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case SYSTEM: 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Can't convert this directly to a ProxyConfig. 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case MANUAL: 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Handled outside of the switch (since it is a lot of code.) 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch default: 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The rest of this funciton is for handling the MANUAL case. 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK_EQ(MANUAL, config_type()); 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *config = net::ProxyConfig(); 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch config->proxy_rules().type = 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::ProxyConfig::ProxyRules::TYPE_PROXY_PER_SCHEME; 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!http_proxy().empty()) { 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch config->proxy_rules().proxy_for_http = net::ProxyServer( 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::ProxyServer::SCHEME_HTTP, 1313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick net::HostPortPair(http_proxy(), http_proxy_port())); 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!ftp_proxy().empty()) { 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch config->proxy_rules().proxy_for_ftp = net::ProxyServer( 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::ProxyServer::SCHEME_HTTP, 1373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick net::HostPortPair(ftp_proxy(), ftp_proxy_port())); 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!ssl_proxy().empty()) { 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch config->proxy_rules().proxy_for_https = net::ProxyServer( 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::ProxyServer::SCHEME_HTTP, 1433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick net::HostPortPair(ssl_proxy(), ssl_proxy_port())); 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!socks_host().empty()) { 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::ProxyServer::Scheme proxy_scheme = V5 == socks_version() ? 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::ProxyServer::SCHEME_SOCKS5 : net::ProxyServer::SCHEME_SOCKS4; 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick config->proxy_rules().fallback_proxy = net::ProxyServer( 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch proxy_scheme, 1523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick net::HostPortPair(socks_host(), socks_port())); 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch config->proxy_rules().bypass_rules.ParseFromStringUsingSuffixMatching( 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch JoinString(proxy_bypass_list_, ';')); 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool FirefoxProxySettings::GetSettingsFromFile(const FilePath& pref_file, 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FirefoxProxySettings* settings) { 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DictionaryValue dictionary; 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!ParsePrefFile(pref_file, &dictionary)) 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int proxy_type = 0; 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!dictionary.GetInteger(kNetworkProxyTypeKey, &proxy_type)) 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; // No type means no proxy. 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch settings->config_type_ = IntToProxyConfig(proxy_type); 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (settings->config_type_ == AUTO_FROM_URL) { 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!dictionary.GetStringASCII(kAutoconfigURL, 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &(settings->autoconfig_url_))) { 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOG(ERROR) << "Failed to retrieve Firefox proxy autoconfig URL"; 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (settings->config_type_ == MANUAL) { 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!dictionary.GetStringASCII(kHTTPProxyKey, &(settings->http_proxy_))) 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOG(ERROR) << "Failed to retrieve Firefox proxy HTTP host"; 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!dictionary.GetInteger(kHTTPProxyPortKey, 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &(settings->http_proxy_port_))) { 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOG(ERROR) << "Failed to retrieve Firefox proxy HTTP port"; 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!dictionary.GetStringASCII(kSSLProxyKey, &(settings->ssl_proxy_))) 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOG(ERROR) << "Failed to retrieve Firefox proxy SSL host"; 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!dictionary.GetInteger(kSSLProxyPortKey, &(settings->ssl_proxy_port_))) 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOG(ERROR) << "Failed to retrieve Firefox proxy SSL port"; 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!dictionary.GetStringASCII(kFTPProxyKey, &(settings->ftp_proxy_))) 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOG(ERROR) << "Failed to retrieve Firefox proxy FTP host"; 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!dictionary.GetInteger(kFTPProxyPortKey, &(settings->ftp_proxy_port_))) 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOG(ERROR) << "Failed to retrieve Firefox proxy SSL port"; 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!dictionary.GetStringASCII(kGopherProxyKey, &(settings->gopher_proxy_))) 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOG(ERROR) << "Failed to retrieve Firefox proxy gopher host"; 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!dictionary.GetInteger(kGopherProxyPortKey, 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &(settings->gopher_proxy_port_))) { 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOG(ERROR) << "Failed to retrieve Firefox proxy gopher port"; 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!dictionary.GetStringASCII(kSOCKSHostKey, &(settings->socks_host_))) 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOG(ERROR) << "Failed to retrieve Firefox SOCKS host"; 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!dictionary.GetInteger(kSOCKSHostPortKey, &(settings->socks_port_))) 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOG(ERROR) << "Failed to retrieve Firefox SOCKS port"; 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int socks_version; 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (dictionary.GetInteger(kSOCKSVersionKey, &socks_version)) 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch settings->socks_version_ = IntToSOCKSVersion(socks_version); 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string proxy_bypass; 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (dictionary.GetStringASCII(kNoProxyListKey, &proxy_bypass) && 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch !proxy_bypass.empty()) { 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StringTokenizer string_tok(proxy_bypass, ","); 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch while (string_tok.GetNext()) { 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string token = string_tok.token(); 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TrimWhitespaceASCII(token, TRIM_ALL, &token); 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!token.empty()) 218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch settings->proxy_bypass_list_.push_back(token); 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 224