我的应用程序使用自定义NSURLProtocol
子类。我需要用我的副本替换NSHTTPURLResponse
,修改一些标题字段。因此,我创建新的NSHTTPURLResponse
实例,如下所示:
@implementation NSHTTPURLResponse (CocoaFix)
- (instancetype)HTTPResponseByRemovingValueForHeaderFields:(NSArray *)fields {
NSMutableDictionary *mutableHeaderFields = [self.allHeaderFields mutableCopy];
[mutableHeaderFields removeObjectsForKeys:fields];
return [[[self class] alloc] initWithURL:self.URL
statusCode:self.statusCode
HTTPVersion:@"HTTP/1.1" // What should I pass here?
headerFields:mutableHeaderFields];
}
@end
HTTPVersion
参数出现问题。我没有找到任何方法可以从原始响应中获取此值。
文档 说:
这通常表示为"HTTP/1.1"。
但是提供硬编码值看起来不像一个解决方案,它将始终正常工作。
请帮我解决这个问题。
根据这个答案:NSURLRequest http协议版本,你可能至少需要桥接到CFNetwork API才能做到这一点。
根据CFNetwork团队的说法,至少在一年前,没有实用的方法可以获取这些信息。 事实上,通过查看标头的运行时分析,我怀疑它甚至不再被存储。
如果我是对的,那么从那时起它对网络堆栈的行为也没有影响,所以你可以说它是"HTTP/999.99",这并不重要。
NSURLSessionTaskTransactionMetrics
类具有名为 networkProtocolName
的属性。这个类实例是数组的元素之一,数组也是一个名为 transactionMetrics
的属性,它是NSURLSessionTaskMetrics
的成员,该是名为 ..didFinishCollectingMetrics:..
的回调方法中名为 metrics
的输入参数,它是 NSURLSessionTaskDelegate
协议的一部分。
例如:
- (void)URLSession:(NSURLSession *)session
task:(NSURLSessionTask *)task
didFinishCollectingMetrics:(NSURLSessionTaskMetrics *)metrics API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0)) {
self.redirectCount = metrics.redirectCount;
self.networkProtocolName = metrics.transactionMetrics.lastObject.networkProtocolName;
}