如何在OSX上使用WPAD检索PAC脚本?是否足以获取“http://wpad/wpad.dat”的内容,希望DNS具有为此约定预先配置的“wpad”? 有没有更“正式”的做法? 以下是如何获取给定URL的PAC代理: #i
有没有更“正式”的做法?
以下是如何获取给定URL的PAC代理:#import <Foundation/Foundation.h> #import <CoreServices/CoreServices.h> #import <SystemConfiguration/SystemConfiguration.h> CFArrayRef CopyPACProxiesForURL(CFURLRef targetURL, CFErrorRef *error) { CFDictionaryRef proxies = SCDynamicStoreCopyProxies(NULL); if (!proxies) return NULL; CFNumberRef pacEnabled; if ((pacEnabled = (CFNumberRef)CFDictionaryGetValue(proxies, kSCPropNetProxiesProxyAutoConfigEnable))) { int enabled; if (CFNumberGetValue(pacEnabled, kCFNumberIntType, &enabled) && enabled) { CFStringRef pacLocation = (CFStringRef)CFDictionaryGetValue(proxies, kSCPropNetProxiesProxyAutoConfigURLString); CFURLRef pacUrl = CFURLCreateWithString(kCFAllocatorDefault, pacLocation, NULL); CFDataRef pacData; SInt32 errorCode; if (!CFURLCreateDataAndPropertiesFromResource(kCFAllocatorDefault, pacUrl, &pacData, NULL, NULL, &errorCode)) return NULL; CFStringRef pacScript = CFStringCreateFromExternalRepresentation(kCFAllocatorDefault, pacData, kCFStringEncodingISOLatin1); if (!pacScript) return NULL; CFArrayRef pacProxies = CFNetworkCopyProxiesForAutoConfigurationScript(pacScript, targetURL, error); return pacProxies; } } return NULL; } int main(int argc, const char *argv[]) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; CFURLRef targetURL = (CFURLRef)[NSURL URLWithString : @"https://stackoverflow.com/questions/4379156/retrieve-pac-script-using-wpad-on-osx/"]; CFErrorRef error = NULL; CFArrayRef proxies = CopyPACProxiesForURL(targetURL, &error); if (proxies) { for (CFIndex i = 0; i < CFArrayGetCount(proxies); i++) { CFDictionaryRef proxy = CFArrayGetValueAtIndex(proxies, i); NSLog(@"%d\n%@", i, [(id)proxy description]); } CFRelease(proxies); } [pool drain]; }
为简单起见,此代码充满了泄漏(您应该释放通过复制和创建函数获得的所有内容),并且不会处理任何潜在的错误.