我想使用LWP :: UserAgent通过HTTPS发送一些请求。 documentation的ssl_opts部分中有这句话。


  可以设置其他选项并由SSL套接字直接处理
  使用中的实现。有关详细信息,请参见IO :: Socket :: SSL或Net :: SSL。


我已经在机器上安装了两个模块,因此我觉得有些问题。

如何确定正在使用哪个模块,以及如何更改它以使用另一个模块?

最佳答案

我如何找出正在使用的那个


如果查看LWP::UserAgent文档,它说您需要安装LWP::Protocol::https模块以支持https:// URI。

如果依次查看此模块,则会发现它确实使用了Net::HTTP发行版,在其中找到了HTTPS.pm模块(可在https://metacpan.org/source/OALDERS/Net-HTTP-6.18/lib/Net/HTTPS.pm上在线查看),在开始时您可以清楚地看到它,除非覆盖,它首先开始尝试使用IO::Socket::SSL,然后仅搜索Net::SSL

看到:

elsif ($IO::Socket::SSL::VERSION) {
    $SSL_SOCKET_CLASS = "IO::Socket::SSL"; # it was already loaded
}
elsif ($Net::SSL::VERSION) {
    $SSL_SOCKET_CLASS = "Net::SSL";
}


如果尚未加载它们,它将尝试以相同顺序加载它们:

eval { require IO::Socket::SSL; };
if ($@) {
    my $old_errsv = $@;
    eval {
        require Net::SSL;  # from Crypt-SSLeay
    };
    if ($@) {
        $old_errsv =~ s/\s\(\@INC contains:.*\)/)/g;
        die $old_errsv . $@;
    }
    $SSL_SOCKET_CLASS = "Net::SSL";
}
else {
    $SSL_SOCKET_CLASS = "IO::Socket::SSL";
}


简而言之,IO::Socket::SSL具有完整的优先级。

在程序内部,使用LWP::UserAgent后,可以使用$Net::HTTPS::SSL_SOCKET_CLASS变量来知道哪个类用于HTTPS操作。


  如何更改为使用其他模块?


如果您阅读代码的开头,则会看到:

elsif ($SSL_SOCKET_CLASS = $ENV{PERL_NET_HTTPS_SSL_SOCKET_CLASS}) {
    unless ($SSL_SOCKET_CLASS =~ /^(IO::Socket::SSL|Net::SSL)\z/) {
        die "Bad socket class [$SSL_SOCKET_CLASS]";
    }
    eval "require $SSL_SOCKET_CLASS";
    die $@ if $@;
}


这意味着如果环境定义了变量PERL_NET_HTTPS_SSL_SOCKET_CLASS,则在上述所有内容之前,如果其名称为IO::Socket::SSLNet::SSL,则将其值用作执行操作的类。

因此,可以在启动使用LWP::UserAgent的程序之前在环境中进行设置,或者在程序中执行类似的操作:

BEGIN {
    $ENV{PERL_NET_HTTPS_SSL_SOCKET_CLASS} = 'Net::SSL';
}


这需要在您执行use LWP::UserAgent;之前发生

09-11 18:01
查看更多