Menerima respons binari libcurl ke dalam std::string C++
Hantar std::string sebagai konteks callback dan tambah kiraan bait eksplisit apabila menerima data binari dengan libcurl.
Proksi boleh mengambil HTML dengan jayanya dan masih merosakkan imej semasa menyalinnya ke dalam penimbal C++. Sebelum menukar protokol proksi, semak callback penerimaan dan objek yang dihantar sebagai konteksnya.
CURLOPT_WRITEDATA membekalkan penuding kepada callback tulisan. Tanpa callback tersuai, penulis lalai libcurl menjangka FILE *. Alamat seperti &response, yang response-nya ialah std::string, hanya masuk akal apabila callback anda menukar konteks itu kembali kepada jenis yang dimaksudkan.
static size_t receive(char* data, size_t size,
size_t count, void* context) {
const size_t bytes = size * count;
auto* body = static_cast<std::string*>(context);
try {
body->append(data, bytes);
} catch (...) {
return 0;
}
return bytes;
}Daftarkan kedua-dua bahagian pada pemegang ringkas yang digunakan untuk pemindahan:
std::string response;
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, receive);
curl_easy_setopt(handle, CURLOPT_WRITEDATA, &response);Panggilan append menggunakan kiraan bait yang dihantar. Data callback tidak ditamatkan null dan imej boleh mengandungi bait sifar; mengukurnya dengan strlen akan kehilangan sebahagian badan. Respons juga boleh tiba melalui banyak panggilan callback yang berbeza saiz.
Memulangkan kiraan bait yang digunakan menerima ketulan itu. Memulangkan kiraan berbeza membatalkan pemindahan dengan ralat tulisan. Pengawal pengecualian menghalang kegagalan peruntukan daripada terlepas melalui sempadan callback C; pemanggil masih perlu menyemak hasil pemindahan sebelum menganggap response sebagai fail lengkap.
Kekalkan rentetan itu hidup sehingga pemindahan selesai. Jika tulisan soket tak segerak kemudian memajukan kandungannya, kekalkan bait itu hidup sehingga tulisan itu juga selesai. Untuk respons besar, susunan penstriman terbatas lebih baik daripada mengumpul seluruh badan.