Как я могу узнать, какой из них используется
Если вы посмотрите документацию 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;