tokuhirom / Amon

yet another web application framework
http://amon.64p.org/
Other
163 stars 44 forks source link

Web::Request->uri_with(): URIエンコードのバグ #63

Closed ichigotake closed 11 years ago

ichigotake commented 11 years ago

uri_with()でURIエンコードがうまくいかないケースがある

原因はよくわかりませんでした

$ amon2-setup.pl MyApp && cd MyApp
$ carton install

### tmpl/index.tt に記述して http://localhost:5000/?q=%E3%81%82 へアクセス(q=あ)
# <a href="[% uri_with() %]">uri_with()</a>: [% uri_with() %]<br>
# <a href="[% uri_with({}) %]">uri_with({})</a>: [% uri_with({}) %]<br>
# <a href="[% uri_with({page => 1}) %]">uri_with({page => 1})</a>: [% uri_with({page => 1}) %]<br>

$ carton exec plackup

# 3つのうち、uri_woth()の出力が違ってるものがある(3つ目のuri_with)

### 開いて何も編集せずに上書き保存
$ vim local/lib/perl5/Amon2/Web/Request.pm

$ carton exec plackup

# なぜか3つの出力が同じになってる!!!

# この後、local/を削除してcarton installし直してもバグは再現しない
# amon2-setup.plからやり直すとバグが再現する
ichigotake commented 11 years ago

お酒が入ってる時の勢いで出したレポートなので不手際があると思います お酒が抜け切った頃にまたレポートします…

tokuhirom commented 11 years ago

そろそろ抜けきったでしょうか?

ichigotake commented 11 years ago

今日の仕事が終わって家に着いたらもう一度詳しく調べてみます

ichigotake commented 11 years ago

追加で試した事

検証ブランチ: https://github.com/ichigotake/Amon/compare/master...encode_test

結論から言うと、原因はわからず事象を確認するだけしか出来ませんでした


タイトルで示したように tmpl/index.tt に検証コードを書き加えたものをSetupスクリプトに含ませ、手元にインストールする

Setupに含めた デバッグプリント( _warn $c->req->uriwith({page => 1}) )を見ると、正しいエンコードになっていた => 原因はテンプレートでの何か?

http://localhost:5000/?page=1&q=%E3%81%82 at /path/to/MyApp/lib/MyApp/Web/Dispatcher.pm line 12.

以下のいずれかを実行してから carton exec plackup するとエンコードが正しくなり、そのアプリケーションでは 二度と バグが再現しなくなる

$ touch .
$ touch app.psgi
$ touch local
$ touch lib
$ cp /other/path/app.psgi app.psgi  # 中身が全く同じもので上書き
### *touch* に限らず、*vim* でファイルを開いて何も編集せずに上書き保存をするだけでも同等の効果が得られる

$ carton exec plackup #再起動してもエンコードが正しくなる

### tmpl/ は何かしらの操作を加えても影響なし

まとめ

ものは試しと、Amon2::Web::Requestに use utf8 を書き加えてみましたが、変わらず。 (flagged utf8についてよくわかっていないのでこれは当てずっぽうな検証ですが…)

tokuhirom commented 11 years ago

ちょっとためすのむずかしくてお返事がおそくなりましてすみません。 こちら調査の結果、Xslate のバグであると断定し、@gfx に報告いたしました。 https://github.com/xslate/p5-Text-Xslate/issues/82

ですので、そのうちなおるかとおもいます。

ichigotake commented 11 years ago

はい、ありがとうございます

gfx commented 11 years ago

Xslate 2.0008で修正しました‥が、この問題が自然消滅する方向での修正ではないかもしれません。

具体的には、テンプレート文字列内の文字列リテラルはすべて Text::Xslate->new(input_layer => '":encoding(utf8)") の影響下ではUTF8フラグが付くようになりました。これがもともと初回起動時や cache => 0 時の挙動でしたので。

tokuhirom commented 11 years ago

だいぶおそくなってしまいましたが、修正しました。

ichigotake commented 11 years ago

すっかり忘れてしまっていました 修正ありがとうございます