'n Volmag kan HTML suksesvol haal en tog 'n beeld korrupteer terwyl dit in 'n C++-buffer gekopieer word. Voordat jy die volmagprotokol verander, kontroleer die ontvangterugroep en die objek wat as sy konteks deurgegee word.

CURLOPT_WRITEDATA verskaf 'n wyser na die skryfterugroep. Sonder 'n pasgemaakte terugroep verwag libcurl se verstek-skrywer 'n FILE *. 'n Adres soos &response, waar response 'n std::string is, maak net sin wanneer jou terugroep daardie konteks na die beoogde tipe terugdwing.

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;
}

Registreer albei helftes op die eenvoudige handvatsel wat vir die oordrag gebruik word:

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

Die append-oproep gebruik die gelewerde greptelling. Terugroepdata is nie nulgetermineer nie, en 'n beeld kan nul-grepe bevat; om dit met strlen te meet, sou 'n deel van die liggaam verloor. 'n Antwoord kan ook deur baie terugroepaanroepe van verskillende groottes aankom.

Om die verbruikte greptelling terug te gee, aanvaar die brokkie. Om 'n ander telling terug te gee, staak die oordrag met 'n skryffout. Die uitsonderingswag hou 'n toekenningsfout daarvan om deur die C-terugroepgrens te ontsnap; die oproeper moet steeds die oordragsresultaat nagaan voordat response as 'n volledige lêer beskou word.

Hou die string lewendig totdat die oordrag klaar is. As 'n asinchrone sokskryf dan die inhoud daarvan deurstuur, hou daardie grepe lewendig totdat daardie skryf ook voltooi is. Vir groot antwoorde is 'n begrensde stroomreëling verkieslik bo die opbou van die hele liggaam.

Verwante artikels