Bir proxy HTML-i uğurla əldə edə və yenə də şəkli C++ buferinə köçürərkən onu korlaya bilər. Proxy protokolunu dəyişməzdən əvvəl qəbul callback-ini və onun konteksti kimi ötürülən obyekti yoxlayın.

CURLOPT_WRITEDATA yazma callback-inə göstərici verir. Fərdi callback olmadan libcurl-un standart yazıcısı FILE * gözləyir. &response kimi ünvan, burada response std::string-dir, yalnız callback həmin konteksti nəzərdə tutulan tipə çevirdikdə məna kəsb edir.

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

Hər iki hissəni köçürmə üçün istifadə olunan sadə tutacaqda qeydiyyatdan keçirin:

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

append çağırışı ötürülən bayt sayından istifadə edir. Callback veriləri null ilə sonlanmır və şəkildə sıfır bayt ola bilər; onu strlen ilə ölçmək bədənin bir hissəsini itirərdi. Cavab həmçinin müxtəlif ölçülü çoxsaylı callback çağırışları ilə gələ bilər.

İstehlak olunan bayt sayını qaytarmaq parçanı qəbul edir. Fərqli say qaytarmaq köçürməni yazma xətası ilə dayandırır. İstisna qoruyucusu yaddaş ayırma uğursuzluğunun C callback sərhədindən çıxmasının qarşısını alır; çağıran response-u tam fayl kimi qəbul etməzdən əvvəl köçürmə nəticəsini yoxlamalıdır.

Sətri köçürmə bitənə qədər canlı saxlayın. Əgər asinxron soket yazması sonra onun məzmununu ötürürsə, həmin baytları da o yazma tamamlanana qədər canlı saxlayın. Böyük cavablar üçün bütün bədəni toplamaq əvəzinə məhdud axın təşkili üstünlük təşkil edir.

Əlaqəli məqalələr