Запирање на PHP cURL пренос по префикс од телото
Задржете ограничен префикс во callback за пишување и препознајте ја само грешката при пишување што овој callback намерно ја предизвикува.
Callback за пишување на cURL може да задржи ограничен префикс од телото и да го запре преносот штом се достигне таа граница. Користете сопствено знаменце за да го разликувате тоа намерно запирање од друга грешка при пишување.
За нов handle чијшто целен 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-то на проксито бара проксито да го реши името на целниот домаќин. За дозволен тест на јавна цел на прикажаниот нов handle, запис без сметка од списокот со SOCKS5 проксија може да го обезбеди тој endpoint. Проверката на TLS сертификатот ги задржува нормалните поставки.
Враќањето нула за непразен дел му кажува на libcurl дека callback-от не ги прифатил доставените податоци. Тој прекинува со CURLE_WRITE_ERROR. Овде како очекувана се смета само комбинацијата од таа грешка и знаменцето limitReached на callback-от.
Одговор пократок од границата завршува нормално. На границата или над неа prefix задржува најмногу 32 KiB, дури и ако последниот callback добие поголем дел. Големините на деловите варираат; бараната големина на бафер не е ветување за повици со фиксна должина.
Ова го ограничува задржаното тело, а не секој бајт веќе бафериран или пренесен на врската. Префиксот може да заврши внатре во повеќебајтен знак, JSON вредност или HTML елемент, затоа не претпоставувајте дека е целосен документ што може да се анализира.