Un callback de scriere cURL poate păstra un prefix limitat al corpului și poate opri transferul imediat ce limita este atinsă. Folosiți propriul indicator pentru a distinge această oprire intenționată de o altă eroare de scriere.

Pentru un handle nou al cărui URL țintă este deja configurat:

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

Schema socks5h a URL-ului proxy cere proxy-ului să rezolve numele gazdei țintă. Pentru un test permis către o țintă publică pe handle-ul nou arătat, o intrare fără cont din lista de proxy SOCKS5 poate furniza acel endpoint. Verificarea certificatului TLS își păstrează setările normale.

Returnarea zeroului pentru un fragment nevid îi spune lui libcurl că callback-ul nu a acceptat datele furnizate. Transferul se întrerupe cu CURLE_WRITE_ERROR. Aici este considerată așteptată doar combinația dintre acea eroare și indicatorul limitReached al callback-ului.

Un răspuns mai scurt decât limita se termină normal. La limită sau peste, prefix păstrează cel mult 32 KiB chiar dacă ultimul callback primește un fragment mai mare. Dimensiunile fragmentelor variază; o dimensiune de buffer cerută nu garantează apeluri de lungime fixă.

Aceasta limitează corpul păstrat, nu fiecare octet deja pus în buffer sau transferat pe conexiune. Prefixul se poate termina în interiorul unui caracter multi-octet, al unei valori JSON sau al unui element HTML, așa că nu presupuneți că este un document complet analizabil.

Articole similare