2010-11-22 3 views
1

私の同僚と私は、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から完全に離れたいと思っています。これは特定の機能に対してのみ必要です。

+1

リダイレクトが必要な場合は基本的にこれに触れません。ハンドラが例外をスローすると、メインコントローラはそれをキャッチして対応するヘッダ*を生成します。通常のプログラムフローに例外を使用すると、私はうんざりします。 –

答えて

0

あなたの質問に答えるために、ヘッダーメソッドは情報を保存しません。永続的なものはありません。ヘッダ "オブジェクトの永続化のあなたの例では

reading TFMができます:

-charsetパラメータはブラウザに送信された文字セットを制御するために使用することができます。指定されていない場合、デフォルトはISO-8859-1になります。 副作用として、これはcharset()メソッドも同様にに設定します。

いくつかのパラメータでヘッダーを呼び出した後、それをデフォルトとして呼び出すと、「保持する」唯一のものが文字セットです。

あなたのクッキーの問題については、$ response-> cookie()を保存しなければならないと思います。どこかに。TFMは、cookie()サブがどこにでもデータを格納しているとは言わず、単にクッキーを作成すると言います。

私はSinanに同意しますが、特にCGI.pmのリダイレクトサブをカバーするためには奇妙な話です。私はそのことを再考するだろう。または、他の方法で完全に移動し、例外処理を使用してWebアプリケーション全体を記述してください - 途中でいくつかの良い笑いがあります:o)

+0

答えをありがとう!しかし、奇妙ですが、あなたは自分自身に矛盾します。最初は何も永続的ではないと言いますが、文字セット情報だけが残っていると言います。これは実際には問題だったのですが、なぜ他の情報は保持しないのですか?私はこのような予期しない振る舞いが、このモジュールを頼りにする本当の痛みにさせるので、誰かがこれについていくつか光を当てることを望んでいました。他の言葉は苦しい側面は言うまでもありません。 –

+0

ご迷惑をおかけして申し訳ありません。ヘッダーの中に永続的なものは何もないことを意味しました。 – smcphill

関連する問題