Bir cURL yazma callback'i sınırlı bir gövde öneki tutabilir ve bu sınıra ulaşıldığında aktarımı durdurabilir. Bu kasıtlı durdurmayı başka bir yazma hatasından ayırmak için kendi bayrağınızı kullanın.

Hedef URL'si zaten yapılandırılmış yeni bir handle için:

$limit = 32768;
$prefix = '';
$limitReached = false;

curl_setopt_array($ch, [
    CURLOPT_PROXY => 'socks5h://proxy.example.net:1080',
    CURLOPT_HEADER => false,
    CURLOPT_WRITEFUNCTION => function ($handle, $chunk)
        use (&$prefix, &$limitReached, $limit) {
        $remaining = $limit - strlen($prefix);
        $prefix .= substr($chunk, 0, $remaining);

        if (strlen($prefix) >= $limit) {
            $limitReached = true;
            return 0;
        }

        return strlen($chunk);
    },
]);

$result = curl_exec($ch);
$error = curl_errno($ch);

$expectedStop = $limitReached && $error === CURLE_WRITE_ERROR;
if ($result === false && !$expectedStop) {
    throw new RuntimeException(curl_error($ch), $error);
}

Proxy URL'sinin socks5h şeması, proxy'den hedef ana bilgisayar adını çözmesini ister. Gösterilen yeni handle üzerinde izin verilen bir genel hedef testi için SOCKS5 proxy listesindeki hesapsız bir giriş bu uç noktayı sağlayabilir. TLS sertifika doğrulaması normal ayarlarını korur.

Boş olmayan bir parça için sıfır döndürmek libcurl'e callback'in verilen verileri kabul etmediğini söyler. Aktarım CURLE_WRITE_ERROR ile kesilir. Burada yalnızca bu hatanın ve callback'in limitReached bayrağının birlikteliği beklenen olarak kabul edilir.

Sınırdan kısa bir yanıt normal şekilde biter. Sınırda veya üzerinde, son callback daha büyük bir parça alsa bile prefix en fazla 32 KiB tutar. Parça boyutları değişir; istenen arabellek boyutu sabit uzunluklu çağrılar için bir söz değildir.

Bu, tutulan gövdeyi sınırlar; bağlantıda zaten arabelleğe alınmış veya aktarılmış her baytı değil. Önek çok baytlı bir karakterin, bir JSON değerinin veya bir HTML öğesinin içinde bitebilir, bu yüzden onu tamamen ayrıştırılabilir bir belge sanmayın.

İlgili makaleler