Een cURL-write-callback kan een begrensde prefix van de body bewaren en de overdracht stoppen zodra die limiet is bereikt. Gebruik je eigen vlag om die bewuste stop te onderscheiden van een andere schrijffout.

Voor een nieuwe handle waarvan de doel-URL al is ingesteld:

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

Het socks5h-schema van de proxy-URL vraagt de proxy om de doelhostnaam op te lossen. Voor een toegestane test tegen een openbaar doel op de getoonde nieuwe handle kan een vermelding zonder account uit de SOCKS5-proxylijst dat endpoint leveren. De TLS-certificaatverificatie houdt de normale instellingen.

Nul teruggeven voor een niet-lege chunk vertelt libcurl dat de callback de aangeleverde gegevens niet heeft geaccepteerd. Het breekt af met CURLE_WRITE_ERROR. Hier wordt alleen de combinatie van die fout en de limitReached-vlag van de callback als verwacht beschouwd.

Een antwoord dat korter is dan de limiet eindigt normaal. Op of boven de limiet houdt prefix hoogstens 32 KiB, zelfs als de laatste callback een grotere chunk ontvangt. Chunkgroottes verschillen; een gevraagde buffergrootte is geen belofte van aanroepen met vaste lengte.

Dit beperkt de bewaarde body, niet elke byte die al gebufferd of op de verbinding overgedragen is. De prefix kan eindigen midden in een multibyte-teken, een JSON-waarde of een HTML-element, dus ga er niet van uit dat het een volledig te parseren document is.

Gerelateerde artikelen