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.

Povezani članci