Спыніць перадачу PHP cURL пасля прэфікса цела
Трымайце абмежаваны прэфікс у callback запісу і распазнавайце толькі тую памылку запісу, якую наўмысна выклікаў гэты callback.
Callback запісу cURL можа захоўваць абмежаваны прэфікс цела і спыніць перадачу, як толькі гэты ліміт дасягнуты. Выкарыстайце ўласны сцяг, каб адрозніць гэтае наўмыснае спыненне ад іншай памылкі запісу.
Для новага дэскрыптара, у якога мэтавы URL ужо наладжаны:
$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 у URL проксі просіць проксі вызначыць імя мэтавага хоста. Для дазволенага тэсту публічнай мэты на паказаным новым дэскрыптары запіс без уліковага запісу з спіса SOCKS5-проксі можа даць гэты endpoint. Праверка сертыфіката TLS захоўвае звычайныя налады.
Вяртанне нуля для непустой порцыі паведамляе libcurl, што callback не прыняў перададзеныя даныя. Ён спыняецца з CURLE_WRITE_ERROR. Тут чаканым лічыцца толькі спалучэнне гэтай памылкі і сцяга limitReached callback.
Адказ, карацейшы за ліміт, завяршаецца звычайна. На ліміце або вышэй prefix захоўвае не больш за 32 KiB, нават калі апошні callback атрымае большую порцыю. Памеры порцый у callback розныя; запытаны памер буфера не гарантуе выклікаў фіксаванай даўжыні.
Гэта абмяжоўвае захаванае цела, а не кожны байт, ужо буфераваны або перададзены ў злучэнні. Прэфікс можа скончыцца ўнутры шматбайтавага сімвала, значэння JSON або элемента HTML, таму не лічыце яго поўным дакументам, які можна разабраць.