Un proxy pot obtenir HTML correctament i, tot i així, corrompre una imatge mentre la copia en un búfer de C++. Abans de canviar el protocol del proxy, comproveu la devolució de trucada de recepció i l'objecte que s'hi passa com a context.

CURLOPT_WRITEDATA proporciona un punter a la devolució de trucada d'escriptura. Sense una devolució personalitzada, l'escriptor predeterminat de libcurl espera un FILE *. Una adreça com &response, on response és un std::string, només té sentit quan la vostra devolució converteix aquest context al tipus previst.

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

Registreu les dues meitats al manegador senzill utilitzat per a la transferència:

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

La crida append utilitza el recompte de bytes lliurat. Les dades de la devolució no acaben en nul i una imatge pot contenir bytes zero; mesurar-la amb strlen perdria part del cos. Una resposta també pot arribar a través de moltes crides de mides diferents.

Retornar el recompte de bytes consumits accepta el fragment. Retornar un recompte diferent avorta la transferència amb un error d'escriptura. La protecció d'excepcions evita que una fallada d'assignació escapi a través del límit de la devolució de C; el cridador encara ha de comprovar el resultat de la transferència abans de tractar response com un fitxer complet.

Manteniu la cadena viva fins que acabi la transferència. Si una escriptura asíncrona al sòcol després n'envia el contingut, manteniu aquests bytes vius fins que també acabi aquella escriptura. Per a respostes grans, una disposició de streaming limitada és preferible a acumular tot el cos.

Articles relacionats