2016-09-06 2 views
1

설명서에서 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; 

당신은 NSURLResponse 인스턴스 _CFURLResponse getter 메소드를 사용하여이 구조체를 얻을 수 있습니다 :

CFTypeRef test = CFBridgingRetain([response performSelector:NSSelectorFromString(@"_CFURLResponse")]); 
CFShow(test);