私の同僚と私は、mod_perl
で動作するPerl Webプロジェクトを維持し開発しています。CGI.pmオブジェクト内のいくつかのヘッダー情報は、他のものが保持している間も持続するのはなぜですか?
ここでは、いくつかの種類のMVCパターンを実装した主要なレガシーコードリファクタリングを行っています。
私の仕事は、すべてのHTTP応答ヘッダーが処理され、メインコントローラ内のブラウザに返送されるようにすることです。たとえば、リダイレクトが必要な場合、ページハンドラが例外をスローした後、メインコントローラはそれをキャッチして対応するヘッダを生成します。
私がクッキーの処理を実装するまでは、よく見えました。
# $response is an instance of the CGI class
print $response->redirect(
-uri => "/some_uri/",
-cookie => $response->cookie(
-name => 'user_id',
-value => $user->{'id'},
-path => '/', -expires => '+1M'));
そして今、私はその情報を格納するための$response
オブジェクトをしたいので、私は後に一緒にすべてのヘッダを送信することができます:それはそうと同じように、必要としたとき、我々のコードは、単に出力にクッキーヘッダを印刷し、その前に。
sub page_handler {
# ...
$response->cookie(-name => 'user_id',
-value => $user->{'id'},
-path => '/', -expires => '+1M');
return;
}
# And then, inside the controller
sub controller {
# ...
# the same $response instance
print $response->header();
print $output;
# ....
exit();
}
しかし、CGI
クラスオブジェクトは、それがheader
方法で作成し、すべてのヘッダを格納していないようです:私は、それはそのような何かを行くだろうと思いました。
$ use CGI;
$ my $response = CGI->new();
$CGI1 = CGI=HASH(0xa6efba0);
$ $response->header();
Content-Type: text/html; charset=ISO-8859-1
$ $response->header(-type => 'text/plain', -charset => 'UTF-8', -status => '200 OK');
Status: 200 OK
Content-Type: text/plain; charset=UTF-8
$ $response->header();
Content-Type: text/html; charset=UTF-8
私は最後の出力がどこ、前回と同じ、もしくは最初のものと同じのいずれかであることが予想:一部のヘッダは、他の人がいない間、ここで私はre.pl
で得るものである、持続するように見えます私はまだヘッダーを設定していません。私はそれが部分的に変わるとは思わなかった。 なぜ、CGI.pmオブジェクト内のいくつかのヘッダ情報は、他のものが保持している間も持続するのはなぜですか?
私はオブジェクトを間違って使用していますか?私が意図した通りに使用できる方法はありますか?
PS:長い質問のため申し訳ありませんが、私は何をしたいのかを理解したかったのです。
PPS:また、ここでは多くの人がCGIから離れてCatalystを使用することを推奨しています。これは私が恐れているのですが、今はオプションではありません。なぜなら、レガシーコードがあまりにも多いからです。mod_perlから完全に離れたいと思っています。これは特定の機能に対してのみ必要です。
リダイレクトが必要な場合は基本的にこれに触れません。ハンドラが例外をスローすると、メインコントローラはそれをキャッチして対応するヘッダ*を生成します。通常のプログラムフローに例外を使用すると、私はうんざりします。 –