Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将香草Perl CGI中的请求头克隆到LWP UserAgent_Perl_Cgi_Header_Lwp Useragent_Request Headers - Fatal编程技术网

将香草Perl CGI中的请求头克隆到LWP UserAgent

将香草Perl CGI中的请求头克隆到LWP UserAgent,perl,cgi,header,lwp-useragent,request-headers,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->ne

我有一个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; my$cgi=新cgi; 我的%headers=map{$\=>$cgi->http($\}}$cgi->http; my$req_headers=HTTP::headers->new(%headers); my$ua=LWP::UserAgent->new(默认\u头=>$req\u头); 打印转储程序$ua->默认\U标题; 基本上,%headers和$ua->default\u头是不相同的$ua->default_头有一个代理,它将自己标识为perl脚本。我可以手动设置$ua->agent(“”),但还有其他缺陷,标题仍然不相同


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

与http::headers使用的方法相比,问题似乎与传入http头的命名有关

传入的参数中都有
HTTP\uu
前缀,其中HTTP::Headers不使用该命名约定(这很有意义)。另外,HTTP::Headers在将“-”转换为“u”以供自己使用时做了正确的事情(快速阅读代码)

我建议将您的
映射更改为删除前缀的以下内容:

# 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 );

希望这有帮助

我不明白你的问题。HTTP头对于CGI脚本不可用。HTTP头被解析为环境变量,并在过滤后发送到CGI脚本。此外,CGI似乎没有一个文档化的方法
http
,第二行似乎缺少一个
映射。。。搜索“->http”。这给了我一个请求头列表,不是吗?还有,你有没有看到Kinopiko关于在第2行使用关键字
map
的评论?@Kinopiko,mobrule-抱歉,我没有直接复制/粘贴我的代码。修正。有趣的是,我注意到这已经超过一年了,希望它能帮助其他人:)