یک 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 پروکسی از پروکسی می‌خواهد نام میزبان مقصد را resolve کند. برای یک آزمون مجاز روی مقصد عمومی با handle تازه‌ای که نشان داده شده، یک ورودی بدون حساب از فهرست پروکسی SOCKS5 می‌تواند آن endpoint را فراهم کند. بررسی گواهی TLS تنظیمات عادی خود را حفظ می‌کند.

بازگرداندن صفر برای یک تکه ناتهی به libcurl می‌گوید که callback داده‌های ارائه‌شده را نپذیرفته است. با CURLE_WRITE_ERROR قطع می‌شود. در اینجا تنها ترکیب آن خطا و پرچم limitReached مربوط به callback به‌عنوان انتظارپذیر در نظر گرفته می‌شود.

پاسخی کوتاه‌تر از حد، به‌طور عادی پایان می‌یابد. در حد یا بالاتر از آن، prefix حداکثر 32 KiB را نگه می‌دارد، حتی اگر callback نهایی تکه بزرگ‌تری دریافت کند. اندازه تکه‌ها متفاوت است؛ اندازه بافر درخواستی تضمینی برای فراخوانی‌های با طول ثابت نیست.

این بدنه نگه‌داشته‌شده را محدود می‌کند، نه هر بایتی را که پیش‌تر در بافر قرار گرفته یا روی اتصال منتقل شده است. پیشوند می‌تواند درون یک نویسه چندبایتی، یک مقدار JSON یا یک عنصر HTML تمام شود، پس فرض نکنید که سند کامل و قابل تجزیه است.

مقالات مرتبط