2016-09-06 13 views
1

NSHTTPURLResponseのドキュメントから、HTTPバージョン(i.e. "HTTP/1.1" or "HTTP/1.0")を入手する方法が見つかりませんでした。NSHTTPURLResponseからHTTPプロトコルのバージョンを取得するには?

HTTPヘッダーフィールドは、すべてのヘッダーフィールドプロパティで使用できますが、HTTPヘッダーではないため、ヘッダーフィールド内にはHTTPプロトコルバージョンが指定されていません。

注: INIT、NSHTTPURLResponse初期化子 (initWithURL:statusCode:HTTPVersion:headerFields:)を入力としてHTTPVersionを必要としないので、理論的にはそれがそこに保存されている可能性があります。

ただし、NSURLSessionDataTaskから返された応答など、特定の応答からHTTPVersionを取得するプロパティまたはメソッドが見つかりませんでした。

答えて

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); 
関連する問題