perl - 将 Vanilla Perl CGI 中的请求 header 克隆到 LWP UserAgent

标签 perl cgi header lwp-useragent request-headers

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

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

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(""),但还有其他不完善之处,而且 header 仍然不相同。

做我想做的事情的最佳方式是什么?必须有一个更简单的解决方案...

最佳答案

与 HTTP::Headers 使用的名称相比,问题似乎与传入的 http header 的命名有关。

传入参数中都有 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 );

希望对你有帮助

关于perl - 将 Vanilla Perl CGI 中的请求 header 克隆到 LWP UserAgent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3074485/

相关文章:

perl - 将 perl 脚本的所有输出复制到文件中

php - 我应该如何确定 Perl 中时区的下一个夏令时 (DST) 转换?

html - 无法将文本从 html 文件发送到 c 文件

html - CGI - HTML 中的密码不会打印

PHPEXCEL设置UTF-8编码

java - 请求中缺少 token

perl - HTTP 响应 : Net/HTTP/Methods. pm 第 542 行中的错误 block 大小

由于缺少 usr/local/man/man3 写入权限,Perl cpanm 无法安装模块

perl - 为什么对我的链接 URL 使用 CGI::escape 会使我的浏览器将我带到错误的地方?

c++ - 如果 .h 包含在多个 .cpp 中,.h 中的结构不起作用?