2010-06-19 82 views
3

我有一个perl CGI应用程序,我想将用户请求标头转换为LWP :: UserAgent get请求。基本上,目标是复制传入的用户标题并使用它们发出单独的请求。在Vanilla Perl CGI中克隆请求头文件到LWP UserAgent

我试图自己创建标题,但是当我尝试显示CGI标题,然后显示我的克隆UserAgent标题时,它们不完全相同。这是我得到的:

 
my $cgi = new CGI; 
my %headers = map { $_ => $cgi->http($_) } $cgi->http; 
my $req_headers = HTTP::Headers->new(%headers); 
my $ua = LWP::UserAgent->new(default_headers => $req_headers); 
print Dumper $ua->default_headers; 

基本上,%headers和$ ua-> default_headers是不一样的。 $ ua-> default_headers有一个代理,它将自己标识为perl脚本。我可以手动设置$ ua-> agent(“”),但还有其他缺陷,并且标头仍然不完全相同。

什么是做我想做的最好的方式?有一个更简单的解决方案...

+0

我不明白你的问题。 HTTP标头对CGI脚本不可用。过滤后,HTTP标头被解析为环境变量并发送到CGI脚本。此外,CGI似乎没有一个记录的方法'http',第二行看起来像缺少一个'map'。 – 2010-06-19 07:57:35

+0

也许我没有正确解答我的问题...... http://cpansearch.perl.org/src/LDS/CGI.pm-3.49/cgi_docs.html搜索“ - > http”。这给了我一个请求头的列表,不是吗?另见http://www.perlmonks.org/?node_id=838453 – Zach 2010-06-19 14:12:14

+0

您是否看到Kinopiko在第2行中使用关键字“map”的评论? – mob 2010-06-19 16:14:20

回答

3

它看起来像问题与HTTP :: Headers使用的传入http头的命名相关。

传入的参数都在其中有HTTP_前缀,其中HTTP :: Headers不使用该命名约定(这是有道理的)。另外,它看起来像(在代码中快速阅读),HTTP :: Headers在将' - '转换为'_'以供自己使用时是正确的。

我会建议更改您的map到下面,消除前缀:

# remove leading HTTP_ from keys, note: this assumes all keys have pattern 
# HTTP_* 
%headers = map { (/^HTTP_(.*?)$/) => $cgi->http($_) } $cgi->http; 

这里是调试脚本我用:

my $cgi = CGI->new; 
my %headers = map { $_ => $cgi->http($_) } $cgi->http; 
my $req_headers = HTTP::Headers->new(%headers); 
my $ua = LWP::UserAgent->new(default_headers => $req_headers); 

print "Content-type: text/plain\n\n"; 
print Dumper($ua->default_headers); 
print Dumper(\%headers); 

# remove HTTP_ from $_ 
%headers = map { (/^HTTP_(.*?)$/) => $cgi->http($_) } $cgi->http; 
$req_headers = HTTP::Headers->new(%headers); 
$ua = LWP::UserAgent->new(default_headers => $req_headers); 

print "headers part deux:\n"; 
print Dumper($ua); 

希望帮助

+0

有趣的只是注意到,这是一岁多,希望它可以帮助别人:) – Lee 2011-06-16 15:45:35

相关问题