¿Cómo puedo estrangular a una descarga en un programa de Perl?
-
22-08-2019 - |
Pregunta
¿Hay algún módulo de Perl disponible para su descarga de estrangulación? Me gustaría descargar un archivo determinado, pero limitar la velocidad de descarga a un número específico de KB / seg.
Solución
Parece que WWW :: Curl y la opción es CURLOPT_MAX_RECV_SPEED_LARGE lo que quiere:
#!/usr/bin/env perl
use strict;
use warnings;
use feature ':5.10';
use WWW::Curl::Easy;
# Setting the options
my $curl = WWW::Curl::Easy->new;
$curl->setopt(CURLOPT_HEADER,1);
$curl->setopt(CURLOPT_URL, 'http://www.google.com');
$curl->setopt(CURLOPT_MAX_RECV_SPEED_LARGE, 1);
my $response_body;
open my $fh, ">", \$response_body or die; # presumably this can be a real file as well.
$curl->setopt(CURLOPT_WRITEDATA,$fh);
my $ret = $curl->perform;
die 'Error: '. $curl->strerror($ret) if $ret;
my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE);
say "Received response: $response_body";
En este ejemplo, descargamos Google en un byte por segundo. Muy lento.
Otros consejos
Una técnica no se limita a Perl y no limitado a un protocolo particular es utilizar goteo :
goteo es un formador de ancho de banda de espacio de usuario portátil ligero. Puede funcionar en modo de colaboración (junto con Trickled) o en modo autónomo.
Cómo hacer que estrangular el ancho de banda de una conexión de socket en C?
Sería bueno para empaquetar esta técnica como un módulo de Perl (por ejemplo, que las subclases de IO :: Handle), pero no estoy al tanto de uno.