Zaustavljanje PHP cURL prenosa posle prefiksa tela
Zadržite ograničen prefiks u write callback-u i prepoznajte samo grešku pisanja koju taj callback namerno izaziva.
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.