Una funció de retorn d'escriptura de cURL pot conservar un prefix limitat del cos i aturar la transferència quan s'assoleix aquest límit. Feu servir el vostre propi indicador per distingir aquesta aturada deliberada d'una altra fallada d'escriptura.

Per a un handle nou el URL de destinació del qual ja està configurat:

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

L'esquema socks5h del URL del proxy demana al proxy que resolgui el nom d'amfitrió de destinació. Per a una prova permesa amb una destinació pública sobre l'handle nou mostrat, una entrada sense compte de la llista de proxys SOCKS5 pot proporcionar aquest punt final. La verificació del certificat TLS manté la seva configuració normal.

Retornar zero per a un fragment no buit diu a libcurl que la funció de retorn no ha acceptat les dades subministrades. Això avorta amb CURLE_WRITE_ERROR. Aquí només es tracta com a esperada la combinació d'aquest error i l'indicador limitReached de la funció.

Una resposta més curta que el límit acaba normalment. Al límit o per sobre, prefix conserva com a màxim 32 KiB encara que la funció final rebi un fragment més gran. Les mides dels fragments varien; una mida de buffer sol·licitada no garanteix crides de longitud fixa.

Això limita el cos conservat, no cada byte ja emmagatzemat o transferit a la connexió. El prefix pot acabar dins d'un caràcter multibyte, d'un valor JSON o d'un element HTML, així que no assumiu que és un document complet que es pugui analitzar.

Articles relacionats