cURL write callback može da zadrži ograničen prefiks tela i zaustavi prenos kada se ta granica dostigne. Koristite sopstvenu zastavicu da razlikujete to namerno zaustavljanje od druge greške pisanja.

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

$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 šema u URL-u proksija traži od proksija da razreši ciljno ime hosta. Za dozvoljeni test javne mete na prikazanom novom handle-u, unos bez naloga sa liste SOCKS5 proksija može da obezbedi taj endpoint. Provera TLS sertifikata zadržava uobičajena podešavanja.

Vraćanje nule za neprazan komad govori libcurl-u da callback nije prihvatio dostavljene podatke. Prenos se prekida sa CURLE_WRITE_ERROR. Ovde se očekivanim smatra samo spoj te greške i callback-ove zastavice limitReached.

Odgovor kraći od granice završava se normalno. Na granici ili iznad nje prefix drži najviše 32 KiB, čak i ako poslednji callback primi veći komad. Veličine komada variraju; tražena veličina bafera nije obećanje poziva fiksne dužine.

Ovo ograničava zadržano telo, a ne svaki bajt koji je već u baferu ili prenet na vezi. Prefiks može da se završi unutar višebajtnog znaka, JSON vrednosti ili HTML elementa, pa nemojte pretpostavljati da je to potpuni dokument koji se može parsirati.

Povezani članci