Zaustavite PHP cURL prijenos nakon prefiksa tijela
Zadržite ograničen prefiks u write callbacku i prepoznajte samo grešku pisanja koju je taj callback namjerno izazvao.
cURL write callback može zadržati ograničen prefiks tijela i zaustaviti prijenos kada se taj limit dostigne. Upotrijebite vlastiti flag da razlikujete to namjerno 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 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 iz SOCKS5 liste proxyja može dati taj endpoint. Provjera TLS certifikata zadržava normalne postavke.
Vraćanje nule za neprazan chunk 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 callbackovog limitReached flaga.
Odgovor kraći od limita završava normalno. Na limitu ili iznad njega prefix drži najviše 32 KiB, čak i ako posljednji callback primi veći chunk. Veličine chunkova variraju; tražena veličina bafera nije obećanje poziva fiksne dužine.
Ovo ograničava zadržano tijelo, a ne svaki bajt koji je već u baferu 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.