Доступ к разрешаемому URL-адресу IPv6 через порт (например, localhost: 12345) приводит к неправильному адресу в Strawberry Perl 5.30.1 - PullRequest
4 голосов
/ 27 апреля 2020

При использовании клубники perl 5.30.1 в Windows 10 с включенным IPv6, URL-адреса с номерами портов не могут быть разрешены должным образом из-за ошибки в синтаксическом анализаторе DNS Perl.

* 1002. * Для следующего теста у нас есть простой веб-сервер, прослушивающий порт 8810 для всех интерфейсов.

Порт 12345 делает НЕ хост что-либо.

Ниже приведен скрипт, который мы используем для воспроизведения:

use strict;
use warnings;
use LWP::UserAgent;

my $ua = LWP::UserAgent->new();
my $result=$ua->get("http://localhost:8810/");
print "(DNS Expect: Success) The server responded with Status Code ".$result->status_line.".\n";
$result=$ua->get("http://localhost:12345/");
print "(DNS Expect: Failure) The server responded with Status Code ".$result->status_line.".\n";
$result=$ua->get("http://127.0.0.1:8810/");
print "(IPv4 Expect: Success) The server responded with Status Code ".$result->status_line.".\n";

При выполнении с 5.28.0 я получаю правильный ответ

C:\perl-test>strawberry-perl-5-28-0-original\perl\bin\perl.exe test2.pl
(DNS Expect: Success) The server responded with Status Code 200 OK.
(DNS Expect: Failure) The server responded with Status Code 500 Can't connect to localhost:12345 (No connection could be made because the target machine actively refused it.).
(IPv4 Expect: Success) The server responded with Status Code 200 OK.

Однако при попытке с 5.30.1 я получаю плохой адрес, независимо от действительно ли открыт порт или нет

C:\perl-test>strawberry-perl-5-30-1-original\perl\bin\perl.exe test2.pl
(DNS Expect: Success) The server responded with Status Code 500 Can't connect to localhost:8810 (Bad address).
(DNS Expect: Failure) The server responded with Status Code 500 Can't connect to localhost:12345 (Bad address).
(IPv4 Expect: Success) The server responded with Status Code 200 OK.

Обратите внимание, что 5.30.1 все еще может фактически запрашивать информацию, если мы предоставляем адрес IPv4 напрямую. Кроме того, для DNS, который не разрешает IPv6, а только IPv4, 5.30.1, похоже, не имеет проблемы.

Есть ли у кого-то еще эта проблема, и если это так, это считается ошибкой или мы просто используем perl каким-то неправильным образом?

ОБНОВЛЕНИЕ: Я нашел еще одну часть головоломки, которая, кажется, способствует:

Мы пробовали пока только на нашем корпоративном windows машины, все машины имели одинаковое поведение с Perl 5.30.1 и 5.30.2. Тем не менее, теперь я также попробовал свой личный Windows 10, и это сработало.

Затем я немного покопался об IPv4 и IPv6 и пришел к этой статье базы знаний от Microsoft: https://support.microsoft.com/en-us/help/929852/guidance-for-configuring-ipv6-in-windows-for-advanced-users

Итог: я установил в реестре, что Windows должен предпочесть IPv4 над IPv6 (настройка 0x20), перезагрузиться - и это сработало на моем корпоративном windows 10!

Так что, очевидно, у нас есть некоторые настройки, которые привинчивают к perl, но все же, похоже, есть одна загвоздка: при попытке получить доступ к порту локального хоста, который недоступен, мы все равно получаем ошибку «Неверный адрес» вместо «Отказано в соединении», то есть что-то не так с нашей строкой dns: port.

Кроме того, я ожидаю, что perl полностью поддержит IPv6.

1 Ответ

0 голосов
/ 28 апреля 2020

Я попробовал это на виртуальной машине KVM (на Ubuntu 20.04), на которой запущено Windows 10, Strawberry Perl 5.30.1, XAMPP 7.4.5 с прослушиванием виртуального хоста на 8080, и IPv4, и IPv6 включены в соответствии с Настройки Network и Inte rnet на панели управления.

Здесь все работает нормально, вывод из вашего скрипта test2.pl:

(DNS Expect: Success) The server responded with Status Code 200 OK.
(DNS Expect: Failure) The server responded with Status Code 500 Can't connect to localhost:12345 (No connection could be made because the target machine actively refused it.).
(IPv4 Expect: Success) The server responded with Status Code 200 OK.
...