Et cURL-write-callback kan beholde et begrenset prefiks av bodyen og stoppe overføringen når grensen er nådd. Bruk ditt eget flagg for å skille den bevisste stoppen fra en annen skrivefeil.

For et nytt handle der mål-URL-en allerede er konfigurert:

$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-ens socks5h-skjema ber proxyen slå opp vertsnavnet. For en tillatt test mot et offentlig mål på det viste nye handle kan en oppføring uten konto fra SOCKS5-proxylisten levere det endepunktet. TLS-sertifikatverifiseringen beholder normale innstillinger.

Å returnere null for en ikke-tom del forteller libcurl at callbacket ikke godtok dataene som ble sendt. Det avbryter med CURLE_WRITE_ERROR. Her regnes bare kombinasjonen av den feilen og callbackets limitReached-flagg som forventet.

Et svar som er kortere enn grensen, avsluttes normalt. På eller over grensen holder prefix høyst 32 KiB, selv om det siste callbacket mottar en større del. Delstørrelser varierer; en ønsket bufferstørrelse er ikke et løfte om kall med fast lengde.

Dette begrenser bodyen som beholdes, ikke hver byte som allerede er bufret eller overført på forbindelsen. Prefikset kan ende midt i et multibyte-tegn, en JSON-verdi eller et HTML-element, så ikke anta at det er et fullstendig dokument som kan parses.

Relaterte artikler