Haltigi PHP cURL-transigon post korpa antaŭsigno
Konservu limigitan antaŭsignon en skriba retrovoko kaj rekonu nur la skriban eraron, kiun tiu retrovoko mem intence kaŭzas.
Skriba retrovoko de cURL povas konservi limigitan korpan antaŭsignon kaj haltigi la transigon, kiam tiu limo estas atingita. Uzu vian propran flagon por distingi tiun intencan halton de alia skriba fiasko.
Por nova tenilo, kies cela URL jam estas agordita:
$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);
}
La socks5h-skemo de la prokura URL petas la prokurilon solvi la celan gastigantan nomon. Por permesita testo al publika celo ĉe la montrita nova tenilo, senkonta ero el la listo de SOCKS5-prokuraĵoj povas doni tiun finpunkton. TLS-atestila kontrolo konservas siajn normalajn agordojn.
Redoni nulon por ne-malplena bloko sciigas al libcurl, ke la retrovoko ne akceptis la donitajn datumojn. Ĝi ĉesigas kun CURLE_WRITE_ERROR. Ĉi tie nur la kombino de tiu eraro kaj la limitReached-flago de la retrovoko estas traktata kiel atendita.
Respondo pli mallonga ol la limo finiĝas normale. Ĉe aŭ super la limo, prefix tenas maksimume 32 KiB, eĉ se la lasta retrovoko ricevas pli grandan blokon. Blokgrandoj varias; petita bufra grandeco ne estas promeso pri fikslongaj vokoj.
Ĉi tio limigas la konservitan korpon, ne ĉiun bajton jam bufrigitan aŭ transdonitan sur la konekto. La antaŭsigno povas finiĝi ene de plurbajta signo, JSON-valoro aŭ HTML-elemento, do ne supozu, ke ĝi estas kompleta analizebla dokumento.