Binääristen libcurl-vastausten vastaanottaminen C++ std::stringiin
Välitä std::string takaisinkutsun kontekstina ja lisää eksplisiittiset tavumäärät, kun vastaanotat binääridataa libcurlilla.
Välityspalvelin voi hakea HTML:n onnistuneesti ja silti vioittaa kuvan kopioidessaan sitä C++-puskuriin. Ennen välityspalvelimen protokollan muuttamista tarkista vastaanottotakaisinkutsu ja sen kontekstiksi välitetty olio.
CURLOPT_WRITEDATA välittää osoittimen kirjoitustakaisinkutsuun. Ilman mukautettua takaisinkutsua libcurlin oletuskirjoittaja odottaa FILE *. Osoite kuten &response, jossa response on std::string, on mielekäs vain, kun takaisinkutsusi muuntaa tämän kontekstin takaisin aiottuun tyyppiin.
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;
}Rekisteröi molemmat puolet siirtoon käytettävään yksinkertaiseen kahvaan:
std::string response;
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, receive);
curl_easy_setopt(handle, CURLOPT_WRITEDATA, &response);append-kutsu käyttää välitettyä tavumäärää. Takaisinkutsun data ei ole nollapäätteinen, ja kuva voi sisältää nollatavuja; strlenillä mittaaminen hävittäisi osan rungosta. Vastaus voi saapua myös monien erikokoisten takaisinkutsukutsujen kautta.
Kulutetun tavumäärän palauttaminen hyväksyy palan. Erilaisen määrän palauttaminen keskeyttää siirron kirjoitusvirheeseen. Poikkeusvahti estää allokointivirhettä karkaamasta C-takaisinkutsun rajan yli; kutsujan on silti tarkistettava siirron tulos ennen kuin response käsitellään kokonaisena tiedostona.
Pidä merkkijono elossa, kunnes siirto päättyy. Jos asynkroninen pistokkeen kirjoitus välittää sen sisällön eteenpäin, pidä ne tavut elossa, kunnes myös se kirjoitus päättyy. Suurille vastauksille rajattu virtautusjärjestely on parempi kuin koko rungon kokoaminen.