gpt4 book ai didi

Perl IO::Socket::SSL 与 Web 服务器挂起

转载 作者:太空宇宙 更新时间:2023-11-03 13:51:18 28 4
gpt4 key购买 nike

我在使用 IO::Socket::SSL 时遇到问题。

在正常操作下一切正常,但我遇到了一个问题,网络服务器 (IIS) 被锁定并且 Perl 卡住了,即使在网络服务器再次激活后也是如此。

我在 Windows 下将 Perl 脚本作为 exe 运行,但实际上我看不到程序在运行,因为它是隐藏的 - 这是代码:

sub api_action
{

$api_action = $_[0];

use IO::Socket::SSL;
$EOL = "\015\012";
$BLANK = $EOL x 2;
$remote = IO::Socket::SSL->new( Proto => "tcp",
PeerAddr => "api.xxxxx",
PeerPort => "443",
SSL_verify_mode => SSL_VERIFY_NONE,
verify_hostname => 0,
Timeout => 120,
);
unless ($remote) { print "cannot connect to API\n"; return "ERROR"
}
$remote->autoflush(1);
print $remote "GET /API/?action=$api_action" . $BLANK;
return <$remote>;
close $remote;

}

我的想法是它已经建立了初始连接,但仍在等待 GET 命令的返回。我原以为设置超时只会导致它返回错误,但它看起来并不奏效。

关于我哪里出错或遗漏了什么有什么想法吗?

最佳答案

您实际上将其发送到 SSL 连接内的服务器:

GET /path\r\n
\r\n

这不是有效的 HTTP/1.0 或 HTTP/1.1 请求,而是 HTTP/0.9 请求。由于 HTTP/0.9 已经过时 20 年了,我不希望 IIS 仍然支持这个旧协议(protocol),所以当遇到这样的请求时,它可能只会显示出意想不到的行为。一个正确的 HTTP/1.0 请求应该是这样的:

GET /path HTTP/1.0\r\n
Host: www.example.com\r\n
\r\n

有关如何发送正确请求以及如何正确处理响应的更多信息,请参阅 HTTP/1.0HTTP/1.1标准。

除此之外:

        SSL_verify_mode => SSL_VERIFY_NONE,
verify_hostname => 0,

verify_hostname 在 IO::Socket::SSL 中没有意义。您可能在 LWP::UserAgent 中看到了这一点,并且它仅在那里相关。

Everything works fine under normal operation but I had an issue where the web server (IIS) locked up and Perl got stuck, even after the web server became active again.

不幸的是,这不能用作错误描述,因为不清楚您认为什么是“锁定”和“再次激活”,但基本上如果服务器行为不稳定,则客户端可能会受此影响。

当前您正在通过读取直到 TCP 连接结束来处理请求。如果服务器行为不稳定并且不会关闭此连接,那么您将永远等待。

请注意,您设置的超时可能仅与初始连接相关,与进一步读取无关。根据您使用的 IO::Socket::SSL 版本,它甚至可能无法在 Windows 上正常工作。您可能会添加一个 alarm(60) 或类似的以确保客户端不会在损坏的服务器上永远等待,或者您可能会尝试使用非阻塞套接字来处理该问题。

关于Perl IO::Socket::SSL 与 Web 服务器挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43728760/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com