Home | History | Annotate | Download | only in proxy
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "net/proxy/proxy_config_service_ios.h"
      6 
      7 #include <CoreFoundation/CoreFoundation.h>
      8 #include <CFNetwork/CFProxySupport.h>
      9 
     10 #include "base/mac/foundation_util.h"
     11 #include "base/mac/scoped_cftyperef.h"
     12 #include "base/message_loop/message_loop.h"
     13 #include "base/strings/sys_string_conversions.h"
     14 #include "net/proxy/proxy_config.h"
     15 
     16 namespace net {
     17 
     18 namespace {
     19 
     20 const int kPollIntervalSec = 10;
     21 
     22 // Utility function to pull out a boolean value from a dictionary and return it,
     23 // returning a default value if the key is not present.
     24 bool GetBoolFromDictionary(CFDictionaryRef dict,
     25                            CFStringRef key,
     26                            bool default_value) {
     27   CFNumberRef number =
     28       base::mac::GetValueFromDictionary<CFNumberRef>(dict, key);
     29   if (!number)
     30     return default_value;
     31 
     32   int int_value;
     33   if (CFNumberGetValue(number, kCFNumberIntType, &int_value))
     34     return int_value;
     35   else
     36     return default_value;
     37 }
     38 
     39 void GetCurrentProxyConfig(ProxyConfig* config) {
     40   base::ScopedCFTypeRef<CFDictionaryRef> config_dict(
     41       CFNetworkCopySystemProxySettings());
     42   DCHECK(config_dict);
     43 
     44   // Auto-detect is not supported.
     45   // The kCFNetworkProxiesProxyAutoDiscoveryEnable key is not available on iOS.
     46 
     47   // PAC file
     48 
     49   if (GetBoolFromDictionary(config_dict.get(),
     50                             kCFNetworkProxiesProxyAutoConfigEnable,
     51                             false)) {
     52     CFStringRef pac_url_ref = base::mac::GetValueFromDictionary<CFStringRef>(
     53         config_dict.get(), kCFNetworkProxiesProxyAutoConfigURLString);
     54     if (pac_url_ref)
     55       config->set_pac_url(GURL(base::SysCFStringRefToUTF8(pac_url_ref)));
     56   }
     57 
     58   // Proxies (for now http).
     59 
     60   // The following keys are not available on iOS:
     61   //   kCFNetworkProxiesFTPEnable
     62   //   kCFNetworkProxiesFTPProxy
     63   //   kCFNetworkProxiesFTPPort
     64   //   kCFNetworkProxiesHTTPSEnable
     65   //   kCFNetworkProxiesHTTPSProxy
     66   //   kCFNetworkProxiesHTTPSPort
     67   //   kCFNetworkProxiesSOCKSEnable
     68   //   kCFNetworkProxiesSOCKSProxy
     69   //   kCFNetworkProxiesSOCKSPort
     70   if (GetBoolFromDictionary(config_dict.get(),
     71                             kCFNetworkProxiesHTTPEnable,
     72                             false)) {
     73     ProxyServer proxy_server =
     74         ProxyServer::FromDictionary(ProxyServer::SCHEME_HTTP,
     75                                     config_dict.get(),
     76                                     kCFNetworkProxiesHTTPProxy,
     77                                     kCFNetworkProxiesHTTPPort);
     78     if (proxy_server.is_valid()) {
     79       config->proxy_rules().type =
     80           ProxyConfig::ProxyRules::TYPE_PROXY_PER_SCHEME;
     81       config->proxy_rules().proxies_for_http.SetSingleProxyServer(proxy_server);
     82       // Desktop Safari applies the HTTP proxy to http:// URLs only, but
     83       // Mobile Safari applies the HTTP proxy to https:// URLs as well.
     84       config->proxy_rules().proxies_for_https.SetSingleProxyServer(
     85           proxy_server);
     86     }
     87   }
     88 
     89   // Proxy bypass list is not supported.
     90   // The kCFNetworkProxiesExceptionsList key is not available on iOS.
     91 
     92   // Proxy bypass boolean is not supported.
     93   // The kCFNetworkProxiesExcludeSimpleHostnames key is not available on iOS.
     94 
     95   // Source
     96   config->set_source(PROXY_CONFIG_SOURCE_SYSTEM);
     97 }
     98 
     99 }  // namespace
    100 
    101 ProxyConfigServiceIOS::ProxyConfigServiceIOS()
    102     : PollingProxyConfigService(base::TimeDelta::FromSeconds(kPollIntervalSec),
    103                                 GetCurrentProxyConfig) {
    104 }
    105 
    106 ProxyConfigServiceIOS::~ProxyConfigServiceIOS() {
    107 }
    108 
    109 }  // namespace net
    110