3

私は、ユーザーの要求ヘッダーを受け取り、それらを LWP::UserAgent get 要求に変換したい perl CGI アプリケーションを持っています。基本的には、着信ユーザー ヘッダーを複製し、それらを使用して別のリクエストを作成することが目標です。

ヘッダーを自分で作成しようとしましたが、CGI ヘッダーを表示してから UserAgent ヘッダーのクローンを表示しようとすると、まったく同じではありません。これが私が得たものです:

私の $cgi = 新しい 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 ダンパー $ua->default_headers;

基本的に、%headers と $ua->default_headers は同一ではありません。$ua->default_headers には、自身を perl スクリプトとして識別するエージェントがあります。$ua->agent("") を手動で設定できますが、他にも不完全な点があり、ヘッダーはまだ同一ではありません。

私がやりたいことをするための最良の方法は何ですか?もっと簡単な解決策があるはずです...

4

1 に答える 1

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

役立つことを願っています

于 2011-06-16T15:38:34.130 に答える