我想使用LWP :: UserAgent通过HTTPS发送一些请求。 {{3}}
的ssl_opts部分中有这句话。可以设置其他选项,并由SSL套接字直接处理 使用中的实现。有关详细信息,请参见IO :: Socket :: SSL或Net :: SSL。
我已经在机器上安装了两个模块,因此我认为有些问题。
我如何找出正在使用的模块以及如何将其更改为使用其他模块?
答案 0 :(得分:1)
我如何找出正在使用的那个
如果您查看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;