Marrja e përgjigjeve binare të libcurl në një std::string C++
Kaloni një std::string si kontekst i callback-ut dhe shtoni numërime të qarta bajtësh kur merrni të dhëna binare me libcurl.
Një proxy mund të marrë HTML me sukses dhe gjithsesi të dëmtojë një imazh ndërsa e kopjon në një buffer C++. Përpara se të ndryshoni protokollin e proxy-t, kontrolloni callback-un e marrjes dhe objektin që kalohet si konteksti i tij.
CURLOPT_WRITEDATA siguron një tregues për callback-un e shkrimit. Pa një callback të personalizuar, shkruesi i parazgjedhur i libcurl pret një FILE *. Një adresë si &response, ku response është një std::string, ka kuptim vetëm kur callback-u juaj e kthen atë kontekst në llojin e synuar.
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;
}Regjistroni të dyja gjysmat në dorezën e thjeshtë që përdoret për transferimin:
std::string response;
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, receive);
curl_easy_setopt(handle, CURLOPT_WRITEDATA, &response);Thirrja append përdor numërimin e bajtëve të dhënë. Të dhënat e callback-ut nuk përfundojnë me zero dhe një imazh mund të përmbajë bajtë zero; matja me strlen do të humbiste një pjesë të trupit. Një përgjigje mund të mbërrijë edhe përmes shumë thirrjeve të madhësive të ndryshme.
Kthimi i numrit të bajtëve të konsumuar e pranon copën. Kthimi i një numri tjetër ndërpret transferimin me një gabim shkrimi. Mbrojtësi i përjashtimeve pengon një dështim shpërndarjeje të dalë përtej kufirit të callback-ut C; thirrësi duhet gjithsesi të kontrollojë rezultatin e transferimit përpara se ta trajtojë response si një skedar të plotë.
Mbajeni vargun gjallë derisa transferimi të përfundojë. Nëse një shkrim asinkron në socket pastaj përcjell përmbajtjen e tij, mbajini ata bajtë gjallë derisa edhe ai shkrim të përfundojë. Për përgjigje të mëdha, një rregullim transmetimi i kufizuar preferohet ndaj grumbullimit të të gjithë trupit.