我在我的智慧结束,所以提前道歉,这肯定是一个冗长的帖子。
我一起攻击Perl脚本来解析磁铁URL,提取其信息哈希,并从一个torrent缓存网站列表中请求一个torrent文件。 torrent网站返回一个gzip压缩的洪流,我已经将逻辑编码到脚本中以解压缩它们。我的问题是根据调用脚本的位置不一致地返回数据。
当我在命令行上手动复制并粘贴磁铁URL作为参数时,脚本运行正常,我将一个有效的torrent保存到我的文件系统中。当我通过点击Firefox中的磁铁链接并将我的脚本作为处理程序运行来运行脚本时,一切看起来都是一样的(预期的),并且我得到一个看起来与有效的相同的torrent文件,但不会在我的torrent程序中打开,并显示与有效的torrent相比时的差异。
当我无法使用LWP时,我尝试使用系统卷曲并获得相同的结果。
LWP:
my $data = $ua->get($site, 'Accept-Encoding' => HTTP::Message::decodable)->decoded_content;
open my $tfh, ">$torrent";
print $tfh $data;
卷曲:
my $data = `$curl $site`;
my $z = new IO::Uncompress::Gunzip \$data;
open my $tfh, ">$torrent"
while ( my $line = <$z> ) {
print $tfh $line;
}
我可以辨别出它在CLI上的应用方式与通过Firefox的方式之间没有区别。似乎所有Firefox都通过stdin将URL传递给脚本,我通过转储@ARGV来确认。 URL是唯一的东西。我尝试清空环境,以防FF的东西弄乱了,但结果是一样的。
%ENV = ();
我逐行检查了torrent文件(乱码垃圾和所有),两个文件看起来相同。我知道文件不同,因为我使用cmp对它们进行了比较,并报告了差异。
roy@gondolin:foo$ cmp *
invalid.torrent valid.torrent differ: char 1336, line 1
当我跳到角色1336(lol)时,两个文件中似乎都是相同的。这是在vim。如果我在十六进制编辑器中打开它,恐怕我不知道如何处理它。希望有人能够了解为什么会发生这种情况。
我还应该注意到,没有减压,种子报告为
gzip compressed data, from Unix, max compression
通过减压,它们变为
BitTorrent file
由'file'命令报告。