Een proxy kan HTML met succes ophalen en toch een afbeelding beschadigen terwijl hij die naar een C++-buffer kopieert. Controleer voordat u het proxyprotocol wijzigt de ontvangstcallback en het object dat als context wordt doorgegeven.

CURLOPT_WRITEDATA levert een pointer naar de schrijf-callback. Zonder een aangepaste callback verwacht de standaardschrijver van libcurl een FILE *. Een adres zoals &response, waarbij response een std::string is, heeft alleen zin wanneer uw callback die context terugcast naar het bedoelde type.

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 beide helften op de eenvoudige handle die voor de overdracht wordt gebruikt:

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

De aanroep append gebruikt het geleverde bytetal. Callbackgegevens zijn niet null-terminated en een afbeelding kan nulbytes bevatten; meten met strlen zou een deel van de body verliezen. Een antwoord kan ook binnenkomen via vele callbacks van verschillende grootte.

Het teruggeven van het verbruikte bytetal accepteert het stuk. Het teruggeven van een ander aantal breekt de overdracht af met een schrijffout. De uitzonderingsbewaking voorkomt dat een toewijzingsfout door de C-callbackgrens ontsnapt; de aanroeper moet nog steeds het overdrachtsresultaat controleren voordat response als een compleet bestand wordt behandeld.

Houd de string in leven tot de overdracht is voltooid. Als een asynchrone socket-schrijfactie de inhoud daarna doorstuurt, houd die bytes dan in leven tot ook die schrijfactie is voltooid. Voor grote antwoorden verdient een begrensde streamingopzet de voorkeur boven het verzamelen van de hele body.

Gerelateerde artikelen