NSUrlSession代理请求失败,错误代码为310(kCFErrorHTTPSProxyConnectionFailure)

时间:2019-06-13 14:00:07

标签: objective-c macos proxy nsurlsession nsurlsessionconfiguration

我正在尝试通过代理服务器将POST请求发送到特定的URL。为了测试正在编写的代码是否正常运行,我在计算机上安装了 squidman ,并在端口 33074 上启动了代理服务器。我通过更改网络设置以在发出HTTP / HTTPS请求时使用代理来测试了代理服务器,并且一切正常。

现在,我编写了以下代码:

    NSDictionary* proxyConfig = @{
        (NSString*) kCFNetworkProxiesHTTPSEnable: @(1),
        (NSString*) kCFNetworkProxiesHTTPSProxy: @"127.0.0.1",
        (NSString*) kCFNetworkProxiesHTTPSPort: @"33074",
    };

    NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
    [sessionConfig setTimeoutIntervalForRequest:60];
    [sessionConfig setConnectionProxyDictionary:proxyConfig];

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    [request setURL:[NSURL URLWithString:@"https://the-host-where-im-posting"]];
    [request setHTTPMethod:@"POST"];
    [request setValue:[[NSString alloc] initWithFormat:@"%lu",length] forHTTPHeaderField:@"Content-Length"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request setHTTPBody:data];

    NSURLSession *session = [self createHttpSession];
    NSURLSessionDataTask* dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
        if(httpResponse.statusCode == 200){
            //...
        } else {
            LOGERROR(@"Error: %@", error);
        }
    }

问题是请求没有成功,并且记录了以下错误:

  

错误:错误域= kCFErrorDomainCFNetwork代码= 310“(null)” UserInfo = {_ kCFStreamErrorCodeKey = -2096,_kCFStreamErrorDomainKey = 4}

其他信息:
    1.请注意,无需设置proxyConfig字典即可完美提交请求。
    2.如果我尝试使用HTTP通过代理(通过相应地更改proxyConfig字典中的键)通过HTTP提交请求,并且在Err Code和_kCFStreamErrorCodeKey:306而不是diff上有一个小的差异,则会报告类似的错误。 310和-2094,而不是-2096。
    3.发出请求的过程作为守护程序运行。

我到底在做什么错?我想念什么?

1 个答案:

答案 0 :(得分:0)

我正在将kCFNetworkProxiesHTTPSPort字典中的proxyConfig字段设置为类型NSString的值。仔细阅读文档后,我观察到以下内容:

  

与HTTPS代理关联的端口号的键; 值是CFNumber ,它是端口号。

库遇到的对象不是CFNumber,而是使用默认端口进行HTTPS通信来连接到代理(443)。那是错误的错误处理恕我直言。本质上,它是在默默地尝试使用我不知道的端口发出请求。将proxyConfig词典更改为以下内容可解决此问题:

NSDictionary* proxyConfig = @{
    (NSString*) kCFNetworkProxiesHTTPSEnable: @(1),
    (NSString*) kCFNetworkProxiesHTTPSProxy: @"127.0.0.1",
    (NSString*) kCFNetworkProxiesHTTPSPort: @(33074),
};