Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > AnyEvent и TLS


Автор: slavenk 29.7.2013, 11:00
Здравствуйте!
При запуске вот такого кода:
 
Код

#!/usr/bin/perl -w
use strict;
 
use utf8;
use feature 'say';
 
use AnyEvent;
use EV;
use AnyEvent::HTTP;
 
my $cv = AnyEvent->condvar;
 
http_get 'https://metacpan.org/module/AnyEvent::HTTP', sub {
  my ($body, $hdr) = @_;
 
  if ($hdr->{Status} =~ /^2/) {
    say 'Yes';
  } else {
    say "error, $hdr->{Status} $hdr->{Reason}";
  }
  $cv->send;
 
};
 
$cv->recv;

 
выдается следующая ошибка:
 
Yes
        (in cleanup) Can't call method "_put_session" on an undefined value at /usr/local/lib64/perl5/AnyEvent/Handle.pm line 2163 during global destruction.

Подскажите пожайлуста, в чем может быть проблема?

Автор: arto 29.7.2013, 11:10
tls контекст отсутствует, как я понимаю.
посмотреите, как реализовано в AnyEvent::TLS.

Автор: slavenk 29.7.2013, 12:28
Попробовал так реализовать, не получилось

Код

http_get 'https://metacpan.org/module/AnyEvent::HTTP', 
  tls_ctx => { verify => 1, verify_peername => 'https' },
  sub {
    my ($body, $hdr) = @_;

    if ($hdr->{Status} =~ /^2/) {
      #say $body;
      say 'Yes';
    } else {
      say "error, $hdr->{Status} $hdr->{Reason}";
    }
    $cv->send;

  };


Автор: slavenk 29.7.2013, 13:47
Может быть проблема в том, что рекомендуемая версия Net::SSLeay 1.35, а у меня 1.55?

AnyEvent::TLS
Цитата

Although this module does not require a specific version of Net::SSLeay, many features will gradually stop working, or bugs will be introduced with old versions (verification might succeed when it shouldn't - this is a real security issue). Version 1.35 is recommended, 1.33 should work, 1.32 might, and older versions are yours to keep.

Автор: arto 30.7.2013, 07:27
не думаю.

Автор: slavenk 30.7.2013, 10:56
Проблему решил - не нужно использовать ключ -w в первой строке. Лучше писать use warnings;

Автор: arto 30.7.2013, 12:30
мусор под ковёр? неплохо, неплохо smile

Автор: slavenk 31.7.2013, 15:02
не совсем так - здесь особенность работы с глобальными деструкторами в Perl. 

Вот что написал Marc Lehmann по этому поводу:
 
First of all, you are using -w. This switch forces a set of warnings
on every piece of code, even code that doesn't want or need those
warnings. If you run with -w, and you get warnings, you have to deal
with them: the original aithor did not enable them, so when you do, you
effectively take over maintainership.
 
So netter don't run with -w if you don't want to deal with warnings in
other people's code.
 
Second, this is a bug in perl - during global destruction, perl can
randomly corrupt data structures, which sometimes causes messages like
these.

Это поведение документировано: https://metacpan.org/module/RJBS/perl-5.18.0/pod/perlobj.pod#Global-Destruction , поэтому это не баг, а фича

Автор: ginnie 31.7.2013, 15:20
slavenk, больше похоже на особенность некоторых разработчиков сваливать вину на всех, кроме себя. Тут явная ошибка в коде. Можно ее исправить, а можно сделать вид, что ее нет  smile 
P.S. пару лет назад имел "удовольствие" пообщаться с Марком по поводу ошибок в AnyEvent, после этого пользуюсь чистым EV.

Автор: arto 31.7.2013, 15:22
"You should check that a contained object is defined before calling a method on it"

и 

   $self->{tls_ctx}->_put_session (delete $self->{tls})
      if $self->{tls} > 0;

не сочетается. А в связи с индивидуальными особенностями лехмана,
вряд-ли будет пофиксена в ближайшем будущем.

Автор: slavenk 31.7.2013, 15:38
Цитата(ginnie @  31.7.2013,  15:20 Найти цитируемый пост)
P.S. пару лет назад имел "удовольствие" пообщаться с Марком по поводу ошибок в AnyEvent, после этого пользуюсь чистым EV.

Кстати, этот Лехман также автор EV

Автор: ginnie 31.7.2013, 15:50
Цитата(slavenk @  31.7.2013,  15:38 Найти цитируемый пост)
Кстати, этот Лехман также автор EV

А я и не говорил, что модулями Марка не стоит пользоваться. В EV я ошибок пока не нашел, поэтому пользуюсь. Я писал про особенности общения с ним, а также про его желание что-либо исправлять.

Автор: ginnie 31.7.2013, 16:06
Кстати, ошибка не такая уж и безобидная, насколько я понимаю, после нее уже остальные деструкторы в коде не вызываются.
Был неправ:
Цитата

If your DESTROY method throws an error, this error will be ignored. It will not be sent to STDERR and it will not cause the program to die. However, if your destructor is running inside an eval {} block, then the error will change the value of $@.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)