Como faço para ativar o suporte IPv6 em LWP?
Pergunta
O código a seguir ...
my $user_agent = LWP::UserAgent->new;
my $request = HTTP::Request->new(GET => $url);
my $response = $user_agent->request($request);
if ($response->is_success) {
print "OK\n";
} else {
die($response->status_line);
}
.. falhará com ..
500 Can't connect to <hostname> (Bad hostname '<hostname>')
.. se o nome do host em $ url é um único endereço IPv6 (isto é: a presença de um registro AAAA
, mas não há registro A
).
As minhas perguntas são:
- Como faço para ativar o suporte IPv6 em LWP?
- Como faço para configurar as definições do LWP para "preferem-IPv4-over-IPv6" (
A
vs.AAAA
) / "preferem-IPv6-over-IPv4" (AAAA
vs.A
)?
Solução
Parece que você só precisa usar Net :: INET6Glue :: INET_is_INET6 . Para citar o seu exemplo:
use Net::INET6Glue::INET_is_INET6;
use LWP::Simple;
print get( 'http://[::1]:80' );
print get( 'http://ipv6.google.com' );
Outras dicas
Eu acredito que você vai ter que mudar o módulo para usar o módulo de rede IPv6. Por padrão, ele não tem essa habilitado: http : //eintr.blogspot.com/2009/03/bad-state-of-ipv6-in-perl.html . Eu não acredito que há algo tão simples como "preferem-ipv6"
Debian Wheezy (perl 5,14)
Bom trabalho:
use LWP::Simple;
print get( 'http://ip6-localhost:80' );
Não funciona (1)
use LWP::Simple;
print get( 'http://[::1]:80' );
Não funciona (2) [Return: Bad hostname ]
use LWP::Simple;
$ua = new LWP::UserAgent();
my $req = new HTTP::Request("GET", "http://[::1]/");
my $res = $ua->request($req);
Não funciona (3) [Return: Conexão recusada ]
use Net::INET6Glue::INET_is_INET6;
use LWP::Simple;
$ua = new LWP::UserAgent();
my $req = new HTTP::Request("GET", "http://[::1]/");
my $res = $ua->request($req);
Soo, se você não precisa de endereço IPv6 em http pedido, está tudo bem. : (