NSURLRequest: где приложение может найти заголовки по умолчанию для HTTP-запроса?

#cocoa #ios #macos #core-foundation

#cocoa #iOS #macos #ядро-основа

Вопрос:

Кто-нибудь знает, где приложение iOS может видеть заголовки по умолчанию, которые NSUrlRequest устанавливаются для HTTP-запроса?

Просто создаю NSUrlRequest с помощью «http: // ..» NSURL , а затем спрашиваю: [request allHTTPHeaderFields] возвращает пустой словарь. Но я знаю, что, например, для «Accept-Encoding» установлено значение «gzip». Итак, я хочу получить все эти поля и показать их в демонстрации HTTP-запроса.

Я также пытался swizzle [NSMutableURLRequest setValue:forHTTPHeaderField:] , но, похоже, он не используется базовым API (NSURLRequest или NSURLConnection) для установки тех полей по умолчанию, которые я ищу.

Я создаю простую демонстрационную версию iOS, которая показывает информацию о HTTP-запросе и ответе, поэтому на самом деле не имеет значения, будет ли это публичный или частный API, используемый для этого.

Ответ №1:

Ваше приложение не может. Все это делается в CFNetwork — обмен данными с HTTP-серверами. Я полагаю, что это просто добавляет отсутствующие значения заголовка, не предоставленные NSURLRequest.

Значения по умолчанию следующие:

  • USER-AGENT «AppName — Eng/ 1.0 CFNetwork /485.13.9 Darwin / 10.7.0»
  • ПРИНЯТЬ «* / *»
  • ПРИНЯТЬ-ЯЗЫК «en-us»
  • ПРИНЯТЬ КОДИРОВКУ «gzip, deflate»
  • СОЕДИНЕНИЕ «keep-alive»

Комментарии:

1. Также есть HOST «хост: порт»;

Ответ №2:

хм … может быть, вы захотите попробовать в

 - (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse
  

метод в вашем пользовательском классе nsurlconnection. хотя в документации упоминается что-то о перенаправлениях, это, безусловно, стоит изучить.

Комментарии:

1. Хороший снимок, но, к сожалению, не на 100%.

2. Действительно, -(NSURLRequest *)connection:willSendRequest: redirectResponse: будет вызываться для простого запроса, когда перенаправление не требуется (несмотря на официальные документы), и на этом этапе в его заголовке будут некоторые поля: { Accept = "*/*"; Accept-Encoding" = "gzip, deflate"; Accept-Language" = "en-us";} но их больше: «Хост», «Пользовательский агент» и «Соединение», которые установлены на более низком уровне — я запустил простой локальный HTTP-сервер, чтобы просмотреть их все.

Ответ №3:

Возможно, это излишество, но, основываясь на сообщении в блоге Мэтта Галлахера, я создал еще более простой локальный HTTP-прослушиватель и отправил ему отдельный запрос [mutableCopy] ed, чтобы иметь возможность читать и выводить все HTTP-заголовки, которые есть в этом запросе.

Лучшим решением должна быть настройка локального перехватчика HTTP-запросов, я думаю, это должно выглядеть лучше, но для простой демонстрации, чтобы просто показывать все отправленные / полученные заголовки, это решение подходит.