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, таму не лічыце яго поўным дакументам, які можна разабраць.

Падобныя артыкулы