Příjem binárních odpovědí libcurl do C++ std::string
Předejte std::string jako kontext zpětného volání a při příjmu binárních dat pomocí libcurl přidávejte explicitní počty bajtů.
Proxy může úspěšně načíst HTML a přesto poškodit obrázek při jeho kopírování do bufferu C++. Než změníte protokol proxy, zkontrolujte přijímací zpětné volání a objekt předaný jako jeho kontext.
CURLOPT_WRITEDATA dodává ukazatel na zapisovací zpětné volání. Bez vlastního zpětného volání očekává výchozí zapisovač libcurl FILE *. Adresa jako &response, kde response je std::string, má smysl jen tehdy, když vaše zpětné volání přetypuje tento kontext zpět na zamýšlený 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 obě poloviny na jednoduchém popisovači použitém pro přenos:
std::string response;
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, receive);
curl_easy_setopt(handle, CURLOPT_WRITEDATA, &response);Volání append používá dodaný počet bajtů. Data zpětného volání nejsou ukončena nulou a obrázek může obsahovat nulové bajty; měření pomocí strlen by ztratilo část těla. Odpověď může také dorazit prostřednictvím mnoha volání různé velikosti.
Vrácení spotřebovaného počtu bajtů část přijme. Vrácení jiného počtu přeruší přenos s chybou zápisu. Ochrana výjimek brání tomu, aby selhání alokace uniklo přes hranici C zpětného volání; volající musí před tím, než bude response považovat za úplný soubor, stále zkontrolovat výsledek přenosu.
Udržujte řetězec naživu, dokud přenos neskončí. Pokud asynchronní zápis do soketu poté předá jeho obsah, udržujte tyto bajty naživu, dokud i tento zápis neskončí. Pro velké odpovědi je omezené streamovací uspořádání výhodnější než hromadění celého těla.