Provide HTTPVersion to NSHTTPURLResponse



我的应用程序使用自定义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;
}

相关内容

  • 没有找到相关文章

最新更新