如何为HTTP :: AppServer添加ipv6支持?

时间:2012-07-11 20:09:27

标签: perl http ipv6

我有一个使用cpan模块HTTP::AppServer的http服务器。

我可以使用127.0.0.1localhost连接到我的服务器,而::1则可能会失败。

以下是curl的一些示例:

$ curl http://127.0.0.1:8080/index.html
This is a test.
$ curl -g http://[::1]:8080/index.html
curl: (7) couldn't connect to host

这是服务器的启动方式:

use HTTP::AppServer;
use IO::Socket::IP -register;

  my $server = HTTP::AppServer->new( StartBackground => 0, ServerPort => 8080 );

  $server->plugin('FileRetriever', DocRoot => '/tmp');

  $server->start; 

实际上它要复杂得多。但我不认为脚本的其余部分是必要的。我添加了模块IO::Socket::IP并将模块Socket升级到找到的here版本,以使IO :: Socket :: IP正常工作。

仍然,它不起作用。

3 个答案:

答案 0 :(得分:0)

尝试使用比5.14更新的Perl版本。

http://www.perl.org/about/whitepapers/perl-ipv6.html

答案 1 :(得分:0)

如果这不起作用,则可能是IO::Socket::IPHTTP::AppServer中某处的错误。你可以把它作为IO::Socket::IP上的RT错误发送给我,我会看看它。

https://rt.cpan.org/Dist/Display.html?Queue=IO-Socket-IP

答案 2 :(得分:0)

在LeoNerd说IO :: Socket :: IP在这种情况下无法帮助我之后,我找到了另一种解决方案,虽然这个解决方案只适用于某些perl版本。

HTTP :: AppServer基于HTTP :: Server :: Simple,我在cpan上找到了支持ipv6的第二个模块的更新版本。

首先,您需要在此处下载较新版本的HTTP :: Server :: Simple:

http://metacpan.org/pod/HTTP::Server::Simple

如您所见,它有一个不同的new方法接受新参数family

现在你必须使用HTTP :: AppServer.pm并从

修改init函数
sub init
{
    my ($self, %opts) = @_;

    # server options defaults
    my %defaults = (StartBackground => 0, ServerPort => 3000);

    # set options or use defaults
    map { $self->{$_} = (exists $opts{$_} ? $opts{$_} : $defaults{$_}) }
        keys %defaults;

    $self->{'server'} = HTTP::AppServer::Base->new($self->{'ServerPort'});

    return $self;
}

sub init
{
    my ($self, %opts) = @_;

    # server options defaults
    my %defaults = (StartBackground => 0, ServerPort => 3000);

    # set options or use defaults
    map { $self->{$_} = (exists $opts{$_} ? $opts{$_} : $defaults{$_}) }
        keys %defaults;

    $self->{'server'} = HTTP::AppServer::Base->new($self->{'ServerPort'}, Socket::AF_INET6);

    return $self;
}

不幸的是,这回答了这个问题,但不是我的问题,因为它不能与perl 5.8.8一起使用,也可以将Socket.pm升级到最新版本。