Запрос Perl LWP::UserAgent не возвращается с использованием http1.1, но работает нормально с использованием http1.0!? Зачем?

У меня есть очень простой скрипт (в системе SLES11) для отправки запроса http1.1 на сервер. Это работало нормально долгое время. Так как через пару дней перестал работать. Понятия не имею почему. После некоторого расследования я обнаружил, что заставляю скрипт использовать http1.0, он снова работает. Понятия не имею почему. И я хочу знать, почему он не работает в режиме по умолчанию http1.1.

Я уже включил отладку столько, сколько знаю (см. Код ниже). Но я ничего не вижу - мой скрипт просто зависает. Нет сетевой активности. Я не вижу, что сокет будет openend (netstat -a), и я не вижу никакого входящего трафика от моего клиента на сервере. ("Telnet myserver myport" работает нормально.)

Может кто-нибудь помочь мне, как отследить эту проблему? Как я могу включить больше отладки, чтобы увидеть, где настоящая проблема?

#!/usr/bin/perl -w

use strict;
use warnings;
use Data::Dumper;
use HTTP::Request::Common;
use LWP::Debug qw(+);
use LWP::UserAgent;

# Workaround: forcing http1.0 instead of using http1.1, it works again!
use LWP::Protocol::https10 ();
LWP::Protocol::implementor('https', 'LWP::Protocol::https10');
# EO workaround

my $ua        = LWP::UserAgent->new;
$ua->ssl_opts( verify_hostname => 0 );
my $response  = $ua->request(
    POST 'https://myuser:mypassword@myserver:8888/service/myservice',
    Connection   => 'close',     # Edit: added, see comments below
    Content_Type => 'text/xml',
    Content      => '... my content ...'
);

$ ua-> request () не возвращается! Мне нужно убить /^C сценарий!

Изменить: хорошо, кажется, никто не знает, как продолжить. Поэтому я начал отлаживать его, используя Perl Debugger.

LWP::UserAgent::post(/usr/lib/perl5/site_perl/5.10.0/LWP/UserAgent.pm:418):
418:        return $self->request( HTTP::Request::Common::POST( @parameters ), @suff );

Таким образом, я вижу, что он не возвращается из запроса ().

Во всяком случае, из-за того, что LWP::UserAgent звонки HTTP::Request::Common Я изменил мой пример кода выше, чтобы использовать HTTP::Request::Common пропустить этот шаг во время отладки.

Хорошо... Новый результат:

LWP::Protocol::implementor(/usr/lib/perl5/site_perl/5.10.0/Net/HTTPS.pm:26):
26:         eval { require IO::Socket::SSL; };

Внутри запроса () он висит на IO::Socket::SSL, Значит, этого скрипта ему достаточно для дальнейшей отладки:

#!/usr/bin/perl
require IO::Socket::SSL;

Это утверждение не возвращается.

Дальше вниз, внутри IO::Socket::SSL он висит на:

IO::Socket::SSL::CODE(0x1274370)(/usr/lib/perl5/site_perl/5.10.0/IO/Socket/SSL.pm:92):
92:             Net::SSLeay::SSLeay_add_ssl_algorithms();

Ааааа! Об этой проблеме уже есть сообщение об ошибке: Net-SSLeay зависает на Suse 11 P2, указывая на ошибку #81575, которая говорит:

Я обнаружил эту же проблему на SLES 11 SP2, на которой установлен openssl-0.9.8j. Обновление до openssl-0.9.8r решило проблему.... Пакеты для 0.9.8r можно найти в этом репозитории: http://download.opensuse.org/repositories/security:/fips/

Думаю, это все!

1 ответ

Решение

Об этой проблеме уже есть сообщение об ошибке: Net-SSLeay зависает на Suse 11 P2, указывая на ошибку # 81575, которая говорит:

Я обнаружил эту же проблему на SLES 11 SP2, на которой установлен openssl-0.9.8j. Обновление до openssl-0.9.8r решило проблему.... Пакеты для 0.9.8r можно найти в этом репозитории: http://download.opensuse.org/repositories/security:/fips/

Думаю, это все!

Другие вопросы по тегам