plack::request with encoding
DESCRIPTION
2013-11-20, shibuya.pl (plackcon)TRANSCRIPT
Plack::Request with
EncodingHachioji.pm @moznion
大学院生 !
アルバイター !
Hachioji.pm 所属
@moznion
Plack::Requestと 文字列の エンコーディングの話
Plack::Request
皆さん使ってますか
Plack::Request おさらい
教典こと miyagawaさんの Plack Handbook から引用
Plack::Requestは, PSGI環境変数や レスポンス配列に対して, 簡単な オブジェクト指向APIを提供します.
Plack Handbook 14章より引用
新しいミドルウェアを記述する際のライブラリとしても利用できますし, PlackをベースにしたWebフレームワークを記述する際のリクエスト/レスポンスのベースクラスとしても使えます.
Plack Handbook 14章より引用
WAF作る時とか Webアプリケーション 作る時とかに使う
(大体はparentとして)
例 (あくまで例)
さてコレ
param()やparameters()など を使うと, GETやPOSTの パラメータを取れる
param()やparameters()など を使うと, GETやPOSTの パラメータを取れる
ただしバイト列で
つまり?
予期しない エンコーディングの 文字列が来ると 文字化けを起こす
予期しない エンコーディングの 文字列が来ると 文字化けを起こす
予期しない エンコーディングの 文字列が来ると 文字化けを起こす
予期しない エンコーディングの 文字列が来ると 文字化けを起こす
適切に decodeを施して Perl-Stringにしてやる
必要が有る
WAF作る時とか Webアプリケーション 作る時とかに使う
(大体はparentとして)
(Plack::Requestは)
WAF作る時とか Webアプリケーション 作る時とかに使う
(大体はparentとして)
(Plack::Requestは)
decode処理を みんないちいち 書いてる
職人が! 心をこめて! 書いている
めっちゃ再発明されてる (大体コピペ[要出典]で)
もう嫌
もう嫌もう嫌
という訳で そこら辺にケリを 付けるべく作ったのが
Plack::Request::WithEncodinghttps://metacpan.org/pod/Plack::Request::WithEncodinghttps://github.com/moznion/Plack-Request-WithEncoding
これを使うと, param()やparameters()が
decode済み文字列を 返してくれるので便利!
例
例 エンコーディングを指定
例
decodedな文字列が得られる
職人の仕事を 肩代わり!
フレームワークを使わなくても Plack::Request::WithEncodingと Plack::Requestの組み合わせで カジュアルにアプリが書ける!
と偉そうに言ったものの 中身はほぼAmon2からのパク^H^Hインスパイア
パッチやご意見 お待ちしています
で,
Plack::Middlewareで, リクエストの エンコーディングの判別をして $env->{‘plack.request.withencoding.encoding'}に 格納しておくみたいなことをすることにより よしなに文字列をdecodeしたりすることが 出来るようになります.
Plack Handbook Plack::Request::WithEncodingがなぜ便利なのか http://www.songmu.jp/riji/entry/2013-10-01-plack-request-with-encoding.html
アーハン?
という訳で実装
Plack::Middleware:: AutoDetectEncoding
https://github.com/moznion/Plack-Middleware-AutoDetectEncoding
Rails3で言うところの snowmanに近い実装
☃
☃ Him!
☃のような 特定の文字コードでしか 使われない文字を使って 文字コードを特定
ただ今回のケースでは ☃が使えないので
(↑Unicodeの為) 別の文字で代替
formタグ内に <input type="hidden"
name=“__plack_middleware_auto_detect_encoding” value="駱駝" />
のようなinput要素を追加 フォームデータと共に
判別用文字を送ってもらう
リクエストとして来た URLエンコード済み 判別用文字を
各エンコーディングと比較
エンコーディングを 特定したら
$env->{‘plack.request.withencoding.encoding’}
にそれを格納する
こんな感じ
ただ, これで良いのか感
なんか微妙なので GitHub止まりです
斬新なdescription!
なにか良いアイデア ございましたら 教えてください
あと思いつきで vim-plackというvim plug-in
を書きましたが あまり便利になりませんでした
おわり