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

Posted

技术标签:

【中文标题】NSUrlSession 代理请求失败,错误代码为 310 (kCFErrorHTTPSProxyConnectionFailure)【英文标题】:NSUrlSession proxy request fails with error code 310 (kCFErrorHTTPSProxyConnectionFailure) 【发布时间】:2019-06-13 14:00:07 【问题描述】:

我正在尝试通过代理服务器向特定 URL 发送 POST 请求。为了测试我正在编写的代码是否正常工作,我在我的机器上安装了 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 Code=310 "(null)" UserInfo=_kCFStreamErrorCodeKey=-2096, _kCFStreamErrorDomainKey=4

其他信息: 1.需要注意的是,请求完美提交,无需设置proxyConfig字典。 2. 如果我尝试通过代理使用 HTTP 提交请求(通过相应地更改 proxyConfig 字典中的键)在 Err Code 和 _kCFStreamErrorCodeKey: 306 而不是 310 和-2094 而不是 -2096。 3. 发出请求的进程作为守护进程运行。

我到底做错了什么?我错过了什么?

【问题讨论】:

【参考方案1】:

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

与 HTTPS 代理关联的端口号的密钥; value 是一个 CFNumber,它是端口号。

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

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

【讨论】:

以上是关于NSUrlSession 代理请求失败,错误代码为 310 (kCFErrorHTTPSProxyConnectionFailure)的主要内容,如果未能解决你的问题,请参考以下文章

NSURLSession GET 请求:DidCompleteWithError - 错误为空

POST 值在 ios 9 中出现错误(NSURLSession/NSURLConnection HTTP 加载失败(kCFStreamErrorDomainSSL,-9813)

Xcode 7.3:NSURLSession/NSURLConnection HTTP 加载失败(kCFStreamErrorDomainSSL,-9802)

NSURLSession的简单使用

Alamofire HTTPS 请求失败

iOS网络请求 添加全局代理 NSURLSessionConfiguration 解决方案