尽pipe新安装LWP连接问题

更新

在理论上,我编辑了LWP/Protocol/http.pm ,在子例程request包含一个sleep语句:

 if (!$has_content || $write_wait || $has_content > 8*1024) { WRITE: { # Since this just writes out the header block it should almost # always succeed to send the whole buffer in a single write call. my $n = $socket->syswrite($req_buf, length($req_buf)); sleep 2; ## <----- NEW unless (defined $n) { ... 

get声明工作,返回200 OK 。 非常感谢Alan Curry帮助debugging和在代码中find这个特定的地方。

不确定它完全回答这个问题,或者解决scheme是长期的。 将不得不做更多的检查。

概要:

  • 使用get子例程的LWP :: UserAgent模块对于某些URL失败,报告500超时。
  • 只有一些url失败。 如www.google.com失败,但www.google.se成功。
  • 我没有其他连接问题,所有的URL都可以通过浏览器和通过cmd程序(如ping)访问。
  • 由于这个问题,我不能用CPAN或ActivePerl的ppm为perl安装模块。
  • 安装另一个perl发行版后,问题仍然存在。
  • 奇怪的是,使用debugging器并遍历代码使失败的URL成功。
  • 我正在使用防火墙,并允许perl进行连接。 (不相关,因为一些URL成功)
  • 防火墙日志显示perl被允许连接失败的URL和非失败。 (见下)日志还显示了可以侦听的套接字,但时间戳不匹配失败的连接。

目标

  • 我主要是在寻找能够安装模块的解决scheme。
  • 我对如何debugging问题的所有build议感兴趣, 不需要完整的解决scheme。 任何提示或技巧是受欢迎的。

我一直在使用ActivePerl v5.14。 用Perl Package Manager ppm命令和gui安装模块工作得很好,但是在某些时候停止工作,报告500超时。 cpan shell报道了同样的事情。

我已经广泛地search了这个问题,但没有发现任何与我的问题有关的问题,也没有提供任何帮助。

ActivePerl支持声称它可能是一个代理设置,这是可笑的。 我有很多程序连接到互联网,不需要代理设置,据我所知,我不需要这样做。 我试图找出我的代理设置,如果有的话,但我发现的唯一的东西是模糊的引用,如“使用系统设置”,“不需要代理”和“代理是一样的你的IP”。

所以昨天晚上我已经够用了,而且安装了草莓perl,但是也有同样的问题。 之后我卸载了ActivePerl。

无论如何,我已经尝试了LWP模块,发现我可以重现那里的错误。 它似乎仅限于某些网站,而cpan就是其中之一(?)。 我创build了这个脚本进行testing:

 use strict; use warnings; use LWP::UserAgent; use URI; my $ua = LWP::UserAgent->new; my $url = shift; my $u = URI->new($url); $ua->no_proxy('cpan.strawberryperl.com','cpan.com',$u->host); $ua->timeout(30); my $r = $ua->get($url); if ($r->is_success) { print $r->decoded_content; } else { die $r->status_line; } 

然后做了一些testing:

 tx.pl http://cpan.strawberryperl.com/authors/01mailrc.txt.gz 500 read timeout at tx.pl line 23. tx.pl http://stackoverflow.com 500 read timeout at tx.pl line 23. tx.pl http://www.google.se <!doctype html><html itemscope itemtype="http://schema.org/WebPage"><head><meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"><meta ... 

所以,谷歌的作品,www.youtube.com也可以,但www.yahoo.com和search.cpan.com失败。 180秒的默认超时时间使得这是一个令人难以置信的烦人的事情来debugging,这就是为什么我减less了我的脚本。 不用说,如果我尝试使用Firefox或ping来访问这些URL,所有这些URL都是可访问的。


ETA:

奇怪的是,通过debugging器运行脚本,打开跟踪和跳到最后使先前失败的连接成功。

这似乎意味着出现某种打嗝,错过了由于打印成千上万行跟踪代码而导致脚本运行缓慢的“固定”时间。


我可以理解这个问题是由于一些ActivePerl模块被破坏的结果,但是草莓Perl正在使用一组完全不同的文件,所以它必须是我的系统。

为什么一些网站的工作,有些不是莫名其妙。 我可以理解,像stackoverflow.com一些网站将保护自己对潜在的机器人,但为什么Cpan会挫败自己的包pipe理器是没有意义的。

我正在使用防火墙,Perl已被允许build立连接。 我的系统是一个相当老的Windows XP安装(约5年)。 在Ubuntu上运行双启动时,我从来没有遇到这个问题,这是另一个线索,它不是代理服务器。

我很好,真的难住了。 如果有人可以帮我debugging,我将非常感激。

下面的CPAN shell错误消息。 有趣的是,它说它尝试使用ftp作为最后的手段,但是我刚刚发现ftp命令没有被我的防火墙允许,如果它被使用,它应该要求我的许可。

 Fetching with LWP: http://cpan.strawberryperl.com/authors/01mailrc.txt.gz LWP failed with code[500] message[read timeout] Warning: no success downloading 'D:\strawberry\cpan\sources\authors\01mailrc.txt .gz.tmp1252'. Giving up on it. Fetching with LWP: http://www.cpan.org/authors/01mailrc.txt.gz LWP failed with code[500] message[read timeout] Warning: no success downloading 'D:\strawberry\cpan\sources\authors\01mailrc.txt .gz.tmp1252'. Giving up on it. Warning: no success downloading 'D:\strawberry\cpan\sources\authors\01mailrc.txt .gz.tmp1252'. Giving up on it. As a last resort we now switch to the external ftp command 'C:\WINDOWS\system32\ ftp.EXE' to get 'D:\strawberry\cpan\sources\authors\01mailrc.txt.gz.tmp1252'. Doing so often leads to problems that are hard to diagnose. If you're the victim of such problems, please consider unsetting the ftp config variable with o conf ftp "" o conf commit Please check, if the URLs I found in your configuration file (http://cpan.strawberryperl.com/, http://www.cpan.org/) are valid. The urllist can be edited. Eg with 'o conf urllist push ftp://myurl/' Could not fetch authors/01mailrc.txt.gz 

试图获取非失败的URL(www.google.se)和失败(stackoverflow.com)的防火墙日志:

 2012-06-27T18:34:04+01:00,info,appl control,C:\WINDOWS\system32\svchost.exe,allow,listen,17,0.0.0.0,56564 2012-06-27T18:34:04+01:00,info,appl control,C:\WINDOWS\system32\svchost.exe,allow,send,17,195.54.122.198,53 2012-06-27T18:34:13+01:00,info,appl control,D:\strawberry\perl\bin\perl.exe,allow,connect out,6,64.34.119.12,80 2012-06-27T18:34:13+01:00,info,appl control,D:\strawberry\perl\bin\perl.exe,allow,connect out,6,64.34.119.12,80 2012-06-27T18:34:21+01:00,info,appl control,C:\Program\Mozilla Firefox\firefox.exe,allow,connect out,6,74.86.70.106,80 2012-06-27T18:34:28+01:00,info,appl control,C:\Program\Mozilla Firefox\firefox.exe,allow,connect out,6,64.34.119.12,80 2012-06-27T18:34:30+01:00,info,appl control,C:\WINDOWS\system32\svchost.exe,allow,listen,17,0.0.0.0,56664 2012-06-27T18:34:30+01:00,info,appl control,C:\WINDOWS\system32\svchost.exe,allow,send,17,195.54.122.198,53 2012-06-27T18:34:30+01:00,info,appl control,D:\strawberry\perl\bin\perl.exe,allow,connect out,6,74.125.143.94,80 2012-06-27T18:34:30+01:00,info,appl control,D:\strawberry\perl\bin\perl.exe,allow,connect out,6,74.125.143.94,80 2012-06-27T18:35:14+01:00,info,appl control,C:\Program\Mozilla Firefox\firefox.exe,allow,connect out,6,64.34.119.12,80 2012-06-27T18:35:21+01:00,info,appl control,C:\Program\Mozilla Firefox\firefox.exe,allow,connect out,6,74.86.70.106,80 2012-06-27T18:36:21+01:00,info,appl control,C:\Program\Mozilla Firefox\firefox.exe,allow,connect out,6,74.86.70.106,80 2012-06-27T18:37:04+01:00,info,appl control,C:\WINDOWS\system32\svchost.exe,allow,listen,17,0.0.0.0,61215 2012-06-27T18:37:04+01:00,info,appl control,C:\WINDOWS\system32\svchost.exe,allow,send,17,195.54.122.198,53 2012-06-27T18:37:07+01:00,info,appl control,D:\strawberry\perl\bin\perl.exe,allow,connect out,6,64.34.119.12,80 2012-06-27T18:37:07+01:00,info,appl control,D:\strawberry\perl\bin\perl.exe,allow,connect out,6,64.34.119.12,80 

这可能不是您的问题的完整解决方案。 但无论如何,

从你的“详细的”问题描述看来,这是你的台式机/笔记本电脑的问题。 即使您的防火墙允许连接到您提到的网站,Windows的内部防火墙可能不允许“FTP”。

通常情况下,端口20(FTP命令端口)和21(FTP数据端口)应该被添加到防火墙例外(在Windows中 – 开始设置控制面板 →点击安全中心防火墙例外(选项卡)添加端口 。您可以尝试将端口20和21添加到例外。

但是,如果您连接到路由器,则可能必须将端口20和端口21端口转发。但是,这些端口默认转发,或者如果您处于公司VPN中,则完全是另一回事。 公司VPN,主要限制端口21,但是允许端口22(这是SFTP的端口21的安全版本)。 在这种情况下,你可能想要使用ftp_proxy

或者(如果你不想添加端口20和21到异常),你可以进入cpan提示符并使用ftp_proxy

 cpan> o conf ftp_proxy http://your.ftpproxy.com 

然后发出install <module>命令。 或者,您可以更新您的../CPAN/config.pm文件,以对ftp_proxy参数进行永久更改。

那么,这些可能是你可能已经尝试过的传统解决方案。 下一步将尝试将FTP_PASSIVE模式设置为1 。 默认情况下,这个libnetcfg配置设置为0 。 要改变这个,找到libnetcfg.bat文件(它应该在C:\Perl\bin某处)。 在编辑器中打开文件并替换

 ftp_int_passive 0 

 ftp_int_passive 1 

这是调用CPAN来设置环境变量时运行的Windows批处理文件。 在类似UNIX / Linux的体系结构下,它被称为libnet.cfg和环境变量FTP_PASSIVE

 $set | grep FTP_PASSIVE FTP_PASSIVE=0 

所以要设置EXPORT FTP_PASSIVE=1

这些可能是调试这个的很多方法中的一部分。 老实说,没有必要绕过库代码,因为他们在其他机器上工作,通常95%的01mailrc.txt.gz.tmp1252下载问题是由于网络/操作系统/防火墙的问题,但如果你想扩大你的LWP的Perl知识可以。 事实上,你也应该看看CPAN::FTP::netrc 。 祝你好运…