Gestione dei cookie in WinHTTP

I dati della sessione HTTP vengono passati tra il client e il server nell'intestazione cookie della richiesta o della risposta. Il server invia cookie al client nell'intestazione Set-cookie della risposta e l'API WinHTTP invia nuovamente il cookie del server al server nell'intestazione cookie della richiesta. Le specifiche di gestione dei cookie, descritte in rfc 2109 (meccanismo di gestione dello stato HTTP), vengono implementate per impostazione predefinita in WinHTTP. Le specifiche di gestione dei cookie recenti, descritte in rfc 2964, non sono supportate da WinHTTP.

WinHTTP ottiene il cookie dai server Set-Cookie'intestazione e lo archivia in una cache su base sessione. Questo cookie viene eseguito nuovamente nelle richieste successive nella stessa sessione WinHTTP in cui la destinazione corrisponde all'origine del cookie. L'API WinHTTP rigenera l'intestazione del cookie di richiesta per ogni gamba nella richiesta.

L'elenco seguente descrive diverse opzioni che le applicazioni client WinHTTP possono usare per gestire i cookie:

  • Gestione automatica dei cookie : WinHTTP gestisce automaticamente i cookie e l'applicazione client non esegue alcuna gestione dei cookie personalizzata.
  • Disabilitare la gestione automatica dei cookie: la gestione automatica dei cookie nell'API WinHTTP è disabilitata e non vengono inviati cookie.
  • Specificare manualmente tutti i cookie: la gestione automatica dei cookie è disabilitata e l'applicazione client aggiunge o rimuove tutte le intestazioni dei cookie per ogni richiesta nella sessione.
  • Gestione manuale e automatica dei cookie: combinare la gestione automatica e manuale dei cookie.

Per disabilitare la gestione dei cookie, l'applicazione client WinHTTP chiama la funzione WinHttpSetOption con il parametro dwOption impostato su WINHTTP_OPTION_DISABLE_FEATURE e il parametro lpBuffer impostato su WINHTTP_DISABLE_COOKIES. Il parametro hInternet deve essere un handle di richiesta. Quando la gestione dei cookie è disabilitata in un handle di richiesta che ha inviato una richiesta precedente, il client deve rimuovere manualmente le intestazioni dei cookie di richiesta esistenti con la funzione WinHttpAddRequestHeaders prima di inviare la richiesta successiva. Per altre informazioni, vedere Rimozione delle intestazioni dei cookie.

Nota

L'applicazione client deve impostare tutti i cookie nella sessione dopo che la modalità automatica è stata disabilitata.

Specificare manualmente tutti i cookie

Quando la gestione automatica dei cookie è disabilitata, l'applicazione client WinHTTP ha la possibilità di specificare manualmente tutti i cookie. Per impostare manualmente il cookie, l'applicazione chiama WinHttpAddRequestHeaders specificando l'intestazione del cookie nel parametro pwszHeaders . L'applicazione client deve cancellare tutte le intestazioni dei cookie prima di inviare nuovamente la richiesta.

L'applicazione client deve anche modificare l'intestazione del cookie quando la richiesta è stata reindirizzata. Per modificare il cookie sulle richieste reindirizzate, il client specifica una funzione di callback con WinHttpSetStatusCallback che risponde al caso di callback di reindirizzamento. Il gestore di callback deve cancellare il cookie inviato in precedenza nella richiesta chiamando WinHttpAddRequestHeaders. Per altre informazioni sulla rimozione delle intestazioni dei cookie, vedere Rimozione delle intestazioni dei cookie.

Le applicazioni client WinHTTP possono combinare il meccanismo di gestione automatica dei cookie WinHTTP con la gestione manuale dei cookie. L'applicazione aggiunge cookie personalizzati all'intestazione cookie generata automaticamente prima di inviare la richiesta con la funzione WinHttpSendRequest . Il cookie personalizzato deve essere la prima intestazione del cookie nella richiesta per l'API WinHTTP per memorizzare correttamente nella cache il cookie. L'applicazione client deve anche rimuovere i cookie inviati alle richieste precedenti prima di inviare nuovamente una richiesta nello stesso handle di richiesta. Per altre informazioni, vedere Rimozione delle intestazioni dei cookie.

I cookie aggiunti a una richiesta prima della chiamata a WinHttpSendRequest sono inclusi in tutte le richieste WinHTTP inviate per conto delle chiamate WinHttpSendRequest e WinHttpReceiveResponse . L'applicazione client potrebbe dover cancellare l'intestazione del cookie quando la richiesta è stata reindirizzata. Per cancellare il cookie sulle richieste reindirizzate, il client specifica una funzione di callback con WinHttpSetStatusCallback che risponde al caso di callback di reindirizzamento. Il gestore di callback deve cancellare il cookie inviato in precedenza nella richiesta chiamando WinHttpAddRequestHeaders. La funzione di callback potrebbe non impostare nuovi cookie personalizzati sul callback di reindirizzamento. Il client deve attendere il completamento di WinHttpReceiveResponse prima di aggiungere nuovi cookie per la chiamata WinHttpSendRequest successiva.

L'applicazione client WinHTTP potrebbe dover cancellare il cookie di richiesta esistente prima di inviare nuovamente una richiesta per impedire che i cookie inviati alle richieste precedenti vengano inviati nuovamente nella richiesta corrente; per altre informazioni, vedere la nota seguente. Tenere presente anche che i cookie non devono essere cancellati prima dell'invio della prima richiesta nell'handle della richiesta. Il client può cancellare i cookie esistenti chiamando WinHttpAddRequestHeaders con un'intestazione di cookie vuota nel parametro pwszHeaders e il flag WINHTTP_ADDREQ_FLAG_REPLACE impostato nel parametro dwModifier . Nell'esempio di codice seguente viene illustrato come cancellare l'intestazione del cookie nella richiesta.

WinHttpAddRequestHeaders(hRequest, 
                         L"Cookie:", 
                         -1, 
                         WINHTTP_ADDREQ_FLAG_REPLACE);

L'API WinHTTP presenta comportamenti di gestione dei cookie diversi per le versioni del sistema operativo precedenti a Windows XP con Service Pack 2 (SP2) e Windows Server 2003 con Service Pack 1 (SP1).

**Windows XP con SP2 e versioni successive e Windows Server 2003 con SP1 e versioni successive: **

L'API WinHTTP cancella tutti i cookie inviati alle richieste precedenti per l'handle della richiesta. Il client può aggiungere manualmente nuove intestazioni di cookie prima di ogni chiamata a WinHttpSendRequest. Se la funzionalità di gestione automatica dei cookie dell'API WinHTTP non è stata disabilitata, l'API WinHTTP aggiungerà la nuova intestazione del cookie (o aggiungere una nuova intestazione cookie se l'applicazione client non ne ha aggiunta una manualmente) con il cookie dal server.

**Windows XP con SP2 e Windows Server 2003 con SP1: **

L'API WinHTTP non cancella l'intestazione del cookie della richiesta dopo il completamento di WinHttpReceiveResponse . I cookie inviati nelle richieste precedenti verranno restituiti nelle chiamate successive a WinHttpSendRequest. L'applicazione client WinHTTP deve cancellare le intestazioni dei cookie esistenti prima di inviare nuovamente una richiesta nell'handle della richiesta.