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);
}

प्रोक्सी URL को socks5h योजनाले प्रोक्सीलाई लक्ष्य होस्टनाम समाधान गर्न भन्छ। देखाइएको नयाँ ह्यान्डलमा अनुमति दिइएको सार्वजनिक लक्ष्य परीक्षणका लागि SOCKS5 प्रोक्सी सूचीको खाता नभएको प्रविष्टिले त्यो endpoint दिन सक्छ। TLS प्रमाणपत्र प्रमाणीकरणले आफ्नो सामान्य सेटिङ राख्छ।

खाली नभएको चङ्कका लागि शून्य फर्काउनुले libcurl लाई कलब्याकले दिइएको डेटा स्वीकार गरेन भनी बताउँछ। यो CURLE_WRITE_ERROR सँग रोकिन्छ। यहाँ त्यो त्रुटि र कलब्याकको limitReached फ्ल्यागको संयोजनलाई मात्र अपेक्षित मानिन्छ।

सीमाभन्दा छोटो प्रतिक्रिया सामान्य रूपमा सकिन्छ। सीमामा वा त्यसभन्दा माथि prefix ले बढीमा 32 KiB राख्छ, अन्तिम कलब्याकले ठूलो चङ्क पाए पनि। चङ्कका आकार फरक पर्छन्; मागिएको बफर आकार स्थिर लम्बाइका कलको वाचा होइन।

यसले राखिएको बडीलाई सीमित गर्छ, जडानमा पहिले नै बफर गरिएको वा स्थानान्तरण गरिएको हरेक बाइटलाई होइन। प्रिफिक्स बहु-बाइट अक्षर, JSON मान वा HTML तत्वभित्र सकिन सक्छ, त्यसैले यो पूर्ण रूपमा पार्स गर्न सकिने कागजात हो भनी नठान्नुहोस्।

सम्बन्धित लेखहरू