2016-09-06 93 views
1

NSHTTPURLResponse文档,我没有找到一种方法来获得HTTP版本(i.e. "HTTP/1.1" or "HTTP/1.0")如何从给定的NSHTTPURLResponse获取HTTP协议版本?

HTTP头字段都可以通过所有头字段属性,但是HTTP协议版本不是标头字段中所给,因为它不是一个HTTP报头。

注:初始化,初始化NSHTTPURLResponse (initWithURL:statusCode:HTTPVersion:headerFields:)确实需要HTTPVersion作为输入,所以理论上它可能已被保存在这里。

但是,我找不到一个属性或方法从给定响应中获取HTTPVersion,例如从NSURLSessionDataTask返回的响应。

回答

2

没有公开的方式来访问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);