簡體   English   中英

Perl LWP 無法連接到 Windows 11 上的 localhost

[英]Perl LWP cannot connect to localhost on Windows 11

我正在編寫一個小的 Perl 腳本來測試本地開發環境中的 API。 我在 Windows 11 上使用 Strawberry Perl。該應用程序位於 ASP.NET MVC 中。

當我運行它時,我收到以下錯誤:

500 Can't connect to localhost:44311 (Bad file descriptor)

到目前為止我寫的完整代碼是這樣的:

#!/usr/bin/perl
use warnings;
use v5.20;
use LWP;
use LWP::UserAgent;

use IO::Socket::IP;                                             # needed for "AF_INET"
@LWP::Protocol::http::EXTRA_SOCK_OPTS = ( Family => AF_INET );
@LWP::Protocol::https::EXTRA_SOCK_OPTS = ( Family => AF_INET );  # force IPv4 (doesn't seem to work)

use JSON;

# check socket is open
use IO::Socket::INET;
my @hosts = qw/ localhost:44311 /;
foreach my $host ( @hosts ) {
    my $open = defined IO::Socket::INET->new(PeerAddr => $host, Timeout => 5) || 0;
    printf "Probed %s -> %s \n", $host, $open ? 'ok' : 'NOK';
}
## end check, it is!

my $ua = LWP::UserAgent->new;
$ua->agent("MyApp/0.1 ");

my %get_details = (
    email => 'MY_EMAIL',
   password => 'PasswordOfMine'
);

# Create a request
my $req = HTTP::Request->new(POST => 'https://localhost:44311/api/token');
$req->content_type('application/json');
$req->content( encode_json (\%get_details) );

# Pass request to the user agent and get a response back
my $res = $ua->request($req);

if ($res->is_success) {
    print $res->content;
}
else {
    print $res->status_line, "\n";
}

如您所見,我從其他地方 yoink'd 的那個套接字探測器報告說 Perl 可以訪問該套接字。

IPv6

我知道這可能是 IPv6 問題,因為 LWP 默認將 localhost 解析為 IPv6 地址,而我的應用程序僅在 IPv4 上運行。

我不能簡單地將 'localhost' 切換為 127.0.0.1,因為該應用程序只接受具有正確主機名的請求。 如果我在網絡瀏覽器中打開 127.0.0.1 我會得到:

Bad Request - Invalid Hostname

所以不幸的是,這不是一個解決方案。

是否有任何直接的方法可以將 LWP 設置為僅將“localhost”解析為 IPv4? 這將是最受歡迎的,因為我寧願使用我選擇的腳本語言來使用 API。

這修復了它:

$ua->ssl_opts(verify_hostname => 0);

原來這是因為 localhost 使用了自生成的證書,而我所要做的就是關閉 SSL 驗證。

因此它與 IPv6 沒有任何關系,所以我不需要在開始時搞亂套接字。

驚慌失措,還是謝謝!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM