【问题标题】:Mojolicious suddenly stopped working from one minute to the nextMojolicious 从一分钟到下一分钟突然停止工作
【发布时间】:2018-09-17 19:05:03
【问题描述】:

几天前,我在本地机器上安装了 Mojolicious 包,因为我需要在我的生产服务器上的一个 Perl 程序中实现一个 websocket。它安装没有问题,我能够运行一个简单的测试脚本:

use strict;
use warnings;

use Mojo::UserAgent;
use Mojo::IOLoop;

# Open WebSocket
my $ua = Mojo::UserAgent->new;

$ua->insecure(1); # Otherwise the handshake will fail

$ua->websocket('wss://some.server.com' => sub {
  my ($ua, $tx) = @_;

  # Check if WebSocket handshake was successful
  unless( $tx->is_websocket ) {
    print "Handshake failed!\n";
    return;
  }

  # Wait for WebSocket to be closed
  $tx->on(finish => sub {
    my ($tx, $code, $reason) = @_;
    print "WebSocket closed with status $code.\n";
  });

  # Close WebSocket after receiving one message
  $tx->on(message => sub {
    my ($tx, $msg) = @_;
    print "WebSocket message: $msg\n";
    $tx->finish;
  });

  # Send a message to the server
  print "Sending...\n";
  $tx->send("Hi there!");

});

# Start event loop if necessary
Mojo::IOLoop->start unless Mojo::IOLoop->is_running;

print "Done!\n";

我在一个证书有小问题的服务器上测试这个,这就是我添加这一行的原因:

$ua->insecure(1); # Otherwise the handshake will fail

当我终于通过添加这一行让它工作时,我在我的生产服务器上安装了 Mojolicious,复制了上面的 perl 脚本,它在那里也运行得很好。

然后我回到本地机器上的脚本并再次运行它。令我惊讶的是,我现在收到一条错误消息:

无法通过包“Mojo::UserAgent”在 test009.pl 第 14 行第 2231 行找到对象方法“不安全”。

我重新安装了 Mojolicious 几次,但每次运行脚本时都会出现此错误。删除该行只会导致脚本什么都不做。它不会打印“握手失败”消息,也不会打印任何其他消息。甚至没有“完成!”消息。

看起来它只是在调用 websocket() 后立即停止...

我现在很茫然。我完全不知道为什么它不再工作了。我的本地机器上的 Perl 环境没有任何改变...

这是我本地机器上的更多信息

  • Windows 7 专业版 64 位 SP1
  • ActivePerl 5.16.2
  • Mojolicious 6.64

谁能提供一些关于发生了什么的提示?或者最好,如何让它再次工作?

【问题讨论】:

  • 你的 Mojolicious 太旧了。 insecurewas only added in version 7.80.
  • 在这一点上,我想赞扬 Perl 模块拥有实际可用的更改日志。这不是我第一次通过阅读某个模块的每个版本中的更改列表来发现问题。
  • @melpomene 旧版本怎么可能在新版本上明显安装自己(没有我做任何事情)? insecure 今天下午上班。另外,根据我的包管理器的说法,Mojolicious 6.64 是可用的最新版本......这很奇怪......
  • 等等,现在我不再确定 insecure 曾经在我的本地机器上工作过。

标签: perl mojolicious


【解决方案1】:

来自the Mojolicious change log

7.80  2018-05-20

  • 许多用户期望 Mojo::UserAgent 会验证所有 TLS 证书 默认。不幸的是,到目前为止情况并非如此,但会改变 此版本旨在加强安全性。默认 Mojo::UserAgent 现在将拒绝所有无效的 TLS 证书。回到 之前的行为你可以使用新的insecure 属性。

    $ua->insecure(1);
    

insecure 是 7.80 中的新功能。你的 Mojolicious 6.64 太旧了。

你说

我重新安装了 Mojolicious 几次,但每次运行脚本时都会出现此错误。

要么你没有安装最新版本,要么你的脚本不知何故仍然选择了旧版本(目录搜索顺序问题?)。

如果您想让您的代码在新旧版本之间保持兼容(且不安全),

$ua->insecure(1) if $ua->can('insecure');

应该可以。

【讨论】:

  • 最好只发送给use Mojo::UserAgent 7.80,而不是让它静默失败。
  • @Borodin 在这种情况下,它会默默地成功。旧版本默认不安全; $ua->insecure(1) 是新版本中的向后兼容性黑客。
猜你喜欢
  • 2021-08-01
  • 2019-04-09
  • 2020-02-27
  • 2014-08-07
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
  • 2010-12-11
  • 1970-01-01
相关资源
最近更新 更多