En proxy kan hente HTML med hell og likevel ødelegge et bilde mens det kopieres inn i en C++-buffer. Før du endrer proxyprotokollen, kontroller mottakstilbakeringen og objektet som sendes som konteksten.

CURLOPT_WRITEDATA leverer en peker til skrivetilbakeringen. Uten en egendefinert tilbakeringing forventer libcurls standardskriver en FILE *. En adresse som &response, der response er en std::string, gir bare mening når tilbakeringingen din caster den konteksten tilbake til den tiltenkte typen.

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

Registrer begge halvdelene på det enkle håndtaket som brukes for overføringen:

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

Kallet append bruker byttallet som ble levert. Tilbakeringingsdata er ikke nullterminert, og et bilde kan inneholde nullbytter; å måle det med strlen ville miste en del av kroppen. Et svar kan også ankomme gjennom mange tilbakeringinger av ulik størrelse.

Å returnere det forbrukte byttallet godtar delen. Å returnere et annet tall avbryter overføringen med en skrivefeil. Unntaksvernet hindrer at en allokeringsfeil slipper ut gjennom C-tilbakeringingsgrensen; den som kaller, må fortsatt kontrollere overføringsresultatet før response behandles som en komplett fil.

Hold strengen i live til overføringen er ferdig. Hvis en asynkron socket-skriving deretter videresender innholdet, må du holde de bytene i live til den skrivingen også er ferdig. For store svar er en avgrenset strømmeløsning å foretrekke framfor å samle hele kroppen.

Relaterte artikler