Ta imot binære libcurl-svar i ein C++ std::string
Send ein std::string som tilbakekallingskontekst og legg til eksplisitte byttal når du tek imot binære data med libcurl.
Ein proxy kan hente HTML med hell og likevel øydeleggje eit bilete medan det blir kopiert inn i ein C++-buffer. Før du endrar proxyprotokollen, kontroller mottakstilbakekallinga og objektet som blir sendt som konteksten.
CURLOPT_WRITEDATA leverer ein peikar til skrivetilbakekallinga. Utan ei eiga tilbakekalling ventar standard-skrivaren i libcurl ein FILE *. Ei adresse som &response, der response er ein std::string, gir berre meining når tilbakekallinga di castar 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 halvdelane på det enkle handtaket som blir brukt for overføringa:
std::string response;
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, receive);
curl_easy_setopt(handle, CURLOPT_WRITEDATA, &response);Kallet append brukar byttalet som vart levert. Tilbakekallingsdata er ikkje nullterminerte, og eit bilete kan innehalde nullbytar; å måle det med strlen ville miste ein del av kroppen. Eit svar kan òg kome gjennom mange tilbakekallingar av ulik storleik.
Å returnere det forbrukte byttalet godtek delen. Å returnere eit anna tal avbryt overføringa med ein skrivefeil. Unntaksvernet hindrar at ein allokeringsfeil slepp ut gjennom C-tilbakekallingsgrensa; den som kallar, må framleis kontrollere overføringsresultatet før response blir handsama som ei komplett fil.
Hald strengen i live til overføringa er ferdig. Viss ein asynkron socket-skriving deretter sender innhaldet vidare, må du halde dei bytane i live til den skrivinga òg er ferdig. For store svar er ei avgrensa strøymingsordning å føretrekkje framfor å samle heile kroppen.