我想使用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::SSL
或Net::SSL
,则将其值用作执行操作的类。因此,可以在启动使用
LWP::UserAgent
的程序之前在环境中进行设置,或者在程序中执行类似的操作:BEGIN {
$ENV{PERL_NET_HTTPS_SSL_SOCKET_CLASS} = 'Net::SSL';
}
这需要在您执行
use LWP::UserAgent;
之前发生