Posrednik lahko uspešno pridobi HTML in kljub temu pokvari sliko, ko jo kopira v medpomnilnik C++. Preden spremenite protokol posrednika, preverite povratni klic za prejemanje in objekt, posredovan kot njegov kontekst.

CURLOPT_WRITEDATA zagotavlja kazalec na povratni klic za pisanje. Brez povratnega klica po meri privzeti pisec libcurla pričakuje FILE *. Naslov, kot je &response, kjer je response std::string, ima smisel le, ko vaš povratni klic pretvori ta kontekst nazaj v predvideni 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 obe polovici na preprostem ročaju, ki se uporablja za prenos:

std::string response;
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, receive);
curl_easy_setopt(handle, CURLOPT_WRITEDATA, &response);

Klic append uporablja dostavljeno število bajtov. Podatki povratnega klica niso zaključeni z ničlo in slika lahko vsebuje ničelne bajte; merjenje s strlen bi izgubilo del telesa. Odgovor lahko prispe tudi prek številnih klicev različnih velikosti.

Vračanje porabljenega števila bajtov sprejme del. Vračanje drugega števila prekine prenos z napako pisanja. Varovalo izjem prepreči, da bi napaka pri dodeljevanju ušla čez mejo povratnega klica C; klicatelj mora še vedno preveriti rezultat prenosa, preden response obravnava kot celotno datoteko.

Ohranite niz živ, dokler se prenos ne konča. Če asinhroni zapis v vtičnico nato posreduje njegovo vsebino, ohranite te bajte žive, dokler se tudi ta zapis ne konča. Za velike odgovore je omejena pretočna ureditev boljša od kopičenja celotnega telesa.

Sorodni članki