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 dalam respons, dan API WinHTTP mengirim ulang cookie server ke server di header Cookie dalam 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 dikirim ulang pada permintaan berikutnya dalam sesi WinHTTP yang sama di mana target sesuai dengan sumber dari cookie. API WinHTTP menghasilkan ulang header cookie permintaan untuk setiap tahap 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 WINHTTP API 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 fungsiWinHttpSetOptiondengan parameter dwOption diatur ke WINHTTP_OPTION_DISABLE_FEATURE, dan parameter lpBuffer diatur ke WINHTTP_DISABLE_COOKIES. Parameter hInternet harus berupa handle permintaan. Ketika 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.

Nota

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

Menentukan semua cookie secara manual

Ketika penanganan cookie otomatis dinonaktifkan, aplikasi klien WinHTTP memiliki opsi untuk menentukan semua cookie secara manual. Untuk mengatur cookie secara manual, aplikasi memanggil WinHttpAddRequestHeaders 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 untuk API WinHTTP agar dapat menyimpan cookie dalam cache 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 berikutnya, yaitu WinHttpSendRequest dan WinHttpReceiveResponse. 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. Perhatikan juga bahwa cookie tidak perlu dibersihkan sebelum permintaan pertama dikirim pada penanganan 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);

WINHTTP API 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: **

WinHTTP API menghapus semua cookie yang dikirim pada permintaan sebelumnya untuk handle 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.