Modtag binære libcurl-svar i en C++ std::string
Send en std::string som callback-kontekst, og tilføj eksplicitte byttal, når der modtages binære data med libcurl.
En proxy kan hente HTML med succes og alligevel ødelægge et billede, når det kopieres ind i en C++-buffer. Før du ændrer proxyprotokollen, skal du kontrollere modtagelses-callbacket og det objekt, der sendes som dets kontekst.
CURLOPT_WRITEDATA leverer en peger til skrive-callbacket. Uden et tilpasset callback forventer libcurls standard-skriver en FILE *. En adresse som &response, hvor response er en std::string, giver kun mening, når dit callback caster den kontekst tilbage til den tilsigtede type.
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 halvdele på det simple håndtag, der bruges til overførslen:
std::string response;
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, receive);
curl_easy_setopt(handle, CURLOPT_WRITEDATA, &response);Kaldet append bruger det leverede byttal. Callback-data er ikke null-termineret, og et billede kan indeholde nulbytter; at måle det med strlen ville miste en del af kroppen. Et svar kan også ankomme gennem mange callback-kald af forskellig størrelse.
At returnere det forbrugte byttal accepterer stykket. At returnere et andet tal afbryder overførslen med en skrivefejl. Undtagelsesværnet forhindrer, at en allokeringsfejl slipper ud gennem C-callback-grænsen; kalderen skal stadig kontrollere overførselsresultatet, før response behandles som en komplet fil.
Hold strengen i live, indtil overførslen er færdig. Hvis en asynkron socket-skrivning derefter videresender dens indhold, skal du holde de byter i live, indtil den skrivning også er færdig. For store svar er en afgrænset streamingordning at foretrække frem for at akkumulere hele kroppen.