Ein proxy kan hente HTML med hell og likevel øydeleggje eit bilete medan det blir kopiert inn i ein C++-buffer. Før du endrar proxyprotokollen, kontroller mottakstilbakekallinga og objektet som blir sendt som konteksten.

CURLOPT_WRITEDATA leverer ein peikar til skrivetilbakekallinga. Utan ei eiga tilbakekalling ventar standard-skrivaren i libcurl ein FILE *. Ei adresse som &response, der response er ein std::string, gir berre meining når tilbakekallinga di castar den konteksten tilbake til den tiltenkte typen.

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 halvdelane på det enkle handtaket som blir brukt for overføringa:

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

Kallet append brukar byttalet som vart levert. Tilbakekallingsdata er ikkje nullterminerte, og eit bilete kan innehalde nullbytar; å måle det med strlen ville miste ein del av kroppen. Eit svar kan òg kome gjennom mange tilbakekallingar av ulik storleik.

Å returnere det forbrukte byttalet godtek delen. Å returnere eit anna tal avbryt overføringa med ein skrivefeil. Unntaksvernet hindrar at ein allokeringsfeil slepp ut gjennom C-tilbakekallingsgrensa; den som kallar, må framleis kontrollere overføringsresultatet før response blir handsama som ei komplett fil.

Hald strengen i live til overføringa er ferdig. Viss ein asynkron socket-skriving deretter sender innhaldet vidare, må du halde dei bytane i live til den skrivinga òg er ferdig. For store svar er ei avgrensa strøymingsordning å føretrekkje framfor å samle heile kroppen.

Relaterte artiklar