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.

Artikuj të ngjashëm