Bagikan melalui


Penanganan cookie di WinHTTP

Data sesi HTTP diteruskan antara klien dan server di header cookie permintaan atau respons. Server mengirim cookie ke klien di header Set-cookie respons dan WINHTTP API mengirim ulang cookie server ke server di header cookie permintaan. Spesifikasi penanganan cookie, yang dijelaskan dalam rfc 2109 (Mekanisme Manajemen Status HTTP), diimplementasikan secara default di WinHTTP. Spesifikasi penanganan cookie terbaru, yang dijelaskan dalam rfc 2964, tidak didukung oleh WinHTTP.

WinHTTP mendapatkan cookie dari server Set-Cookie header dan menyimpannya dalam cache per sesi. Cookie ini kembali pada permintaan berikutnya dalam sesi WinHTTP yang sama di mana target cocok dengan sumber cookie. API WinHTTP meregenerasi header cookie permintaan untuk setiap kaki dalam permintaan.

Daftar berikut ini menjelaskan beberapa opsi yang bisa digunakan aplikasi klien WinHTTP untuk menangani cookie:

  • Penanganan Cookie Otomatis - WinHTTP secara otomatis menangani cookie dan aplikasi klien tidak melakukan penanganan cookie kustom.
  • Nonaktifkan Penanganan Cookie Otomatis - Penanganan cookie otomatis di API WinHTTP dinonaktifkan dan tidak ada cookie yang dikirim.
  • Tentukan semua Cookie secara manual - Penanganan cookie otomatis dinonaktifkan dan aplikasi klien menambahkan atau menghapus semua header cookie untuk setiap permintaan dalam sesi.
  • Penanganan Cookie Manual dan Otomatis - Gabungkan penanganan cookie otomatis dan manual.

Untuk menonaktifkan penanganan cookie, aplikasi klien WinHTTP memanggil fungsi WinHttpSetOption dengan parameter dwOption diatur ke WINHTTP_OPTION_DISABLE_FEATURE, dan parameter lpBuffer diatur ke WINHTTP_DISABLE_COOKIES. Parameter hInternet harus merupakan handel permintaan. Saat penanganan cookie dinonaktifkan pada handel permintaan yang telah mengirim permintaan sebelumnya, klien harus menghapus header cookie permintaan yang ada secara manual dengan fungsi WinHttpAddRequestHeaders sebelum mengirim permintaan berikutnya. Untuk informasi selengkapnya, lihat Menghapus header cookie.

Catatan

Aplikasi klien harus mengatur semua cookie pada sesi setelah mode otomatis dinonaktifkan.

Menentukan semua cookie secara manual

Saat penanganan cookie otomatis dinonaktifkan, aplikasi klien WinHTTP memiliki opsi untuk menentukan semua cookie secara manual. Untuk mengatur cookie secara manual, aplikasi memanggil WinHttpAddRequestHeaders yang menentukan header cookie di parameter pwszHeaders . Aplikasi klien harus menghapus semua header cookie sebelum mengirim ulang permintaan.

Aplikasi klien juga harus mengubah header cookie ketika permintaan telah dialihkan. Untuk mengubah cookie pada permintaan yang dialihkan, klien menentukan fungsi panggilan balik dengan WinHttpSetStatusCallback yang merespons kasus panggilan balik pengalihan. Handler panggilan balik harus menghapus cookie yang sebelumnya dikirim pada permintaan dengan memanggil WinHttpAddRequestHeaders. Untuk informasi selengkapnya tentang menghapus header cookie, lihat Menghapus Header Cookie.

Aplikasi klien WinHTTP dapat menggabungkan mekanisme penanganan cookie otomatis WinHTTP dengan penanganan cookie manual. Aplikasi menambahkan cookie kustom ke header cookie yang dihasilkan secara otomatis sebelum mengirim permintaan dengan fungsi WinHttpSendRequest . Cookie kustom harus menjadi header cookie pertama dalam permintaan api WinHTTP untuk menyimpan cookie dengan benar. Aplikasi klien juga harus menghapus cookie yang dikirim pada permintaan sebelumnya sebelum mengirim ulang permintaan pada handel permintaan yang sama. Untuk informasi selengkapnya, lihat Menghapus Header Cookie.

Cookie yang ditambahkan ke permintaan sebelum panggilan ke WinHttpSendRequest disertakan dalam semua permintaan WinHTTP yang dikirim atas nama panggilan WinHttpSendRequest dan WinHttpReceiveResponse berikutnya. Aplikasi klien mungkin perlu menghapus header cookie ketika permintaan telah dialihkan. Untuk menghapus cookie pada permintaan yang dialihkan, klien menentukan fungsi panggilan balik dengan WinHttpSetStatusCallback yang merespons kasus panggilan balik pengalihan. Handler panggilan balik harus menghapus cookie yang sebelumnya dikirim pada permintaan dengan memanggil WinHttpAddRequestHeaders. Fungsi panggilan balik mungkin tidak mengatur cookie kustom baru pada panggilan balik pengalihan. Klien harus menunggu WinHttpReceiveResponse selesai sebelum menambahkan cookie baru untuk panggilan WinHttpSendRequest berikutnya.

Aplikasi klien WinHTTP mungkin perlu menghapus cookie permintaan yang ada sebelum mengirim ulang permintaan untuk mencegah cookie yang dikirim pada permintaan sebelumnya dikirim lagi pada permintaan saat ini; untuk informasi selengkapnya, lihat Catatan berikut ini. Perlu diketahui juga bahwa Cookie tidak harus dibersihkan sebelum permintaan pertama dikirim pada handel permintaan. Klien dapat menghapus cookie yang ada dengan memanggil WinHttpAddRequestHeaders dengan header cookie kosong di parameter pwszHeaders dan bendera WINHTTP_ADDREQ_FLAG_REPLACE diatur dalam parameter dwModifier . Contoh kode berikut menunjukkan cara menghapus header cookie pada permintaan.

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

Api WinHTTP memiliki perilaku penanganan cookie yang berbeda untuk versi sistem operasi yang lebih lama dari Windows XP dengan Paket Layanan 2 (SP2) dan Windows Server 2003 dengan Paket Layanan 1 (SP1).

**Windows XP dengan SP2 dan yang lebih baru dan Windows Server 2003 dengan SP1 dan yang lebih baru: **

API WinHTTP menghapus semua cookie yang dikirim pada permintaan sebelumnya untuk handel permintaan. Klien dapat menambahkan header cookie baru secara manual sebelum setiap panggilan ke WinHttpSendRequest. Jika fungsionalitas penanganan cookie otomatis api WinHTTP belum dinonaktifkan, API WinHTTP akan menambahkan header cookie baru (atau menambahkan header cookie baru jika aplikasi klien tidak menambahkannya secara manual) dengan cookie dari server.

**Windows XP dengan SP2 dan Windows Server 2003 dengan SP1: **

API WinHTTP tidak menghapus header cookie permintaan setelah WinHttpReceiveResponse selesai. Cookie yang dikirim dalam permintaan sebelumnya akan dikirim kembali dalam panggilan berikutnya ke WinHttpSendRequest. Aplikasi klien WinHTTP harus menghapus header cookie yang ada sebelum mengirim ulang permintaan pada handel permintaan.