iOS Libcurl 代理 C++

标签 ios xcode proxy libcurl

我们无法通过 iPad 上的代理连接到提供的移动热点网络。我们试图根据 this 获取系统当前代理设置发布,但是只有在 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
}

最佳答案

it retrieves proxy settings only if they are set in iPad settings

如果您引用设置 > Wi-Fi >(信息)-> HTTP 代理,您有 3 种可能性:

  1. 没有配置 HTTP 代理,
  2. 有一个手动配置的 HTTP 代理,
  3. 有一个 HTTP 代理自动配置了 PAC文件 URL(又名代理自动配置)

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

特别是,您可以做类似的事情(基于 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;
}

[is] there any way of figuring out the proxy username and password from the proxy settings

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

也就是说,多亏了上面的 system 字典,您可以:

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

综上所述:如果代理已通过身份验证,则NO 无法自动检索密码。在这种情况下,您应该实现自己的 UI 以要求最终用户输入相应用户名的代理密码(例如使用 UIAlertViewStyleSecureTextInput)。

关于iOS Libcurl 代理 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24123702/

相关文章:

iphone - 如何从 shell 脚本读取 plist 信息(bundle id)

c++ - 在 Mac 上用 C++ 打印图像

reactjs - 代理请求时发生错误 - CERT_HAS_EXPIRED

c - 如何创建一个简单的代理来访问 C 中的 Web 服务器

ios - SpriteKit - 如何正确暂停和恢复应用程序

ios - UINavigationController deinit 从未调用过

Xcode 9 - 没有 iOS 11 模拟器

ios - iOS崩溃日志iPad sqlite互斥锁

ios - 在 Swift 的外部方法中获取当前 ViewController

linux - 在centos上配置squid只允许一个ip