พร็อกซีอาจดึง HTML ได้สำเร็จแต่ยังทำให้ภาพเสียหายขณะคัดลอกลงบัฟเฟอร์ C++ ก่อนเปลี่ยนโปรโตคอลของพร็อกซี ให้ตรวจสอบ callback สำหรับการรับและออบเจกต์ที่ส่งเป็นบริบทของมัน

CURLOPT_WRITEDATA ให้พอยน์เตอร์ไปยัง callback สำหรับการเขียน หากไม่มี callback ที่กำหนดเอง ตัวเขียนค่าเริ่มต้นของ libcurl จะคาดหวัง FILE * ที่อยู่อย่าง &response ซึ่ง response เป็น std::string จะสมเหตุสมผลก็ต่อเมื่อ callback ของคุณแปลงบริบทนั้นกลับไปเป็นชนิดที่ตั้งใจไว้

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;
}

ลงทะเบียนทั้งสองส่วนบนแฮนเดิลอย่างง่ายที่ใช้สำหรับการถ่ายโอน:

std::string response;
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, receive);
curl_easy_setopt(handle, CURLOPT_WRITEDATA, &response);

การเรียก append ใช้จำนวนไบต์ที่ส่งมา ข้อมูลของ callback ไม่ได้สิ้นสุดด้วย null และภาพอาจมีไบต์ศูนย์ การวัดด้วย strlen จะทำให้สูญเสียส่วนหนึ่งของเนื้อหา การตอบกลับอาจมาถึงผ่านการเรียก callback หลายครั้งที่มีขนาดต่างกัน

การคืนจำนวนไบต์ที่ใช้ไปจะยอมรับชิ้นส่วนนั้น การคืนจำนวนที่ต่างออกไปจะยกเลิกการถ่ายโอนพร้อมข้อผิดพลาดในการเขียน ตัวป้องกันข้อยกเว้นไม่ให้ความล้มเหลวในการจัดสรรหน่วยความจำหลุดออกมาผ่านขอบเขต callback ของ C ผู้เรียกยังต้องตรวจสอบผลลัพธ์ของการถ่ายโอนก่อนถือว่า response เป็นไฟล์ที่สมบูรณ์

ทำให้สตริงมีชีวิตอยู่จนกว่าการถ่ายโอนจะเสร็จสิ้น หากการเขียนซ็อกเก็ตแบบอะซิงโครนัสส่งต่อเนื้อหาของมันในภายหลัง ให้เก็บไบต์เหล่านั้นไว้จนกว่าการเขียนนั้นจะเสร็จด้วย สำหรับการตอบกลับขนาดใหญ่ การจัดแบบสตรีมมิ่งที่มีขอบเขตจำกัดเหมาะกว่าการสะสมเนื้อหาทั้งหมด

บทความที่เกี่ยวข้อง