我有一个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>代理(“”),但还有其他不完善之处,标题仍然不相同。
做我想做的最好的方法是什么?必须有一个更简单的解决方案...
答案 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 );
希望能帮助