bool DNSResolveQueue::platformProxyIsEnabledInSystemPreferences() { // Don't do DNS prefetch if proxies are involved. For many proxy types, the user agent is never exposed // to the IP address during normal operation. Querying an internal DNS server may not help performance, // as it doesn't necessarily look up the actual external IP. Also, if DNS returns a fake internal address, // local caches may keep it even after re-connecting to another network. RetainPtr<CFDictionaryRef> proxySettings = adoptCF(CFNetworkCopySystemProxySettings()); if (!proxySettings) return false; RetainPtr<CFURLRef> httpCFURL = URL(ParsedURLString, "http://example.com/").createCFURL(); RetainPtr<CFURLRef> httpsCFURL = URL(ParsedURLString, "https://example.com/").createCFURL(); RetainPtr<CFArrayRef> httpProxyArray = adoptCF(CFNetworkCopyProxiesForURL(httpCFURL.get(), proxySettings.get())); RetainPtr<CFArrayRef> httpsProxyArray = adoptCF(CFNetworkCopyProxiesForURL(httpsCFURL.get(), proxySettings.get())); CFIndex httpProxyCount = CFArrayGetCount(httpProxyArray.get()); CFIndex httpsProxyCount = CFArrayGetCount(httpsProxyArray.get()); if (httpProxyCount == 1 && CFEqual(CFDictionaryGetValue(static_cast<CFDictionaryRef>(CFArrayGetValueAtIndex(httpProxyArray.get(), 0)), kCFProxyTypeKey), kCFProxyTypeNone)) httpProxyCount = 0; if (httpsProxyCount == 1 && CFEqual(CFDictionaryGetValue(static_cast<CFDictionaryRef>(CFArrayGetValueAtIndex(httpsProxyArray.get(), 0)), kCFProxyTypeKey), kCFProxyTypeNone)) httpsProxyCount = 0; return httpProxyCount || httpsProxyCount; }
void SocketStreamHandle::chooseProxy() { #ifndef BUILDING_ON_LEOPARD RetainPtr<CFDictionaryRef> proxyDictionary(AdoptCF, CFNetworkCopySystemProxySettings()); #else // We don't need proxy information often, so there is no need to set up a permanent dynamic store session. RetainPtr<CFDictionaryRef> proxyDictionary(AdoptCF, SCDynamicStoreCopyProxies(0)); #endif // SOCKS or HTTPS (AKA CONNECT) proxies are supported. // WebSocket protocol relies on handshake being transferred unchanged, so we need a proxy that will not modify headers. // Since HTTP proxies must add Via headers, they are highly unlikely to work. // Many CONNECT proxies limit connectivity to port 443, so we prefer SOCKS, if configured. if (!proxyDictionary) { m_connectionType = Direct; return; } // CFNetworkCopyProxiesForURL doesn't know about WebSocket schemes, so pretend to use http. // Always use "https" to get HTTPS proxies in result - we'll try to use those for ws:// even though many are configured to reject connections to ports other than 443. RetainPtr<CFArrayRef> proxyArray(AdoptCF, CFNetworkCopyProxiesForURL(m_httpsURL.get(), proxyDictionary.get())); chooseProxyFromArray(proxyArray.get()); }
static void addProxyServersForURL(Vector<ProxyServer>& proxyServers, const KURL& url) { RetainPtr<CFDictionaryRef> proxySettings(AdoptCF, CFNetworkCopySystemProxySettings()); if (!proxySettings) return; RetainPtr<CFURLRef> cfURL(AdoptCF, url.createCFURL()); RetainPtr<CFArrayRef> proxiesForURL(AdoptCF, CFNetworkCopyProxiesForURL(cfURL.get(), proxySettings.get())); if (!proxiesForURL) return; processProxyServers(proxyServers, proxiesForURL.get(), cfURL.get()); }
static void addProxyServersForURL(Vector<ProxyServer>& proxyServers, const KURL& url) { RetainPtr<CFDictionaryRef> proxySettings(AdoptCF, CFNetworkCopySystemProxySettings()); if (!proxySettings) return; RetainPtr<CFURLRef> cfURL(AdoptCF, url.createCFURL()); RetainPtr<CFArrayRef> proxiesForURL(AdoptCF, CFNetworkCopyProxiesForURL(cfURL.get(), proxySettings.get())); if (!proxiesForURL) return; CFIndex numProxies = CFArrayGetCount(proxiesForURL.get()); for (CFIndex i = 0; i < numProxies; ++i) { CFDictionaryRef proxyDictionary = static_cast<CFDictionaryRef>(CFArrayGetValueAtIndex(proxiesForURL.get(), i)); ProxyServer::Type type = ProxyServer::Direct; CFStringRef typeString = static_cast<CFStringRef>(CFDictionaryGetValue(proxyDictionary, kCFProxyTypeKey)); if (CFEqual(typeString, kCFProxyTypeAutoConfigurationURL)) { // FIXME: Handle PAC URLs. continue; } if (CFEqual(typeString, kCFProxyTypeNone)) { proxyServers.append(ProxyServer(ProxyServer::Direct, String(), -1)); continue; } if (CFEqual(typeString, kCFProxyTypeHTTP)) type = ProxyServer::HTTP; else if (CFEqual(typeString, kCFProxyTypeHTTPS)) type = ProxyServer::HTTPS; else if (CFEqual(typeString, kCFProxyTypeSOCKS)) type = ProxyServer::SOCKS; else { // We don't know how to handle this type. continue; } CFStringRef host = static_cast<CFStringRef>(CFDictionaryGetValue(proxyDictionary, kCFProxyHostNameKey)); CFNumberRef port = static_cast<CFNumberRef>(CFDictionaryGetValue(proxyDictionary, kCFProxyPortNumberKey)); SInt32 portValue; CFNumberGetValue(port, kCFNumberSInt32Type, &portValue); proxyServers.append(ProxyServer(type, host, portValue)); } }
JNIEXPORT jobjectArray JNICALL Java_com_zimbra_znative_ProxyInfo_getProxyInfo(JNIEnv *env, jclass cls, jstring jurl) { check_initialized(env); CFStringRef urlstr = getCFString(env, jurl); CFURLRef url = CFURLCreateWithString(NULL, urlstr, NULL); CFDictionaryRef systemProxy = CFNetworkCopySystemProxySettings(); CFArrayRef proxyArray = CFNetworkCopyProxiesForURL(url, systemProxy); CFIndex size = CFArrayGetCount(proxyArray); jobjectArray results = (*env)->NewObjectArray(env, (jsize) size, pi_cls, NULL); int i; for (i = 0; i < size; i++) { CFDictionaryRef proxy = CFArrayGetValueAtIndex(proxyArray, i); (*env)->SetObjectArrayElement(env, results, i, getProxyInfo(env, proxy)); } CFRelease(proxyArray); CFRelease(systemProxy); CFRelease(url); CFRelease(urlstr); return results; }