Мое приложение использует пользовательский подкласс NSURLProtocol
. Мне нужно заменить NSHTTPURLResponse
моей копией, изменив некоторые поля заголовков. Итак, я создаю новый экземпляр NSHTTPURLResponse
, как это:Предоставить HTTPVersion для NSHTTPURLResponse
@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-surlrequest-and-nsurlconnection) , Поэтому, к сожалению, я не могу использовать API CFNetworking с 'NSURLProtocol'. –
Думая об этом чуть более внимательно, единственным жизнеспособным решением, которое я могу придумать, было бы, чтобы подтолкнуть инициализатор в вашей категории и использовать swizzled метод «захватить» версию HTTP в связанное хранилище объектов и вызвать исходный инициализатор. Вам также понадобится пользовательский getter/accessor, чтобы вернуть значение (пользовательская часть будет читать его обратно из связанного хранилища объектов), но тогда это может быть так же просто, как 'self.httpVersion'. Я могу предоставить более подробную информацию, если вам нравится, но это должно быть довольно просто, если раньше вы делали swizzling. – fullofsquirrels
Просто, чтобы закрыть цикл на этом, я попытался описать то, что я описал в своем предыдущем комментарии, и swizzled constructor никогда не вызывается, что заставляет меня думать, что либо 'NSHTTPURLResponse' на самом деле является частью кластера классов, либо есть скрытый конструктор, используемый NSURLSessionTasks и т. п. Поэтому, неважно, неважно, что вы используете метод класса рамки, я не думаю, что на самом деле это могло бы работать из-за этого. – fullofsquirrels