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