Recibir respuestas binarias de libcurl en un std::string de C++
Pase un std::string como contexto de la función de devolución y añada recuentos de bytes explícitos al recibir datos binarios con libcurl.
Un proxy puede obtener HTML correctamente y, aun así, corromper una imagen mientras la copia en un búfer de C++. Antes de cambiar el protocolo del proxy, revise la función de devolución de recepción y el objeto que se pasa como su contexto.
CURLOPT_WRITEDATA proporciona un puntero a la función de devolución de escritura. Sin una función de devolución personalizada, el escritor predeterminado de libcurl espera un FILE *. Una dirección como &response, donde response es un std::string, solo tiene sentido cuando su función de devolución convierte ese contexto al tipo previsto.
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;
}Registre ambas mitades en el manejador sencillo utilizado para la transferencia:
std::string response;
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, receive);
curl_easy_setopt(handle, CURLOPT_WRITEDATA, &response);La llamada append utiliza el recuento de bytes entregado. Los datos de la función de devolución no terminan en nulo y una imagen puede contener bytes cero; medirla con strlen perdería parte del cuerpo. Una respuesta también puede llegar mediante muchas invocaciones de distintos tamaños.
Devolver el recuento de bytes consumidos acepta el fragmento. Devolver un recuento distinto aborta la transferencia con un error de escritura. La protección de excepciones evita que un fallo de asignación escape a través del límite de la función de devolución de C; quien llama aún debe comprobar el resultado de la transferencia antes de tratar response como un archivo completo.
Mantenga la cadena viva hasta que finalice la transferencia. Si una escritura asíncrona en el socket reenvía después su contenido, mantenga esos bytes vivos hasta que esa escritura también termine. Para respuestas grandes, una disposición de streaming acotada es preferible a acumular todo el cuerpo.