Condividi tramite


Codifica contenuto

Come specificato nelle applicazioni del protocollo HTTP (RFC 2616) può richiedere che il server restituisca risposte HTTP in formato codificato. Prima di Windows Server 2008 e Windows Vista, le richieste con codifica del contenuto sono state inviate all'applicazione per l'elaborazione a livello relativo. A partire da Windows Server 2008 e Windows Vista, l'applicazione può indirizzare WinINet per 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 conto dell'applicazione. Tuttavia, l'abilitazione della decodifica non garantisce che WinINet eseguirà la decodifica del contenuto e l'applicazione deve essere preparata per gestire la decodifica. WinINet rimuove l'intestazione di codifica del contenuto dalla risposta quando viene eseguita correttamente la decodifica del contenuto. Le applicazioni devono gestire la decodifica del contenuto indipendentemente dal fatto che l'opzione di decodifica sia abilitata o disabilitata quando l'intestazione di codifica del contenuto è presente nella risposta.

Quando la decodifica è abilitata, l'applicazione deve specificare l'elenco delle codifica supportate nell'intestazione Accept-Encoding della richiesta. L'intestazione Accept-Encoding, tuttavia, non impone al server di inviare una risposta codificata. WinINet invierà risposte che non corrispondono all'elenco di codifica 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 solo uno 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 sull'handle della sessione, sull'handle di richiesta o sull'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 in tale handle.

Per impostare l'opzione di decodifica, l'applicazione chiama InternetSetOption con l'handle restituito da InternetOpen, InternetConnect o 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 non riesce 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 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 Codifica contenuto ed eseguire qualsiasi decodifica a livello di applicazione.

Nota

WinINet non supporta le implementazioni del server. Inoltre, non deve essere usato da un servizio. Per le implementazioni o i servizi server usano Microsoft Windows HTTP Services (WinHTTP).