Una callback di scrittura cURL può conservare un prefisso limitato del corpo e interrompere il trasferimento appena si raggiunge quel limite. Usate un vostro flag per distinguere questa interruzione voluta da un altro errore di scrittura.

Per un handle nuovo il cui URL di destinazione è già configurato:

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

Lo schema socks5h dell'URL del proxy chiede al proxy di risolvere il nome host di destinazione. Per un test consentito verso una destinazione pubblica sull'handle nuovo mostrato, una voce senza account dalla lista di proxy SOCKS5 può fornire quell'endpoint. La verifica del certificato TLS mantiene le sue impostazioni normali.

Restituire zero per un blocco non vuoto dice a libcurl che la callback non ha accettato i dati forniti. Interrompe con CURLE_WRITE_ERROR. Qui è considerata attesa solo la combinazione di quell'errore e del flag limitReached della callback.

Una risposta più corta del limite termina normalmente. Al limite o oltre, prefix trattiene al massimo 32 KiB anche se la callback finale riceve un blocco più grande. Le dimensioni dei blocchi variano; una dimensione di buffer richiesta non garantisce chiamate di lunghezza fissa.

Questo limita il corpo trattenuto, non ogni byte già memorizzato nel buffer o trasferito sulla connessione. Il prefisso può terminare dentro un carattere multibyte, un valore JSON o un elemento HTML, quindi non date per scontato che sia un documento completo analizzabile.

Articoli correlati