私の同僚と私は、を介して機能するPerlWebプロジェクトを保守および開発していmod_perl
ます。
現在、ある種のMVCパターンを実装した主要なレガシーコードリファクタリングを行っています。
特に、私のタスクは、すべてのHTTP応答ヘッダーが処理され、メインコントローラー内のブラウザーに返送されることを確認することです。たとえば、リダイレクトが必要な場合、ページハンドラーは例外をスローし、メインコントローラーはそれをキャッチして対応するヘッダーを生成します。
私がクッキー処理を実装し始めるまで、それはすべてうまく見えました。その前は、次のように、コードは必要なときに出力するCookieヘッダーを出力していました。
# $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
一部のヘッダーは存続しているように見えますが、他のヘッダーは存続していないようですre.pl
。
$ 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
最後の出力は前の出力と同じか、ヘッダーをまだ設定していない最初の出力と同じであると予想しました。部分的に変わるとは思っていませんでした。
そのため、私は質問をします。CGI.pmオブジェクトの一部のヘッダー情報が保持されるのに、別のヘッダー情報は保持されないのはなぜですか。
オブジェクトを間違って使用していますか?意図したとおりに使用できる方法はありますか?
PS:長い質問で申し訳ありませんが、私がやりたいことをあなたに理解してもらいたいと思いました。
PPS:また、このあたりの多くの人がCGIから離れてCatalystを使用することを推奨していることを私は知っています。これは、残念ながら、現時点ではオプションではありません。レガシーコードが多すぎて、mod_perlから完全に離れることを望んでいるからです。これは、特定の機能にのみ必要です。