Primanje binarnih libcurl odgovora u C++ std::string
Proslijedite std::string kao kontekst povratnog poziva i dodajte eksplicitne brojeve bajtova pri primanju binarnih podataka s libcurlom.
Proxy može uspješno dohvatiti HTML i ipak pokvariti sliku dok je kopira u C++ bafer. Prije nego promijenite protokol proxyja, provjerite povratni poziv za primanje i objekt koji se prosljeđuje kao njegov kontekst.
CURLOPT_WRITEDATA daje pokazivač na povratni poziv za pisanje. Bez prilagođenog povratnog poziva, libcurl-ov zadani pisac očekuje FILE *. Adresa poput &response, gdje je response std::string, ima smisla samo kada vaš povratni poziv pretvori taj kontekst natrag u predviđeni tip.
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;
}Registrirajte obje polovine na jednostavnom ručki koja se koristi za prijenos:
std::string response;
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, receive);
curl_easy_setopt(handle, CURLOPT_WRITEDATA, &response);Poziv append koristi isporučeni broj bajtova. Podaci povratnog poziva nisu završeni nulom i slika može sadržavati nula bajtova; mjerenje pomoću strlen izgubilo bi dio tijela. Odgovor također može stizati kroz mnoge pozive različitih veličina.
Vraćanje potrošenog broja bajtova prihvaća dio. Vraćanje drugog broja prekida prijenos s greškom pisanja. Čuvar izuzetaka sprječava da neuspjeh alokacije pobjegne kroz granicu C povratnog poziva; pozivatelj ipak mora provjeriti rezultat prijenosa prije nego response tretira kao potpunu datoteku.
Držite string živim dok se prijenos ne završi. Ako asinkrono pisanje u socket zatim prosljeđuje njegov sadržaj, držite te bajtove živim dok se i to pisanje ne završi. Za velike odgovore ograničen raspored strujanja poželjniji je od nakupljanja cijelog tijela.