Prijímanie binárnych odpovedí libcurl do C++ std::string
Odovzdajte std::string ako kontext spätného volania a pri prijímaní binárnych údajov pomocou libcurl pridávajte explicitné počty bajtov.
Proxy môže úspešne získať HTML a napriek tomu poškodiť obrázok pri jeho kopírovaní do buffera C++. Pred zmenou protokolu proxy skontrolujte prijímacie spätné volanie a objekt odovzdaný ako jeho kontext.
CURLOPT_WRITEDATA poskytuje ukazovateľ na zapisovacie spätné volanie. Bez vlastného spätného volania predvolený zapisovač libcurl očakáva FILE *. Adresa ako &response, kde response je std::string, má zmysel len vtedy, keď vaše spätné volanie pretypuje tento kontext späť na zamýšľaný typ.
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;
}Zaregistrujte obe polovice na jednoduchom popisovači použitom na prenos:
std::string response;
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, receive);
curl_easy_setopt(handle, CURLOPT_WRITEDATA, &response);Volanie append používa dodaný počet bajtov. Údaje spätného volania nie sú ukončené nulou a obrázok môže obsahovať nulové bajty; meranie pomocou strlen by stratilo časť tela. Odpoveď môže tiež prichádzať prostredníctvom mnohých volaní rôznych veľkostí.
Vrátenie spotrebovaného počtu bajtov prijme časť. Vrátenie iného počtu preruší prenos s chybou zápisu. Ochrana výnimiek bráni tomu, aby zlyhanie alokácie uniklo cez hranicu C spätného volania; volajúci musí pred tým, než bude response považovať za úplný súbor, stále skontrolovať výsledok prenosu.
Udržujte reťazec nažive, kým sa prenos neskončí. Ak asynchrónny zápis do soketu potom odovzdá jeho obsah, udržujte tie bajty nažive, kým sa aj tento zápis neskončí. Pri veľkých odpovediach je obmedzené streamovacie usporiadanie výhodnejšie než hromadenie celého tela.