2016-09-06 118 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);