Condividi tramite


Codifica del contenuto

Come specificato nelle applicazioni del protocollo HTTP (RFC 2616) può richiedere che il server restituisca risposte HTTP in formato codificato. Nelle versioni precedenti a Windows Server 2008 e Windows Vista, le richieste con codifica del contenuto sono state inviate all'applicazione per l'elaborazione al loro livello. A partire da Windows Server 2008 e Windows Vista, l'applicazione può indirizzare WinINet a eseguire la decodifica del contenuto per gli schemi di codifica del contenuto gzip e deflate.

Per abilitare la decodifica del contenuto, l'applicazione imposta l'opzione di decodifica che richiede che WinINet esegua la decodifica per suo conto. Tuttavia, l'abilitazione della decodifica non garantisce che WinINet esegua la decodifica del contenuto e che l'applicazione sia pronta a gestire la decodifica. WinINet rimuove l'intestazione content-encoding dalla risposta quando la decodifica del contenuto viene eseguita correttamente. Le applicazioni devono gestire la decodifica del contenuto indipendentemente dal fatto che l'opzione di decodifica sia abilitata o disabilitata quando l'intestazione content-encoding è presente nella risposta.

Quando la decodifica è abilitata, l'applicazione deve specificare l'elenco delle codifiche supportate nell'intestazione Accept-Encoding della richiesta. L'intestazione Accept-Encoding, tuttavia, non obbliga il server a inviare una risposta codificata. WinINet invierà risposte che non corrispondono all'elenco di codifiche accettabili all'applicazione.

L'elenco seguente descrive le condizioni in cui WinINet eseguirà la decodifica del contenuto quando l'opzione è abilitata:

  • L'intestazione Accept-Encoding deve essere presente nella richiesta e deve specificare gli schemi di codifica gzip, deflate o gzip e deflate.
  • Lo schema di codifica specificato nell'intestazione Content-Encoding deve corrispondere a uno degli schemi di codifica specificati nell'intestazione Accept-Encoding.
  • L'intestazione Content-Encoding nella risposta specifica un solo schema di codifica.
  • La risposta deve contenere solo un'intestazione Content- Encoding. WinINet decodifica il contenuto codificato con un solo schema di codifica.
  • L'intestazione Cache-Control non deve contenere la direttiva no-transform.
  • L'intestazione Content-Range non deve essere presente nella risposta.

Impostazione dell'opzione decompressione

L'opzione di decodifica può essere impostata nell'handle di sessione, nell'handle di richiesta o nell'handle di connessione. L'handle in cui è impostata l'opzione di decodifica definisce l'ambito dell'opzione di decodifica. Ad esempio, l'impostazione della decodifica nella sessione consentirà di decodificare tutte le connessioni e le richieste create con tale handle.

Per impostare l'opzione di decodifica, l'applicazione chiama InternetSetOption con l'handle restituito da InternetOpen, InternetConnecto HttpOpenRequest. L'opzione INTERNET_OPTION_HTTP_DECODING viene specificata nel parametro dwOption e il parametro lpBuffer punta a una variabile booleana impostata su true. Per disabilitare la decodifica, l'applicazione chiama InternetSetOption con l'opzione INTERNET_OPTION_HTTP_DECODING e la variabile booleana impostata su false.

Quando l'opzione di decodifica è impostata, WinINet esegue la decodifica nella richiesta quando l'applicazione chiama InternetReadFile. Se WinINet rileva un errore durante l'esecuzione della decodifica del contenuto, la chiamata a InternetReadFile ha esito negativo con un ERROR_INTERNET_DECODING_FAILED. Quando la decodifica ha esito negativo, l'applicazione ha due opzioni: può rimuovere l'intestazione Accept-Encoding e inviare nuovamente la richiesta oppure può impostare l'opzione INTERNET_OPTION_HTTP_DECODING sulla richiesta su false e quindi inviare nuovamente la richiesta. Se l'opzione di decodifica è impostata su false, l'applicazione deve controllare l'intestazione Content-Encoding ed eseguire qualsiasi decodifica a livello di applicazione.

Nota

WinINet non supporta le implementazioni del server. Inoltre, non deve essere usato tramite un servizio. Per le implementazioni del server o i servizi, usare Servizi HTTP Di Microsoft Windows (WinHTTP).