2

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

但是提供硬编码值看起来不像是一个解决方案,它会一直正常工作。

请帮我解决这个问题。

4

3 回答 3

0

该类NSURLSessionTaskTransactionMetrics具有名为 的属性networkProtocolName。这个类实例是数组的元素之一,它也是一个名为 的属性transactionMetrics,它是在作为协议的一部分的回调方法中命名的NSURLSessionTaskMetrics输入参数的成员。metrics..didFinishCollectingMetrics:..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;
}
于 2019-12-09T13:32:59.483 回答
0

根据这个答案: NSURLRequest http 协议版本,您可能至少需要桥接到 CFNetwork API 来执行此操作。

于 2016-03-23T14:56:02.427 回答
0

根据 CFNetwork 团队的说法,至少在一年前,还没有实用的方法来获取这些信息。事实上,通过查看标头的运行时分析,我怀疑它是否已经被存储了。

如果我是对的,那么从那时起它对网络堆栈的行为也没有影响,所以你可以说它是“HTTP/999.99”,这并不重要。

于 2016-05-02T07:20:37.783 回答