Mojo::URLでschemeが変更できなくて困っていた話

2011年10月 4日
| コメント(0) | トラックバック(0) Mojo::URLでschemeが変更できなくて困っていた話

Mojoliciousで、必ずhttpsの状態でアクセスされるように、こんな感じのコードを書いていたのですが、思ったように動かなくて困りました。
schemeの部分がhttpsにならなくて、無限ループになっていました。

# NG
if ( $self->req->is_secure ) {
  $self->redirect_to('/login');
}
else {
  my $url = $self->url_for('/login')->scheme('https');
  $self->redirect_to($url->to_abs);
}

schemeは属性(attribute)という風になっていたし、オブジェクトの中身を見ても、schemeは値を持っているように見えたので、何故変更できないんだろう、と思っていました。

色々試しているうちに、to_absが文字列を返すのではないことに気づきました。
なんとなく、文字列を返すメソッドだと思っていたのですが、実際にはオブジェクトを返しています。
文字列を返しているように見えたのは、実際にはto_stringが呼ばれていたからです。
敗因は、to_absが何を返すのかを理解できていなかった事です。

実は、to_absを呼んだ時点で、現在のbaseになるURLがcloneされるので、先に設定した(つもりの)schemeが無視されてしまうようです。
つまり、schemeを設定しようと思えば、まずto_absで絶対URLオブジェクト(?)にしておいてからやれば良い、ということですね。

# OK
if ( $self->req->is_secure ) {
  $self->redirect_to('/login');
}
else {
  my $url = $self->url_for('/login')->to_abs->scheme('https');
  $self->redirect_to($url);
}

思い込みって怖いですね。

トラックバック(0)

このブログ記事に対するトラックバックURL:

コメントする

Google検索

Last.fm

このブログ記事について

このページは、のぶりんが2011年10月 4日 12:00に書いたブログ記事です。

ひとつ前のブログ記事は「うわさのPJAXをMojolicious::Liteで書いてみた」です。

次のブログ記事は「「Perl Advent Calendar Japan 2011」に記事を書きました」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Creative Commons License
このブログのライセンスは クリエイティブ・コモンズライセンス.
Powered by Movable Type