Bir vekil sunucu HTML'i başarıyla alabilir ve yine de görüntüyü C++ tamponuna kopyalarken bozabilir. Vekil sunucu protokolünü değiştirmeden önce alma geri çağırmasını ve bağlam olarak geçirilen nesneyi denetleyin.

CURLOPT_WRITEDATA yazma geri çağırmasına bir işaretçi sağlar. Özel bir geri çağırma yoksa libcurl'ün varsayılan yazıcısı bir FILE * bekler. &response gibi bir adres, response bir std::string olduğunda, yalnızca geri çağırmanız bu bağlamı amaçlanan türe geri dönüştürdüğünde anlamlıdır.

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

Her iki yarıyı da aktarım için kullanılan basit tanıtıcıya kaydedin:

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

append çağrısı verilen bayt sayısını kullanır. Geri çağırma verileri null ile sonlanmaz ve bir görüntü sıfır bayt içerebilir; strlen ile ölçmek gövdenin bir kısmını kaybederdi. Bir yanıt farklı boyutlarda birçok geri çağırma yoluyla da gelebilir.

Tüketilen bayt sayısını döndürmek parçayı kabul eder. Farklı bir sayı döndürmek aktarımı yazma hatasıyla iptal eder. Özel durum koruması, bir ayırma hatasının C geri çağırma sınırından dışarı sızmasını engeller; çağıran yine de response'u tam bir dosya olarak ele almadan önce aktarım sonucunu denetlemelidir.

Dizeyi aktarım bitene kadar canlı tutun. Eşzamansız bir soket yazımı ardından içeriğini iletirse, o yazım da tamamlanana kadar bu baytları canlı tutun. Büyük yanıtlar için, gövdenin tamamını biriktirmek yerine sınırlı bir akış düzeni tercih edilir.

İlgili makaleler