OSXでWPADを使用してPACスクリプトを取得するにはどうすればよいですか?この規約のためにDNSに "wpad"が事前に設定されていることを期待して "http://wpad/wpad.dat"の内容を取得するだけで十分ですか?OSXでWPADを使用してPACスクリプトを取得する
これを行うためのより「正式な」方法はありますか?
OSXでWPADを使用してPACスクリプトを取得するにはどうすればよいですか?この規約のためにDNSに "wpad"が事前に設定されていることを期待して "http://wpad/wpad.dat"の内容を取得するだけで十分ですか?OSXでWPADを使用してPACスクリプトを取得する
これを行うためのより「正式な」方法はありますか?
は、指定された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 : @"http://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];
}
簡略化のために、このコードは、リークがいっぱいです(あなたがコピーを通じて得たすべてのものを解放し、を作成する必要があります関数)、潜在的なエラーを処理しません。
準拠については、WPAD draftのセクション8を参照してください。あなたが提案するようにDNSだけを使用すると、あなたは「最小限のコンプライアンス」になります。
DNSを使用する前に、ホストがDHCPからWPAD設定を受信しているかどうかを確認する必要があります。システム構成フレームワークを使用して、ホストがDHCPサーバーからオプション252パラメータを受信したかどうかを確認することができます。
EDIT:実際には、system configuration frameworkから直接WPAD URLを取得できます。 kSCPropNetProxiesProxyAutoConfigEnable
に興味があるようですが、1
に設定されている場合、WPADのURLはkSCPropNetProxiesProxyAutoConfigURLString
になります。ここで