إيقاف نقل PHP cURL بعد بادئة من الجسم
احتفظ ببادئة محدودة داخل دالة الكتابة، ولا تعتبر متوقعًا إلا خطأ الكتابة الذي تسبّبه تلك الدالة عن قصد.
يمكن لدالة الكتابة في 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 أن يوفّر تلك النقطة الطرفية. يحتفظ التحقق من شهادة TLS بإعداداته العادية.
إرجاع صفر لقطعة غير فارغة يخبر libcurl بأن الدالة لم تقبل البيانات المقدَّمة. فيُلغى النقل بالخطأ CURLE_WRITE_ERROR. وهنا لا يُعدّ متوقعًا إلا اجتماع ذلك الخطأ مع راية limitReached الخاصة بالدالة.
الاستجابة الأقصر من الحد تنتهي بشكل طبيعي. وعند الحد أو فوقه يبقى prefix محتفظًا بـ32 KiB على الأكثر حتى لو تلقت الدالة الأخيرة قطعة أكبر. أحجام القطع في الدوال تتفاوت؛ وحجم المخزن المطلوب ليس وعدًا باستدعاءات ثابتة الطول.
هذا يحدّ من الجسم المحتفظ به، لا من كل بايت خُزّن مؤقتًا أو نُقل على الاتصال. قد تنتهي البادئة داخل محرف متعدد البايتات أو قيمة JSON أو عنصر HTML، فلا تفترض أنها مستند كامل قابل للتحليل.