ຮັບການຕອບສະໜອງແບບ binary ຂອງ libcurl ເຂົ້າ C++ std::string
ສົ່ງ std::string ເປັນ callback context ແລະ ເພີ່ມຈຳນວນ byte ຢ່າງຊັດເຈນເມື່ອຮັບຂໍ້ມູນ binary ດ້ວຍ libcurl.
Proxy ສາມາດດຶງ HTML ໄດ້ຢ່າງສຳເລັດ ແລະ ຍັງອາດເຮັດໃຫ້ຮູບພາບເສຍຫາຍເມື່ອຄັດລອກມັນເຂົ້າ buffer ຂອງ C++. ກ່ອນຈະປ່ຽນ proxy protocol, ກວດເບິ່ງ callback ຮັບ ແລະ ວັດຖຸທີ່ສົ່ງເປັນ context ຂອງມັນ.
CURLOPT_WRITEDATA ໃຫ້ pointer ໄປຫາ callback ຂຽນ. ຖ້າບໍ່ມີ callback ສ່ວນຕົວ, ຕົວຂຽນເລີ່ມຕົ້ນຂອງ libcurl ຄາດຫວັງ FILE *. ທີ່ຢູ່ເຊັ່ນ &response ທີ່ response ເປັນ std::string ຈະມີຄວາມໝາຍກໍ່ຕໍ່ເມື່ອ callback ຂອງທ່ານແປງ context ນັ້ນກັບໄປເປັນຊະນິດທີ່ຕ້ອງການ.
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;
}ລົງທະບຽນທັງສອງສ່ວນໃສ່ handle ງ່າຍໆທີ່ໃຊ້ສຳລັບການໂອນ:
std::string response;
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, receive);
curl_easy_setopt(handle, CURLOPT_WRITEDATA, &response);ການເອີ້ນ append ໃຊ້ຈຳນວນ byte ທີ່ສົ່ງມາ. ຂໍ້ມູນ callback ບໍ່ໄດ້ສິ້ນສຸດດ້ວຍ null ແລະ ຮູບພາບອາດມີ byte ສູນ; ການວັດດ້ວຍ strlen ຈະເສຍສ່ວນໜຶ່ງຂອງເນື້ອ. ການຕອບສະໜອງຍັງອາດມາຜ່ານການເອີ້ນ callback ຫຼາຍຄັ້ງທີ່ມີຂະໜາດຕ່າງກັນ.
ການສົ່ງຈຳນວນ byte ທີ່ໃຊ້ໄປແລ້ວກັບຄືນຈະຍອມຮັບ chunk ນັ້ນ. ການສົ່ງຈຳນວນອື່ນກັບຄືນຈະຢຸດການໂອນດ້ວຍຂໍ້ຜິດພາດການຂຽນ. ຕົວປ້ອງກັນຂໍ້ຍົກເວັ້ນປ້ອງກັນບໍ່ໃຫ້ຄວາມລົ້ມເຫຼວຂອງການຈັດສັນອອກຜ່ານຂອບເຂດ callback C; ຜູ້ເອີ້ນຍັງຕ້ອງກວດຜົນການໂອນກ່ອນຈະຖືວ່າ response ເປັນໄຟລ໌ຄົບຖ້ວນ.
ຮັກສາ string ໃຫ້ຢູ່ຈົນການໂອນສຳເລັດ. ຖ້າການຂຽນ socket ແບບ asynchronous ສົ່ງເນື້ອໃນຕໍ່ໄປ, ຮັກສາ byte ເຫຼົ່ານັ້ນໃຫ້ຢູ່ຈົນການຂຽນນັ້ນສຳເລັດຄືກັນ. ສຳລັບການຕອບສະໜອງຂະໜາດໃຫຍ່, ການຈັດການ streaming ແບບມີຂອບເຂດດີກວ່າການສະສົມເນື້ອທັງໝົດ.