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

Unified Diff: net/proxy/proxy_config_service_ios.cc

Issue 10882010: Add iOS support to ProxyService (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Added related files from chrome/browser/net Created 8 years, 4 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 side-by-side diff with in-line comments
Download patch
Index: net/proxy/proxy_config_service_ios.cc
diff --git a/net/proxy/proxy_config_service_ios.cc b/net/proxy/proxy_config_service_ios.cc
new file mode 100644
index 0000000000000000000000000000000000000000..050505e1268c154cde75928c086d714d2e8a12b1
--- /dev/null
+++ b/net/proxy/proxy_config_service_ios.cc
@@ -0,0 +1,113 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "net/proxy/proxy_config_service_ios.h"
+
+#include <CoreFoundation/CoreFoundation.h>
+#include <CFNetwork/CFProxySupport.h>
+
+#include "base/message_loop.h"
+#include "base/mac/foundation_util.h"
+#include "base/mac/scoped_cftyperef.h"
+#include "base/sys_string_conversions.h"
+#include "net/proxy/proxy_config.h"
+
+namespace net {
+
+namespace {
+
+const int kPollIntervalSec = 10;
+
+// Utility function to pull out a boolean value from a dictionary and return it,
+// returning a default value if the key is not present.
+bool GetBoolFromDictionary(CFDictionaryRef dict,
+ CFStringRef key,
+ bool default_value) {
+ CFNumberRef number =
+ base::mac::GetValueFromDictionary<CFNumberRef>(dict, key);
+ if (!number)
+ return default_value;
+
+ int int_value;
+ if (CFNumberGetValue(number, kCFNumberIntType, &int_value))
+ return int_value;
+ else
+ return default_value;
+}
+
+void GetCurrentProxyConfig(ProxyConfig* config) {
+ base::mac::ScopedCFTypeRef<CFDictionaryRef> config_dict(
+ CFNetworkCopySystemProxySettings());
+ DCHECK(config_dict);
+
+ // Auto-detect is not supported.
+ // The kCFNetworkProxiesProxyAutoDiscoveryEnable key is not available on iOS.
+
+ // PAC file
+
+ if (GetBoolFromDictionary(config_dict.get(),
+ kCFNetworkProxiesProxyAutoConfigEnable,
+ false)) {
+ CFStringRef pac_url_ref = base::mac::GetValueFromDictionary<CFStringRef>(
+ config_dict.get(), kCFNetworkProxiesProxyAutoConfigURLString);
+ if (pac_url_ref)
+ config->set_pac_url(GURL(base::SysCFStringRefToUTF8(pac_url_ref)));
+ }
+
+ // Proxies (for now http).
+
+ // The following keys are not available on iOS:
+ // kCFNetworkProxiesFTPEnable
+ // kCFNetworkProxiesFTPProxy
+ // kCFNetworkProxiesFTPPort
+ // kCFNetworkProxiesHTTPSEnable
+ // kCFNetworkProxiesHTTPSProxy
+ // kCFNetworkProxiesHTTPSPort
+ // kCFNetworkProxiesSOCKSEnable
+ // kCFNetworkProxiesSOCKSProxy
+ // kCFNetworkProxiesSOCKSPort
+ if (GetBoolFromDictionary(config_dict.get(),
+ kCFNetworkProxiesHTTPEnable,
+ false)) {
+ ProxyServer proxy_server =
+ ProxyServer::FromDictionary(ProxyServer::SCHEME_HTTP,
+ config_dict.get(),
+ kCFNetworkProxiesHTTPProxy,
+ kCFNetworkProxiesHTTPPort);
+ if (proxy_server.is_valid()) {
+ config->proxy_rules().type =
+ ProxyConfig::ProxyRules::TYPE_PROXY_PER_SCHEME;
+ config->proxy_rules().proxy_for_http = proxy_server;
+ // Desktop Safari applies the HTTP proxy to http:// URLs only, but
+ // Mobile Safari applies the HTTP proxy to https:// URLs as well.
+ config->proxy_rules().proxy_for_https = proxy_server;
+ }
+ }
+
+ // Proxy bypass list is not supported.
+ // The kCFNetworkProxiesExceptionsList key is not available on iOS.
+
+ // Proxy bypass boolean is not supported.
+ // The kCFNetworkProxiesExcludeSimpleHostnames key is not available on iOS.
+
+ // Source
+ config->set_source(PROXY_CONFIG_SOURCE_SYSTEM);
+}
+
+} // namespace
+
+ProxyConfigServiceIOS::ProxyConfigServiceIOS(
+ base::SingleThreadTaskRunner* io_thread_task_runner)
+ : PollingProxyConfigService(
+ base::TimeDelta::FromSeconds(kPollIntervalSec),
+ GetCurrentProxyConfig),
+ io_thread_task_runner_(io_thread_task_runner) {
+ DCHECK(io_thread_task_runner_);
+}
+
+ProxyConfigServiceIOS::~ProxyConfigServiceIOS() {
+ DCHECK(io_thread_task_runner_->BelongsToCurrentThread());
+}
+
+} // namespace net

Powered by Google App Engine
This is Rietveld 408576698