Кодирование контента
Как указано в протоколе HTTP (RFC 2616), приложения могут запрашивать, чтобы сервер возвращал HTTP-ответы в закодированном формате. До Windows Server 2008 и Windows Vista запросы с кодировкой содержимого отправлялись в приложение для обработки на их уровне. Начиная с Windows Server 2008 и Windows Vista, приложение может направлять WinINet на декодирование содержимого для схем gzip и распущений.
Чтобы включить декодирование содержимого, приложение задает параметр декодирования, запрашивая, чтобы WinINet выполнял декодирование от их имени. Однако включение декодирования не гарантирует, что WinINet будет выполнять декодирование содержимого, и приложение должно быть готово к декодирования. WinINet удаляет заголовок кодирования содержимого из ответа при успешном выполнении декодирования содержимого. Ожидается, что приложения будут обрабатывать декодирование содержимого независимо от того, включен или отключен параметр декодирования, если в ответе присутствует заголовок кодирования содержимого.
Если декодирование включено, приложение должно указать список поддерживаемых кодировок в заголовке Accept-Encoding запроса. Однако заголовок Accept-Encoding не обязывает сервер отправлять закодированный ответ. WinINet будет отправлять ответы, которые не соответствуют списку допустимых кодировок, обратно в приложение.
В следующем списке описаны условия, при которых WinINet будет выполнять декодирование содержимого, если включен параметр .
- Заголовок Accept-Encoding должен присутствовать в запросе и указывать схемы кодирования gzip, deflate или 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 (WinHTTP).
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по