Motta binære libcurl-svar i en C++ std::string
Send en std::string som tilbakeringingskontekst, og legg til eksplisitte byttall når du mottar binære data med libcurl.
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.