私のアプリケーションでは、カスタム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" として表現されます。
しかし、ハードコードされた値を提供することは、解決策のようには見えません。常に正しく動作します。
お願いします。
あなたの努力に感謝します。私が理解する限り、 'NSURLRequest'または' NSHTTPURLResponse'を 'CFHTTPMessageRef'に変換する方法はありません(http://stackoverflow.com/questions/2861740/core-foundation-equivalents-for-nsurlrequest-and-nsurlconnection) 。だから残念ながら、私は 'NSURLProtocol'でCFNetworking APIを使うことはできません。 –
これをもう少し詳しく考えてみましょう。あなたのカテゴリーの初期化子を揺るがし、関連するオブジェクトストレージにHTTPバージョンを「キャプチャ」して、元のイニシャライザを起動させるだけです。また、値を取り戻すためにカスタムgetter/accessorが必要です(カスタムパーツは関連するオブジェクトストレージからそれを読み返すことになります)。しかし、それは 'self.httpVersion'のように単純なものになります。私はあなたが好きならもっと詳細を提供することができますが、前にうわべをしてしまえばそれはかなり簡単です。 – fullofsquirrels
ちょうどこのループを閉じるために私は私の前のコメントで説明したものを試してみました。そしてswizzledコンストラクタは決して呼び出されません。これは 'NSHTTPURLResponse'が実際にクラスクラスタの一部であると信じます。 NSURLSessionTasksなどで使用されるコンストラクタです。だから、フレームワーククラスのメソッドを驚かせることのないことを決して気にしないで、私は実際には*これが働くとは思えませんでした。 – fullofsquirrels