En proxy kan hente HTML med succes og alligevel ødelægge et billede, når det kopieres ind i en C++-buffer. Før du ændrer proxyprotokollen, skal du kontrollere modtagelses-callbacket og det objekt, der sendes som dets kontekst.

CURLOPT_WRITEDATA leverer en peger til skrive-callbacket. Uden et tilpasset callback forventer libcurls standard-skriver en FILE *. En adresse som &response, hvor response er en std::string, giver kun mening, når dit callback caster den kontekst tilbage til den tilsigtede 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;
}

Registrer begge halvdele på det simple håndtag, der bruges til overførslen:

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

Kaldet append bruger det leverede byttal. Callback-data er ikke null-termineret, og et billede kan indeholde nulbytter; at måle det med strlen ville miste en del af kroppen. Et svar kan også ankomme gennem mange callback-kald af forskellig størrelse.

At returnere det forbrugte byttal accepterer stykket. At returnere et andet tal afbryder overførslen med en skrivefejl. Undtagelsesværnet forhindrer, at en allokeringsfejl slipper ud gennem C-callback-grænsen; kalderen skal stadig kontrollere overførselsresultatet, før response behandles som en komplet fil.

Hold strengen i live, indtil overførslen er færdig. Hvis en asynkron socket-skrivning derefter videresender dens indhold, skal du holde de byter i live, indtil den skrivning også er færdig. For store svar er en afgrænset streamingordning at foretrække frem for at akkumulere hele kroppen.

Relaterede artikler