NSUrlSession 代理请求失败,错误代码为 310 (kCFErrorHTTPSProxyConnectionFailure)
NSUrlSession proxy request fails with error code 310 (kCFErrorHTTPSProxyConnectionFailure)
我正在尝试通过代理服务器向特定 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);
}
}
问题是请求不成功并记录了以下错误:
Error: Error Domain=kCFErrorDomainCFNetwork Code=310 "(null)" UserInfo={_kCFStreamErrorCodeKey=-2096, _kCFStreamErrorDomainKey=4}
附加信息:
1.需要注意的是,没有设置proxyConfig
字典,请求也能完美提交。
2. 如果我尝试通过代理使用 HTTP 提交请求(通过相应地更改 proxyConfig
字典中的键),并且在错误代码和 _kCFStreamErrorCodeKey 中有一个小差异,则会报告类似的错误:306 而不是310 和 -2094 而不是 -2096。
3.发出请求的进程作为守护进程运行。
我到底做错了什么?我错过了什么?
我正在将 proxyConfig
字典中的 kCFNetworkProxiesHTTPSPort
字段设置为 NSString
类型的值。在仔细阅读它的文档后,我观察到以下内容:
Key for the port number associated with the HTTPS proxy; value is a CFNumber which is the port number.
库遇到了一个不是 CFNumber
的对象,并且正在使用 HTTPS 通信的默认端口来连接到代理 (443)。那是糟糕的错误处理恕我直言。它本质上是在默默地尝试使用我不知道的端口发出请求。将 proxyConfig
字典更改为以下内容修复了问题:
NSDictionary* proxyConfig = @{
(NSString*) kCFNetworkProxiesHTTPSEnable: @(1),
(NSString*) kCFNetworkProxiesHTTPSProxy: @"127.0.0.1",
(NSString*) kCFNetworkProxiesHTTPSPort: @(33074),
};
我正在尝试通过代理服务器向特定 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);
}
}
问题是请求不成功并记录了以下错误:
Error: Error Domain=kCFErrorDomainCFNetwork Code=310 "(null)" UserInfo={_kCFStreamErrorCodeKey=-2096, _kCFStreamErrorDomainKey=4}
附加信息:
1.需要注意的是,没有设置proxyConfig
字典,请求也能完美提交。
2. 如果我尝试通过代理使用 HTTP 提交请求(通过相应地更改 proxyConfig
字典中的键),并且在错误代码和 _kCFStreamErrorCodeKey 中有一个小差异,则会报告类似的错误:306 而不是310 和 -2094 而不是 -2096。
3.发出请求的进程作为守护进程运行。
我到底做错了什么?我错过了什么?
我正在将 proxyConfig
字典中的 kCFNetworkProxiesHTTPSPort
字段设置为 NSString
类型的值。在仔细阅读它的文档后,我观察到以下内容:
Key for the port number associated with the HTTPS proxy; value is a CFNumber which is the port number.
库遇到了一个不是 CFNumber
的对象,并且正在使用 HTTPS 通信的默认端口来连接到代理 (443)。那是糟糕的错误处理恕我直言。它本质上是在默默地尝试使用我不知道的端口发出请求。将 proxyConfig
字典更改为以下内容修复了问题:
NSDictionary* proxyConfig = @{
(NSString*) kCFNetworkProxiesHTTPSEnable: @(1),
(NSString*) kCFNetworkProxiesHTTPSProxy: @"127.0.0.1",
(NSString*) kCFNetworkProxiesHTTPSPort: @(33074),
};