cURL write callback može zadržati ograničen prefiks tijela i zaustaviti prijenos kad se dosegne to ograničenje. Upotrijebite vlastitu zastavicu da razlikujete to namjerno zaustavljanje od druge greške pisanja.

Za novi handle čiji je ciljni URL već konfiguriran:

$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 shema u URL-u proxyja traži od proxyja da razriješi ciljno ime hosta. Za dopušteni test javne mete na prikazanom novom handleu, unos bez računa s popisa SOCKS5 proxyja može osigurati taj endpoint. Provjera TLS certifikata zadržava svoje uobičajene postavke.

Vraćanje nule za neprazan komad govori libcurlu da callback nije prihvatio dostavljene podatke. Prijenos se prekida s CURLE_WRITE_ERROR. Ovdje se očekivanim smatra samo spoj te greške i callbackove zastavice limitReached.

Odgovor kraći od ograničenja završava normalno. Na ograničenju ili iznad njega prefix drži najviše 32 KiB, čak i ako posljednji callback primi veći komad. Veličine komada variraju; tražena veličina međuspremnika nije obećanje poziva fiksne duljine.

Ovo ograničava zadržano tijelo, a ne svaki bajt koji je već u međuspremniku ili prenesen na vezi. Prefiks može završiti unutar višebajtnog znaka, JSON vrijednosti ili HTML elementa, pa nemojte pretpostavljati da je to potpuni dokument koji se može parsirati.

Povezani članci