Binär libcurl-Antwerten an engem C++ std::string empfänken
Gitt en std::string als Callback-Kontext weider a füügt explizit Bytezuelen dobäi, wann Dir binär Donnéeë mat libcurl empfänkt.
E Proxy kann HTML erfollegräich ofruffen an trotzdem e Bild beschiedegen, wärend en et an en C++-Puffer kopéiert. Ier Dir de Proxyprotokoll ännert, kontrolléiert de Empfangs-Callback an den Objet, deen als säin Kontext weidergi gëtt.
CURLOPT_WRITEDATA liwwert e Pointer op de Schreib-Callback. Ouni en eegene Callback erwaart de Standard-Schreiwer vu libcurl en FILE *. Eng Adress wéi &response, wou response en std::string ass, gëtt nëmme Sënn, wann Äre Callback dëse Kontext zréck op den intendéierten Typ castet.
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;
}Registréiert béid Hälften op dem einfachen Handle, deen fir den Transfer benotzt gëtt:
std::string response;
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, receive);
curl_easy_setopt(handle, CURLOPT_WRITEDATA, &response);Den append-Aufruff benotzt d'Bytezuel, déi geliwwert gouf. Callback-Donnéeë sinn net null-terminéiert, an e Bild kann Nullbyten enthalen; eng Miessung mat strlen géif en Deel vum Kierper verléieren. Eng Äntwert kann och iwwer vill Callback-Aufruff vu verschiddene Gréissten ukommen.
D'Zeréckginn vun der verbrauchter Bytezuel akzeptéiert de Brotstéck. D'Zeréckginn vun enger anerer Zuel brécht den Transfer mat engem Schreibfehler of. Den Ausname-Schutz verhënnert, datt e Speicherzouweisungsfehler iwwer d'C-Callback-Grenz erauskënnt; den Aufruffer muss nach ëmmer d'Transferresultat kontrolléieren, ier en response als komplette Fichier behandelt.
Hält de String lieweg, bis den Transfer fäerdeg ass. Wann en asynchrone Socket-Schreiwvorgang duerno säin Inhalt weiderschéckt, hält déi Byten lieweg, bis dee Schreiwvorgang och fäerdeg ass. Fir grouss Äntwerten ass eng begrenzt Streaming-Uerdnung ze bevorzugen, iwwer de ganzen Kierper ze sammelen.