עצירת העברת 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 של ה-proxy מבקשת מה-proxy לפתור את שם המארח של היעד. לבדיקה מורשית של יעד ציבורי ב-handle החדש שמוצג, רשומה ללא חשבון מרשימת ה-proxies של SOCKS5 יכולה לספק את נקודת הקצה הזו. אימות תעודת TLS שומר על ההגדרות הרגילות שלו.
החזרת אפס עבור מקטע שאינו ריק אומרת ל-libcurl שה-callback לא קיבל את הנתונים שסופקו. הוא מפסיק עם CURLE_WRITE_ERROR. כאן רק השילוב של השגיאה הזו עם דגל limitReached של ה-callback נחשב לצפוי.
תגובה קצרה מהגבול מסתיימת כרגיל. בגבול או מעליו, prefix מחזיק לכל היותר 32 KiB גם אם ה-callback האחרון מקבל מקטע גדול יותר. גדלי המקטעים משתנים; גודל חוצץ מבוקש אינו הבטחה לקריאות באורך קבוע.
זה מגביל את הגוף הנשמר, לא כל בייט שכבר נאגר בחוצץ או הועבר על החיבור. הקידומת יכולה להסתיים בתוך תו מרובה בייטים, ערך JSON או רכיב HTML, ולכן אל תניחו שמדובר במסמך מלא שניתן לנתח.