Zaustavljanje PHP cURL prijenosa nakon prefiksa tijela
Zadržite ograničen prefiks u write callbacku i prepoznajte samo grešku pisanja koju taj callback namjerno izaziva.
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.