• 締切済み

HTTPヘッダの取得方法

PerlにてHTTPヘッダの情報を取得したいと考えています。 通常ならば、 $ENV{'<ヘッダ名称>'} で取得できるはずなのですが、 今回取得しようとしているヘッダはHTTPの標準ヘッダではありません。 proxyサーバにてログインを行い認証されますと、 そのproxyサーバが独自にHTTPヘッダに値を追加する仕様になっています。 テストではJavaですとproxyが設定したヘッダ情報を取得できるのですが、 ことPerlになると取得することができません。 ※Javaと今回動かすPerlは同一サーバで動かします。 HTTP標準以外のヘッダ情報はどのように取得すれば良いのでしょうか? なお、PerlのVerは5.6.1、OSはLinuxです。

みんなの回答

  • g_p_
  • ベストアンサー率53% (28/52)
回答No.2

こんにちは、 プロキシを通ってアクセスしてきたクライアントが送ってくるリクエストヘッダの事だったんですね。 クライアントとして、プロキシを通って受け取ったレスポンスヘッダの事だと思い込んでしまいました。 すみません。 HTTPって事は、apache 等のサーバーがクライアントのリクエストヘッダを処理しちゃうでしょうから、環境変数で渡してくれなかったら難しそうですね。 サーバーの設定とかで制御できるんでしょうかね、 その辺は全く分かりませんので 詳しい方の回答をお待ちになった方が良いかもですね。 サーバーを書いて別なポートで待ってればいいのかな… とか一瞬思いかけて、自分には到底無理だと即効却下しました。 とにかく#1は無視してください、すみませんでした。

susumufire
質問者

お礼

更なる回答、ありがとうございます。 #1の回答から「LWP::UserAgent」も含めて調査した結果、 サーバの設定ということが判明いたしました。 回答をくださいまして、誠にありがとうございました。

  • g_p_
  • ベストアンサー率53% (28/52)
回答No.1

こんにちは、 >テストではJavaですとproxyが設定したヘッダ情報を取得できるのですが、 >ことPerlになると取得することができません。 >※Javaと今回動かすPerlは同一サーバで動かします。 もうJavaで実装されたかもしれませんが… 何かをサーバーへ要求した際のレスポンスヘッダが欲しいって事なんでしょうか? >通常ならば、 >$ENV{'<ヘッダ名称>'} >で取得できるはずなのですが、 そうなんですか? 専門家じゃないので分かりませんが。 ソケット作って要求したら、レスポンスを全て受け取る事が出来ると思いますけど。 http で HTMLを受け取る場合を、ざっと書くと #! /usr/bin/perl use strict; use warnings; use IO::Socket; my $host = 'search.cpan.org'; my $url = 'http://search.cpan.org/'; my $port = 80; my $socket = IO::Socket::INET->new("$host:$port") or die "socket error!"; print {$socket} << "END_OF_REQUEST"; GET $url HTTP/1.1 Host: $host Connection: close END_OF_REQUEST $socket->flush(); while (<$socket>) { print; } $socket->close; __END__ の様な感じでしょうか。 もしくは、LWP::UserAgent が使えれば、 #! /usr/bin/perl use strict; use warnings; use LWP::UserAgent; my $ua = LWP::UserAgent->new; #$ua->proxy('http', 'http://proxy:8080'); my $request = HTTP::Request->new(GET => 'http://search.cpan.org/'); my $response = $ua->request($request); print $response->as_string; __END__ の様な感じですかね。 いずれも表示してるだけですが、 正規表現とかで取り出すか、パーサを書くか、探すかして 欲しいヘッダ情報を切り出す感じになりますかね。  (LWP::UserAgent の POD をざっと見た感じでは、ヘッダ情報をうまい事やってくれるメソッドがあるのか無いのか分かりませんでした。) はずしてたらすみません。

susumufire
質問者

お礼

ご回答ありがとうございます。 説明不足で申し訳ございません。 >テストではJavaですと・・・ と書いた部分は、「JavaServletでは」ということです。 即ち、自分自身にアクセスしてきた時の情報を取得したいわけです。 g_p_様が回答していただきましたものになりますと、 他サーバへのアクセスになってしまいますが、 「LWP::UserAgent」というものを知りませんでしたので、 手がかりにしたいと思います。 ありがとうございました。

関連するQ&A