Поделиться через


Кодировка содержимого

Как указано в протоколе HTTP (RFC 2616), приложения могут запросить у сервера возврат HTTP-ответов в кодированном формате. До Windows Server 2008 и Windows Vista запросы с кодировкой содержимого были отправлены приложению для обработки на их уровне. Начиная с Windows Server 2008 и Windows Vista, приложение может направлять WinINet для декодирования содержимого для схем кодирования gzip и deflate.

Чтобы включить декодирование содержимого, приложение задает параметр декодирования, запрашивающий, что WinINet выполняет декодирование от их имени. Однако включение декодирования не гарантирует, что WinINet выполнит декодирование содержимого, и приложение должно быть готово к декодирования. WinINet удаляет заголовок кодирования содержимого из ответа при успешном выполнении декодирования содержимого. Приложения должны обрабатывать декодирование содержимого независимо от того, включен или отключен параметр декодирования, если в ответе присутствует заголовок кодирования содержимого.

Если декодирование включено, приложение должно указать список поддерживаемых кодировк в заголовке запроса Accept-Encoding. Однако заголовок Accept-Encoding не обязан серверу отправлять кодированный ответ. WinINet отправляет ответы, которые не соответствуют списку допустимых кодировк обратно в приложение.

В следующем списке описаны условия, при которых WinINet выполнит декодирование содержимого при включении параметра:

  • Заголовок Accept-Encoding должен присутствовать в запросе и должен указывать схемы сжатия gzip, deflate или обе.
  • Схема кодирования, указанная в заголовке Content-Encoding, должна соответствовать одной из схем кодирования, указанных в заголовке Accept-Encoding.
  • Заголовок Content-Encoding в ответе указывает только одну схему кодирования.
  • Ответ должен содержать только один заголовок Content-Encoding. WinINet декодирует содержимое, закодированное только одной схемой кодирования.
  • Заголовок Cache-Control не должен содержать директиву no-transform.
  • Заголовок Content-Range не должен присутствовать в ответе.

Настройка параметра декомпрессии

Параметр декодирования можно задать в дескрипторе сеанса, дескрипторе запроса или дескрипторе подключения. Элемент, на котором задан параметр декодирования, определяет область декодирования. Например, настройка декодирования в сеансе позволит декодировать все подключения и запросы, созданные под этим дескриптором.

Чтобы задать параметр декодирования, приложение вызывает InternetSetOption с дескриптором, возвращенным из InternetOpen, InternetConnectили HttpOpenRequest. Параметр INTERNET_OPTION_HTTP_DECODING указан в параметре dwOption, а параметр lpBuffer указывает на логическую переменную, заданную значение true. Чтобы отключить декодирование, приложение вызывает InternetSetOption с параметром INTERNET_OPTION_HTTP_DECODING и значением булевой переменной, установленным в false.

При установке параметра декодирования WinINet выполняет декодирование по запросу при вызове приложения InternetReadFile. Если WinINet обнаруживает ошибку при декодировании содержимого, вызов InternetReadFile завершается ошибкой с ERROR_INTERNET_DECODING_FAILED. При сбое декодирования приложение имеет два варианта: он может удалить заголовок Accept-Encoding и повторно отправить запрос или задать параметр INTERNET_OPTION_HTTP_DECODING для запроса значение false, а затем повторно отправить запрос. Если для параметра декодирования задано значение false, приложение должно проверить заголовок Content-Encoding и выполнить декодирование на уровне приложения.

Заметка

WinINet не поддерживает реализации сервера. Кроме того, его не следует использовать из какого-либо сервиса. Для реализаций серверов или служб используйте Microsoft Windows HTTP Services (WinHTTP).