LWP :: UserAgent изменить реализацию SSL - PullRequest
0 голосов
/ 28 июня 2018

Я хочу использовать LWP :: UserAgent для отправки некоторых запросов по HTTPS. Это предложение есть в разделе ssl_opts документации

Другие параметры могут быть установлены и обрабатываются непосредственно сокетом SSL. реализация в использовании. Подробности смотрите в IO :: Socket :: SSL или Net :: SSL.

Я установил оба модуля на свою машину, и у меня возникли некоторые проблемы из-за этого.

Как я могу узнать, какой из них используется и как его изменить, чтобы использовать другой модуль?

1 Ответ

0 голосов
/ 28 июня 2018

Как я могу узнать, какой из них используется

Если вы посмотрите документацию 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;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...