Partilhar via


Codificação de conteúdo

Conforme especificado no protocolo HTTP (RFC 2616), os aplicativos podem solicitar que o servidor retorne respostas HTTP em formato codificado. Antes do Windows Server 2008 e do Windows Vista, as solicitações com codificação de conteúdo eram enviadas ao aplicativo para processamento em seu nível. A partir do Windows Server 2008 e do Windows Vista, o aplicativo pode direcionar o WinINet para executar a decodificação de conteúdo para os esquemas de codificação de conteúdo gzip e deflate.

Para habilitar a decodificação de conteúdo, o aplicativo define a opção de decodificação solicitando que o WinINet execute a decodificação em seu nome. No entanto, habilitar a decodificação não garante que o WinINet executará a decodificação de conteúdo, e o aplicativo deve estar preparado para lidar com a decodificação. O WinINet retira o cabeçalho de codificação de conteúdo da resposta quando a decodificação de conteúdo é executada com êxito. Espera-se que os aplicativos manipulem a decodificação de conteúdo, independentemente de a opção de decodificação estar habilitada ou desabilitada quando o cabeçalho de codificação de conteúdo estiver presente na resposta.

Quando a decodificação está habilitada, o aplicativo deve especificar a lista de codificações suportadas no cabeçalho Accept-Encoding da solicitação. O cabeçalho Accept-Encoding, no entanto, não obriga o servidor a enviar uma resposta codificada. WinINet enviará respostas que não correspondem à lista de codificações aceitáveis de volta para o aplicativo.

A lista a seguir descreve as condições sob as quais o WinINet executará a decodificação de conteúdo quando a opção estiver habilitada:

  • O cabeçalho Accept-Encoding deve estar presente na solicitação e deve especificar os esquemas de codificação gzip, deflate ou gzip e deflate.
  • O esquema de codificação especificado no cabeçalho Content-Encoding deve corresponder a um dos esquemas de codificação especificados no cabeçalho Accept-Encoding.
  • O cabeçalho Content-Encoding na resposta especifica apenas um esquema de codificação.
  • A resposta deve conter apenas um cabeçalho de codificação de conteúdo. WinINet decodifica o conteúdo que é codificado com apenas um esquema de codificação.
  • O cabeçalho Cache-Control não deve conter a diretiva no-transform.
  • O cabeçalho Content-Range não deve estar presente na resposta.

Definindo a opção de descompactação

A opção de decodificação pode ser definida no identificador de sessão, no identificador de solicitação ou no identificador de conexão. O identificador no qual a opção de decodificação é definida, define o escopo da opção de decodificação. Por exemplo, definir a decodificação na sessão permitirá a decodificação de todas as conexões e solicitações criadas sob esse identificador.

Para definir a opção de decodificação, o aplicativo chama InternetSetOption com o identificador retornado do InternetOpen, InternetConnectou HttpOpenRequest. A opção INTERNET_OPTION_HTTP_DECODING é especificada no parâmetro dwOption e o parâmetro lpBuffer aponta para uma variável booleana definida como true. Para desativar a decodificação, o aplicativo chama InternetSetOption com a opção INTERNET_OPTION_HTTP_DECODING e a variável booleana definida como false.

Quando a opção de decodificação é definida, WinINet executa a decodificação na solicitação quando o aplicativo chama InternetReadFile. Se WinINet encontrar um erro ao executar a decodificação de conteúdo, a chamada para InternetReadFile falhará com um ERROR_INTERNET_DECODING_FAILED. Quando a decodificação falha, o aplicativo tem duas opções: ele pode remover o cabeçalho Accept-Encoding e reenviar a solicitação, ou pode definir a opção INTERNET_OPTION_HTTP_DECODING na solicitação como false e, em seguida, reenviar a solicitação. Se a opção de decodificação estiver definida como false, o aplicativo deverá verificar o cabeçalho Content-Encoding e executar qualquer decodificação no nível do aplicativo.

Observação

WinINet não suporta implementações de servidor. Além disso, não deve ser usado a partir de um serviço. Para implementações ou serviços de servidor, use Microsoft Windows HTTP Services (WinHTTP).