将Vanilla Perl CGI中的请求标头克隆到LWP UserAgent

时间:2010-06-19 05:34:14

标签: perl cgi header lwp-useragent request-headers

我有一个perl CGI应用程序,我想获取用户请求标头,并将其转换为LWP :: UserAgent get请求。基本上,目标是复制传入的用户标头并使用它们发出单独的请求。

我自己尝试创建标题但是当我尝试显示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;

基本上,%标头和$ ua> default_headers不相同。 $ ua-> default_headers有一个代理,可以将自己标识为perl脚本。我可以手动设置$ ua>代理(“”),但还有其他不完善之处,标题仍然不相同。

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

1 个答案:

答案 0 :(得分: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 );

希望能帮助