Una función de escritura de cURL puede retener un prefijo limitado del cuerpo y detener la transferencia en cuanto se alcanza ese límite. Use su propio indicador para distinguir esa parada deliberada de otro fallo de escritura.

Para un handle nuevo cuyo URL de destino ya está configurado:

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

El esquema socks5h del URL del proxy pide al proxy que resuelva el nombre de host de destino. Para una prueba permitida contra un destino público en el handle nuevo mostrado, una entrada sin cuenta de la lista de proxies SOCKS5 puede aportar ese endpoint. La verificación del certificado TLS mantiene sus ajustes normales.

Devolver cero para un fragmento no vacío indica a libcurl que la función no aceptó los datos suministrados. Aborta con CURLE_WRITE_ERROR. Aquí solo se considera esperada la combinación de ese error y el indicador limitReached de la función.

Una respuesta más corta que el límite termina con normalidad. En el límite o por encima, prefix retiene como máximo 32 KiB aunque la función final reciba un fragmento mayor. Los tamaños de fragmento varían; un tamaño de búfer solicitado no garantiza llamadas de longitud fija.

Esto limita el cuerpo retenido, no cada byte ya almacenado en búfer o transferido en la conexión. El prefijo puede terminar dentro de un carácter multibyte, un valor JSON o un elemento HTML, así que no suponga que es un documento completo que se pueda analizar.

Artículos relacionados