Proksi dapat mengambil HTML dengan sukses namun tetap merusak gambar saat menyalinnya ke buffer C++. Sebelum mengubah protokol proksi, periksa callback penerimaan dan objek yang dilewatkan sebagai konteksnya.

CURLOPT_WRITEDATA menyediakan pointer ke callback penulisan. Tanpa callback khusus, penulis bawaan libcurl mengharapkan FILE *. Alamat seperti &response, yang response-nya berupa std::string, hanya masuk akal bila callback Anda mengembalikan konteks itu ke tipe yang dimaksud.

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 bagian pada handle sederhana yang digunakan untuk transfer:

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

Panggilan append menggunakan jumlah byte yang dikirim. Data callback tidak diakhiri null, dan gambar dapat berisi byte nol; mengukurnya dengan strlen akan kehilangan sebagian isi. Respons juga dapat datang melalui banyak pemanggilan callback dengan ukuran berbeda.

Mengembalikan jumlah byte yang dikonsumsi menerima potongan itu. Mengembalikan jumlah berbeda membatalkan transfer dengan kesalahan penulisan. Penjaga pengecualian mencegah kegagalan alokasi keluar melewati batas callback C; pemanggil tetap harus memeriksa hasil transfer sebelum menganggap response sebagai berkas lengkap.

Jaga string tetap hidup sampai transfer selesai. Jika penulisan soket asinkron kemudian meneruskan isinya, jaga byte tersebut tetap hidup sampai penulisan itu juga selesai. Untuk respons besar, pengaturan streaming terbatas lebih disukai daripada menumpuk seluruh isi.

Artikel terkait