Plack::Request with Encoding

Post on 04-Jun-2015

511 views 1 download

description

2013-11-20, shibuya.pl (plackcon)

Transcript of Plack::Request with Encoding

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

を書きましたが あまり便利になりませんでした

おわり