Et cURL-write-callback kan holde på et begrenset prefiks av bodyen og stanse overføringen når grensen er nådd. Bruk din egen flagg for å skille den bevisste stansen fra en annen skrivefeil.

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

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

socks5h-skjemaet i proxy-URL-en ber proxyen slå opp målvertsnavnet. For en tillatt test mot et offentlig mål på det viste nye handlet kan en oppføring uten konto fra SOCKS5-proxylisten skaffe det endepunktet. TLS-sertifikatverifiseringen beholder de vanlige innstillingene.

Å 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