【问题标题】:iOS Libcurl Proxy C++iOS Libcurl 代理 C++
【发布时间】:2014-07-30 04:41:28
【问题描述】:

我们在通过连接到所提供移动热点网络的 iPad 上的代理时遇到困难。我们尝试根据this post 获取系统当前代理设置,但是只有在 iPad 设置 -> Wi-Fi -> 当前连接网络上的信息标签 -> HTTP 代理 -> 手动中设置代理设置时,它才会检索代理设置。这意味着我们无法通过(可能)移动互联网提供商设置的代理服务器(代理设置在 iPad 设置中不可见)。

有没有人遇到过同样的问题,你是怎么处理的? 另一个问题是,是否有任何方法可以从代理设置中找出代理用户名和密码(出于安全原因,我认为没有),或者您只需要知道这些设置并将其作为配置传递给应用程序? 提前致谢。

curl 代码不适用于移动热点代理:

void TestCurl(std::string ProxyName, std::string proxyPort){        

    CURL *curl;
    curl_global_init(CURL_GLOBAL_ALL);
    curl = curl_easy_init();

    if(curl) {
      curl_easy_setopt(curl, CURLOPT_POST, 1);
      curl_easy_setopt(curl, CURLOPT_URL, "http://someURLaddress.php");
      curl_easy_setopt(curl, CURLOPT_PORT, 80);
      curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)" );
      curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10 );
      curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &writeCallback);
      curl_easy_setopt(curl, CURLOPT_POSTFIELDS, EncryptedMessage.c_str());
      curl_easy_setopt( curl, CURLOPT_FOLLOWLOCATION, 1 );
      curl_easy_setopt( curl, CURLOPT_VERBOSE, 1 );

      std::string ProxyServerSettings = ProxyName + ":" + proxyPort;
      curl_easy_setopt( curl, CURLOPT_PROXY, ProxyServerSettings.c_str());
    }
    else{
    ...
    }
    ...//curl cleanup etc
}

【问题讨论】:

    标签: ios xcode proxy libcurl


    【解决方案1】:

    只有在 iPad 设置中设置了代理设置时,它才会检索代理设置

    如果您参考 Settings > Wi-Fi > (info) -> HTTP Proxy,您有 3 种可能性:

    1. 没有配置 HTTP 代理,
    2. 手动配置了 HTTP 代理,
    3. 有一个使用PAC 文件 URL 自动配置的 HTTP 代理(也称为代理自动配置)

    CFNetworkCopySystemProxySettingsCFNetworkCopyProxiesForURL API-s 都允许您检测相应的配置。

    特别是,您可以执行类似的操作(基于 ARC 的代码):

    + (NSDictionary *)detectProxySettings {
      NSDictionary *settings = nil;
      NSURL *url = [NSURL URLWithString:@"http://www.example.com"];
      NSURL *PAC = nil;
    
      NSDictionary *system = (NSDictionary *) CFBridgingRelease(CFNetworkCopySystemProxySettings());
      NSArray *proxies = (NSArray *) CFBridgingRelease(CFNetworkCopyProxiesForURL((__bridge CFURLRef) url, (__bridge CFDictionaryRef) system));
    
      if (![proxies count])
        return nil; // case (1)
    
      settings = [proxies objectAtIndex:0];
    
      PAC = [settings objectForKey:(NSString *) kCFProxyAutoConfigurationURLKey];
    
      if (PAC != nil) {
        // case (3)
        // ...
      }
      // else: case (2)
    
      return settings;
    }
    

    [是否]有任何方法可以从代理设置中找出代理用户名和密码

    您无法读取密码(有关详细信息,请参阅此answer)。

    话虽如此,感谢上面的system 字典,您可以:

    • 检查代理是否经过身份验证:检查system 上的@"HTTPProxyAuthenticated" 键。如果存在,则该值为布尔值 (NSNumber),指示代理是否经过身份验证,
    • 如果代理通过身份验证,则获取用户名:检查system 上的@"HTTPProxyUsername" 键。如果存在,则值为包含用户名的字符串 (NSString)。

    总结一下:如果代理通过了身份验证,有NO的方式可以自动找回密码。在这种情况下,您应该实现自己的 UI 以要求最终用户输入相应用户名的代理密码(例如使用 UIAlertViewStyleSecureTextInput)。

    【讨论】:

    • 非常感谢您的回复,与此同时,我遇到了与此非常相似的解决方案,除了我不确定如何获取 PAC 文件配置。我原以为只有手动输入凭据才能获取凭据,因此无法访问的事实使我确保不要深入研究它。谢谢
    • 太棒了!我没有详细描述 PAC 部分。通常所做的是获取 PAC 文件内容(NSString 中的stringWithContentsOfURL:usedEncoding:error 在这种情况下很方便),然后使用CFNetworkCopyProxiesForAutoConfigurationScript 获取代理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 2015-04-19
    • 2011-08-08
    相关资源
    最近更新 更多