2010-12-07 3 views
4

OSXでWPADを使用してPACスクリプトを取得するにはどうすればよいですか?この規約のためにDNSに "wpad"が事前に設定されていることを期待して "http://wpad/wpad.dat"の内容を取得するだけで十分ですか?OSXでWPADを使用してPACスクリプトを取得する

これを行うためのより「正式な」方法はありますか?

答えて

6

は、指定された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]; 
} 

簡略化のために、このコードは、リークがいっぱいです(あなたがコピーを通じて得たすべてのものを解放し、を作成する必要があります関数)、潜在的なエラーを処理しません。

0

準拠については、WPAD draftのセクション8を参照してください。あなたが提案するようにDNSだけを使用すると、あなたは「最小限のコンプライアンス」になります。

DNSを使用する前に、ホストがDHCPからWPAD設定を受信して​​いるかどうかを確認する必要があります。システム構成フレームワークを使用して、ホストがDHCPサーバーからオプション252パラメータを受信したかどうかを確認することができます。

EDIT:実際には、system configuration frameworkから直接WPAD URLを取得できます。 kSCPropNetProxiesProxyAutoConfigEnableに興味があるようですが、1に設定されている場合、WPADのURLはkSCPropNetProxiesProxyAutoConfigURLStringになります。ここで

関連する問題