如何从给定的NSHTTPURLResponse获取HTTP协议版本?
从NSHTTPURLResponse
文档,我没有找到一种方法来获得HTTP
版本(i.e. "HTTP/1.1" or "HTTP/1.0")
。如何从给定的NSHTTPURLResponse获取HTTP协议版本?
HTTP
头字段都可以通过所有头字段属性,但是HTTP
协议版本不是标头字段中所给,因为它不是一个HTTP
报头。
注:初始化,初始化NSHTTPURLResponse
(initWithURL:statusCode:HTTPVersion:headerFields:)
确实需要HTTPVersion
作为输入,所以理论上它可能已被保存在这里。
但是,我找不到一个属性或方法从给定响应中获取HTTPVersion
,例如从NSURLSessionDataTask返回的响应。
没有公开的方式来访问NSHTTPURLResponse
实例的http版本,并且响应版本取决于请求版本。如果你真的想访问http版本,你可以使用CFNetworking
。
CFN_EXPORT CFHTTPMessageRef
CFHTTPMessageCreateResponse(
CFAllocatorRef __nullable alloc,
CFIndex statusCode,
CFStringRef __nullable statusDescription,
CFStringRef httpVersion) CF_AVAILABLE(10_1, 2_0);
而且CFHTTPMessageCopyVersion()
返回的HTTP版本。
其实-[NSHTTPURLResponse initWithURL:(NSURL *)URL statusCode:(NSInteger)statusCode HTTPVersion:(NSString *)version headerFields:(NSDictionary *)fields]
使用CFHTTPMessageCreateResponse
创建一个HTTP响应。请参阅NSURLResponse.m
NSURLResponse
支持_CFURLResponse
结构。
typedef struct _CFURLResponse {
CFRuntimeBase _base;
CFAbsoluteTime creationTime;
CFURLRef url;
CFStringRef mimeType;
int64_t expectedLength;
CFStringRef textEncoding;
CFIndex statusCode;
CFStringRef httpVersion;
CFDictionaryRef headerFields;
Boolean isHTTPResponse;
OSSpinLock parsedHeadersLock;
ParsedHeaders* parsedHeaders;
} _CFURLResponse;
typedef const struct _CFURLResponse* CFURLResponseRef;
你可以使用_CFURLResponse
getter方法这个结构上NSURLResponse
实例:
CFTypeRef test = CFBridgingRetain([response performSelector:NSSelectorFromString(@"_CFURLResponse")]);
CFShow(test);