2012-03-08 80 views
2

正如标题所说WWW ::机械化不承认WWW ::机械化忽略了gzip压缩的内容基本href

<base href="" /> 

如果页面内容IZ gzip压缩。这里有一个例子:

use strict; 
use warnings; 
use WWW::Mechanize; 

my $url = 'http://objectmix.com/perl/356181-help-lwp-log-after-redirect.html'; 

my $mech = WWW::Mechanize->new; 
$mech->get($url); 
print $mech->base()."\n"; 

# force plain text instead of gzipped content 
$mech->get($url, 'Accept-Encoding' => 'identity'); 
print $mech->base()."\n"; 

输出:

http://objectmix.com/perl/356181-help-lwp-log-after-redirect.html 
http://objectmix.com/ <--- this is correct ! 

我在这里失去了一些东西?由于

编辑:我刚刚与LWP :: UserAgent的测试,它直接和它的作品没有任何问题:

use LWP::UserAgent; 

my $ua = LWP::UserAgent->new(); 
my $res = $ua->get('http://objectmix.com/perl/356181-help-lwp-log-after-redirect.html'); 
print $res->base()."\n"; 

输出:

http://objectmix.com/ 

这看起来像WWW ::机械化的错误?

编辑2: 它是LWP或HTTP ::响应错误,而不是WWW :: Mechanize。 LWP默认不会请求gzip。如果我在上面的例子中设定

$ua->default_header('Accept-Encoding' => 'gzip'), 

它返回错基

编辑3:在parse_head 错误是在LWP/UserAgent.pm()

它调用的HTML/HeadParser与gzip HTML和HeadParser不知道该如何处理它。 LWP应该在调用解析子例程之前对内容进行压缩。

回答

1

有关于这个bug报告:https://rt.cpan.org/Public/Bug/Display.html?id=54361

结论:LWP缺少这个 “功能”。

WWW ::机械化:

这最终可能会通过重载_make_request()在WWW来解决::机械化与自己的PKG并重新塞汀HTTP ::通过decoded_content或响应更脏通过重写$ mech - > {base}与内容的解析基础。

0

我认为这不是一个错误,它是一个功能。 WWW ::机械化尝试变得聪明,因为如果某些浏览器看到'base href ='“'某些行为以另一种方式行事,那么它会采取单向行动。

什么时候基地设置合格?

我认为这是使用“”或/作为基地的问题。

<base href="" /> 
<base href="/" /> 
+0

它不能是一个功能,如果它没有返回相同的结果上gzipped和非gzipped内容。如果base不是http://objectmix.com/,那么没有任何相关链接可以工作。 – toktok 2012-03-09 09:41:41