2016-03-23 2 views
1

Мое приложение использует пользовательский подкласс 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".

Но предоставление жестко заданного значения не похоже на решение, которое будет работать правильно все время.

Пожалуйста, помогите мне с этим.

ответ

0

Для этого ответа: NSURLRequest http protocol version, для этого вам, вероятно, потребуется, по крайней мере, мост к API-интерфейсам CFNetwork.

+0

Спасибо за ваши усилия. Насколько я понимаю, нет никакого способа конвертировать 'NSURLRequest' или' NSHTTPURLResponse' в 'CFHTTPMessageRef' (http://stackoverflow.com/questions/2861740/core-foundation-equivalents-for-surlrequest-and-nsurlconnection) , Поэтому, к сожалению, я не могу использовать API CFNetworking с 'NSURLProtocol'. –

+1

Думая об этом чуть более внимательно, единственным жизнеспособным решением, которое я могу придумать, было бы, чтобы подтолкнуть инициализатор в вашей категории и использовать swizzled метод «захватить» версию HTTP в связанное хранилище объектов и вызвать исходный инициализатор. Вам также понадобится пользовательский getter/accessor, чтобы вернуть значение (пользовательская часть будет читать его обратно из связанного хранилища объектов), но тогда это может быть так же просто, как 'self.httpVersion'. Я могу предоставить более подробную информацию, если вам нравится, но это должно быть довольно просто, если раньше вы делали swizzling. – fullofsquirrels

+1

Просто, чтобы закрыть цикл на этом, я попытался описать то, что я описал в своем предыдущем комментарии, и swizzled constructor никогда не вызывается, что заставляет меня думать, что либо 'NSHTTPURLResponse' на самом деле является частью кластера классов, либо есть скрытый конструктор, используемый NSURLSessionTasks и т. п. Поэтому, неважно, неважно, что вы используете метод класса рамки, я не думаю, что на самом деле это могло бы работать из-за этого. – fullofsquirrels

0

В команде CFNetwork, по крайней мере, год назад не было практического способа получить эту информацию. На самом деле, глядя на анализ заголовков во время выполнения, я сомневаюсь, что он даже больше хранится.

Если я прав, то это также не влияет на поведение сетевого стека с этого момента, поэтому вы можете сказать, что это «HTTP/999.99», и это не имело бы значения.

Смежные вопросы