2016-03-23 4 views
1

私のアプリケーションでは、カスタムNSURLProtocolサブクラスを使用しています。私はNSHTTPURLResponseを私のコピーに置き換え、いくつかのヘッダーフィールドを変更する必要があります。だから、私はそのように、新しいNSHTTPURLResponseインスタンスを作成します。NSHTTPURLResponseにHTTPVersionを提供

@implementation NSHTTPURLResponse (CocoaFix) 

- (instancetype)HTTPResponseByRemovingValueForHeaderFields:(NSArray *)fields { 
    NSMutableDictionary *mutableHeaderFields = [self.allHeaderFields mutableCopy]; 
    [mutableHeaderFields removeObjectsForKeys:fields]; 
    return [[[self class] alloc] initWithURL:self.URL 
            statusCode:self.statusCode 
           HTTPVersion:@"HTTP/1.1" // What should I pass here? 
           headerFields:mutableHeaderFields]; 
} 

@end 

問題はHTTPVersionパラメータで発生します。私は元の応答からこの価値を得る方法を見つけませんでした。

ドキュメントは言う:

これは、典型的には、 "HTTP/1.1" として表現されます。

しかし、ハードコードされた値を提供することは、解決策のようには見えません。常に正しく動作します。

お願いします。

答えて

0

この回答には、NSURLRequest http protocol version、少なくともこれを行うには、CFNetwork APIにブリッジする必要があります。

+0

あなたの努力に感謝します。私が理解する限り、 'NSURLRequest'または' NSHTTPURLResponse'を 'CFHTTPMessageRef'に変換する方法はありません(http://stackoverflow.com/questions/2861740/core-foundation-equivalents-for-nsurlrequest-and-nsurlconnection) 。だから残念ながら、私は 'NSURLProtocol'でCFNetworking APIを使うことはできません。 –

+1

これをもう少し詳しく考えてみましょう。あなたのカテゴリーの初期化子を揺るがし、関連するオブジェクトストレージにHTTPバージョンを「キャプチャ」して、元のイニシャライザを起動させるだけです。また、値を取り戻すためにカスタムgetter/accessorが必要です(カスタムパーツは関連するオブジェクトストレージからそれを読み返すことになります)。しかし、それは 'self.httpVersion'のように単純なものになります。私はあなたが好きならもっと詳細を提供することができますが、前にうわべをしてしまえばそれはかなり簡単です。 – fullofsquirrels

+1

ちょうどこのループを閉じるために私は私の前のコメントで説明したものを試してみました。そしてswizzledコンストラクタは決して呼び出されません。これは 'NSHTTPURLResponse'が実際にクラスクラスタの一部であると信じます。 NSURLSessionTasksなどで使用されるコンストラクタです。だから、フレームワーククラスのメソッドを驚かせることのないことを決して気にしないで、私は実際には*これが働くとは思えませんでした。 – fullofsquirrels

0

CFNetworkチームによれば、少なくとも1年前の時点では、その情報を入手する実際的な方法はありませんでした。実際、ヘッダーの実行時分析を見ても、それはもはや格納されていないのではないかと疑います。

もし私が正しいとすれば、それはネットワーキングスタックのその点からの動作にも影響しないので、 "HTTP/999.99"と言っても問題はありません。

関連する問題