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 પ્રોક્સી સૂચિમાંથી ખાતા વગરની એન્ટ્રી તે એન્ડપોઇન્ટ પૂરો પાડી શકે છે. TLS પ્રમાણપત્ર ચકાસણી તેની સામાન્ય સેટિંગ્સ રાખે છે.

ખાલી ન હોય તેવા ચંક માટે શૂન્ય પરત આપવાથી libcurlને જણાવે છે કે કૉલબેકે આપેલો ડેટા સ્વીકાર્યો નથી. તે CURLE_WRITE_ERROR સાથે અટકે છે. અહીં ફક્ત તે ભૂલ અને કૉલબેકના limitReached ફ્લેગનું સંયોજન જ અપેક્ષિત ગણાય છે.

મર્યાદા કરતાં ટૂંકો પ્રતિભાવ સામાન્ય રીતે પૂરો થાય છે. મર્યાદા પર કે તેથી વધુ હોય ત્યારે prefix વધુમાં વધુ 32 KiB રાખે છે, છેલ્લો કૉલબેક મોટો ચંક મેળવે તો પણ. ચંકના આકાર બદલાય છે; માંગેલું બફર કદ નિશ્ચિત લંબાઈની કૉલની બાંયધરી નથી.

આ રાખેલી બોડી મર્યાદિત કરે છે, કનેક્શન પર પહેલેથી બફર થયેલા કે ટ્રાન્સફર થયેલા દરેક બાઇટને નહીં. પ્રિફિક્સ બહુ-બાઇટ અક્ષર, JSON મૂલ્ય કે HTML ઘટકની અંદર પૂરો થઈ શકે છે, તેથી ધારો નહીં કે તે સંપૂર્ણ પાર્સ કરી શકાય તેવું દસ્તાવેજ છે.

સંબંધિત લેખો