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

Closed
ichigotake opened this Issue Jun 15, 2013 · 9 comments

Projects

None yet

3 participants

@ichigotake

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

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

@tokuhirom
Owner

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

@ichigotake

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

@ichigotake

追加で試した事

検証ブランチ: ichigotake@master...encode_test

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


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

Setupに含めた デバッグプリント( warn $c->req->uri_with({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/ は何かしらの操作を加えても影響なし

まとめ

  • cpanmcarton install のみでデプロイしたものをplackupするとuri_with()で化けるが、何かしらの操作を行った後に plackup すると二度とバグが再現しなくなる

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

@tokuhirom
Owner

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

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

@ichigotake

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

@gfx
Contributor
gfx commented Jul 6, 2013

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

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

@tokuhirom tokuhirom closed this in 90630b9 Aug 22, 2013
@tokuhirom
Owner

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

@ichigotake

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

@karupanerura karupanerura pushed a commit to karupanerura/Amon that referenced this issue Dec 3, 2013
@tokuhirom Checking in changes prior to tagging of version 4.01.
Changelog diff is:

diff --git a/Changes b/Changes
index 3bb24f6..fd757c0 100644
--- a/Changes
+++ b/Changes
@@ -1,5 +1,12 @@
 {{$NEXT}}

+4.01 2013-08-22T03:23:21Z
+
+    - Fixed utf8 flag issue in uri_with().
+      Before this version, if the key was flagged, it makes MOJIBAKE.
+      tokuhirom#63
+      (Reported by ichigotake++)
+
 4.00 2013-08-21T03:44:49Z

     - Bump to 4.00!
27870b3
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment