camel

というわけで、実際にIPv6を(改めて)はじめてみたら、意外な大御所が未対応だということが判明。それがLWP

Crypt::SSLeayIO::Socket::SSLを入れればSSL対応になるように、IO::Socket::INET6を入れればIPv6対応になるかと思えば、そうは問屋がおろしませんでした><

#!/usr/local/bin/perl
use strict;
use warnings;
use LWP::UserAgent;

my $uri = shift || die "$0 [url]";
my $res = LWP::UserAgent->new->get($uri);
print $res->status_line, "\n";
% perl lwp-ipv4.pl http://ipv6.google.com/
500 Can't connect to ipv6.google.com:80 (Bad hostname 'ipv6.google.com')

しかし、対応も簡単で、これだけでIPv6対応になります。

#!/usr/local/bin/perl
use strict;
use warnings;
BEGIN {
    no warnings 'once';
    require IO::Socket::INET6;
    $Net::HTTP::SOCKET_CLASS = 'IO::Socket::INET6';
}
use LWP::UserAgent;

my $uri = shift || die "$0 [url]";
my $res = LWP::UserAgent->new->get($uri);
print $res->status_line, "\n";
% perl lwp-ipv6.pl http://ipv6.google.com/
200 OK

以下は、作者に送ったPatchです。とりあえずこれでなおるのはHTTPだけですが、ほとんどこれで事足りると思います。

Dan the (IPv6|Perl) Monger

diff -ruN libwww-perl-5.825/lib/Net/HTTP.pm libwww-perl-5.825-ipv6/lib/Net/HTTP.pm
--- libwww-perl-5.825/lib/Net/HTTP.pm	2008-11-26 05:07:09.000000000 +0900
+++ libwww-perl-5.825-ipv6/lib/Net/HTTP.pm	2009-03-08 23:00:39.000000000 +0900
@@ -5,8 +5,11 @@
 
 $VERSION = "5.819";
 unless ($SOCKET_CLASS) {
-    eval { require IO::Socket::INET } || require IO::Socket;
-    $SOCKET_CLASS = "IO::Socket::INET";
+    $SOCKET_CLASS =
+        eval { require IO::Socket::INET6 } ? 'IO::Socket::INET6'
+      : eval { require IO::Socket::INET }  ? 'IO::Socket::INET'
+      : eval { require IO::Socket }        ? 'IO::Socket'
+      :                                      die $@;
 }
 require Net::HTTP::Methods;
 require Carp;