Zastavenie prenosu PHP cURL po prefixe tela
Udržujte obmedzený prefix vo write callbacku a rozpoznajte iba chybu zápisu, ktorú tento callback spôsobil úmyselne.
Write callback cURL môže uchovať obmedzený prefix tela a prerušiť prenos hneď, ako sa dosiahne tento limit. Vlastnou príznakovou premennou odlíšte toto úmyselné zastavenie od inej chyby zápisu.
Pre nový handle, ktorého cieľová URL je už nastavená:
$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);
}
Schéma socks5h v URL proxy žiada proxy, aby preložila cieľové meno hostiteľa. Pre povolený test verejného cieľa na uvedenom novom handle môže záznam bez účtu zo zoznamu SOCKS5 proxy poskytnúť tento endpoint. Overovanie TLS certifikátu si zachováva normálne nastavenia.
Vrátenie nuly pre neprázdny blok hovorí libcurlu, že callback neprijal dodané údaje. Prenos sa preruší s CURLE_WRITE_ERROR. Za očakávanú sa tu považuje iba kombinácia tejto chyby a príznaku limitReached daného callbacku.
Odpoveď kratšia ako limit skončí normálne. Na limite alebo nad ním drží prefix najviac 32 KiB, aj keď posledný callback dostane väčší blok. Veľkosti blokov sa menia; požadovaná veľkosť buffera nie je prísľubom volaní s pevnou dĺžkou.
Toto obmedzuje uchovávané telo, nie každý bajt už vo vyrovnávacej pamäti alebo prenesený po spojení. Prefix môže skončiť uprostred viacbajtového znaku, hodnoty JSON alebo prvku HTML, preto nepredpokladajte, že ide o úplný dokument, ktorý sa dá analyzovať.