Write callback cURL může uchovat omezený prefix těla a přerušit přenos, jakmile je tohoto limitu dosaženo. Vlastním příznakem odlište toto záměrné zastavení od jiné chyby zápisu.

Pro nový handle, jehož cílové URL je již nastaveno:

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

Schéma socks5h v URL proxy žádá proxy, aby přeložila cílové jméno hostitele. Pro povolený test veřejného cíle na uvedeném novém handle může záznam bez účtu z seznamu SOCKS5 proxy poskytnout tento endpoint. Ověřování TLS certifikátu si zachovává normální nastavení.

Vrácení nuly pro neprázdný blok říká libcurl, že callback nepřijal dodaná data. Ten přeruší přenos s CURLE_WRITE_ERROR. Za očekávanou se zde považuje jen kombinace této chyby a příznaku limitReached daného callbacku.

Odpověď kratší než limit skončí normálně. Na limitu nebo nad ním drží prefix nejvýše 32 KiB, i když poslední callback obdrží větší blok. Velikosti bloků se mění; požadovaná velikost bufferu není slibem volání pevné délky.

Toto omezuje uchovávané tělo, nikoli každý bajt již uložený ve vyrovnávací paměti nebo přenesený po spojení. Prefix může skončit uprostřed vícebajtového znaku, hodnoty JSON nebo prvku HTML, takže nepředpokládejte, že jde o úplný analyzovatelný dokument.

Související články