Compartilhar via


Codificação de Conteúdo

Conforme especificado no protocolo HTTP (RFC 2616), os aplicativos podem solicitar que o servidor retorne respostas HTTP no 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 remove 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 lidem com 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 com suporte 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. O WinINet enviará respostas que não correspondem à lista de codificações aceitáveis de volta ao 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 Content-Encoding. O WinINet decodifica o conteúdo 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 está 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 nesse identificador.

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

Quando a opção de decodificação é definida, o WinINet executa a decodificação na solicitação quando o aplicativo chama InternetReadFile. Se o 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: pode remover o cabeçalho Accept-Encoding e reenviar a solicitação ou 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á marcar o cabeçalho Content-Encoding e executar qualquer decodificação no nível do aplicativo.

Observação

O WinINet não dá suporte a implementações de servidor. Além disso, ele não deve ser usado de um serviço. Para implementações de servidor ou serviços, use Os Serviços HTTP do Microsoft Windows (WinHTTP).