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 ແບບມີຂອບເຂດດີກວ່າການສະສົມເນື້ອທັງໝົດ.

ບົດຄວາມທີ່ກ່ຽວຂ້ອງ