Ang isang proxy ay maaaring matagumpay na makakuha ng HTML at gayon pa man ay masira ang isang larawan habang kinokopya ito sa isang C++ buffer. Bago baguhin ang protocol ng proxy, suriin ang callback ng pagtanggap at ang object na ipinapasa bilang konteksto nito.

CURLOPT_WRITEDATA ay nagbibigay ng pointer sa callback ng pagsulat. Kung walang pasadyang callback, inaasahan ng default na manunulat ng libcurl ang isang FILE *. Ang isang address tulad ng &response, kung saan ang response ay isang std::string, ay may saysay lamang kapag ang iyong callback ay nag-convert ng kontekstong iyon pabalik sa nilalayong uri.

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

Irehistro ang dalawang hati sa payak na handle na ginagamit para sa paglilipat:

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

Ginagamit ng tawag na append ang ibinigay na bilang ng byte. Ang data ng callback ay hindi null-terminated at ang isang larawan ay maaaring maglaman ng mga zero byte; ang pagsukat nito gamit ang strlen ay mawawala ang bahagi ng katawan. Ang isang tugon ay maaari ring dumating sa pamamagitan ng maraming tawag na may iba't ibang laki.

Ang pagbabalik ng natupok na bilang ng byte ay tumatanggap ng tipak. Ang pagbabalik ng ibang bilang ay pumipigil sa paglilipat na may error sa pagsulat. Pinipigilan ng bantay ng exception ang isang pagkabigo sa paglalaan na makatakas sa hangganan ng C callback; kailangan pa ring suriin ng tumatawag ang resulta ng paglilipat bago ituring ang response na kumpletong file.

Panatilihing buhay ang string hanggang matapos ang paglilipat. Kung ang isang asynchronous na pagsulat sa socket ay nagpapasa ng mga nilalaman nito, panatilihing buhay ang mga byte na iyon hanggang matapos din ang pagsulat na iyon. Para sa malalaking tugon, mas mainam ang isang bounded na kaayusan ng streaming kaysa sa pag-iipon ng buong katawan.

Kaugnay na mga artikulo