plack::request with encoding

60
Plack::Request with Encoding Hachioji.pm @moznion

Upload: moznion

Post on 04-Jun-2015

511 views

Category:

Technology


1 download

DESCRIPTION

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

TRANSCRIPT

Page 1: Plack::Request with Encoding

Plack::Request with

EncodingHachioji.pm @moznion

Page 2: Plack::Request with Encoding

大学院生 !

アルバイター !

Hachioji.pm 所属

@moznion

Page 3: Plack::Request with Encoding

Plack::Requestと 文字列の エンコーディングの話

Page 4: Plack::Request with Encoding

Plack::Request

Page 5: Plack::Request with Encoding

皆さん使ってますか

Page 6: Plack::Request with Encoding

Plack::Request おさらい

Page 7: Plack::Request with Encoding

教典こと miyagawaさんの Plack Handbook から引用

Page 8: Plack::Request with Encoding

Plack::Requestは, PSGI環境変数や レスポンス配列に対して, 簡単な オブジェクト指向APIを提供します.

Plack Handbook 14章より引用

Page 9: Plack::Request with Encoding

新しいミドルウェアを記述する際のライブラリとしても利用できますし, PlackをベースにしたWebフレームワークを記述する際のリクエスト/レスポンスのベースクラスとしても使えます.

Plack Handbook 14章より引用

Page 10: Plack::Request with Encoding

WAF作る時とか Webアプリケーション 作る時とかに使う

(大体はparentとして)

Page 11: Plack::Request with Encoding

例 (あくまで例)

Page 12: Plack::Request with Encoding
Page 13: Plack::Request with Encoding

さてコレ

Page 14: Plack::Request with Encoding

param()やparameters()など を使うと, GETやPOSTの パラメータを取れる

Page 15: Plack::Request with Encoding

param()やparameters()など を使うと, GETやPOSTの パラメータを取れる

ただしバイト列で

Page 16: Plack::Request with Encoding

つまり?

Page 17: Plack::Request with Encoding

予期しない エンコーディングの 文字列が来ると 文字化けを起こす

Page 18: Plack::Request with Encoding

予期しない エンコーディングの 文字列が来ると 文字化けを起こす

Page 19: Plack::Request with Encoding

予期しない エンコーディングの 文字列が来ると 文字化けを起こす

Page 20: Plack::Request with Encoding

予期しない エンコーディングの 文字列が来ると 文字化けを起こす

Page 21: Plack::Request with Encoding

適切に decodeを施して Perl-Stringにしてやる

必要が有る

Page 22: Plack::Request with Encoding

WAF作る時とか Webアプリケーション 作る時とかに使う

(大体はparentとして)

(Plack::Requestは)

Page 23: Plack::Request with Encoding

WAF作る時とか Webアプリケーション 作る時とかに使う

(大体はparentとして)

(Plack::Requestは)

Page 24: Plack::Request with Encoding

decode処理を みんないちいち 書いてる

Page 25: Plack::Request with Encoding

職人が! 心をこめて! 書いている

Page 26: Plack::Request with Encoding

めっちゃ再発明されてる (大体コピペ[要出典]で)

Page 27: Plack::Request with Encoding

もう嫌

Page 28: Plack::Request with Encoding

もう嫌もう嫌

Page 29: Plack::Request with Encoding

という訳で そこら辺にケリを 付けるべく作ったのが

Page 30: Plack::Request with Encoding

Plack::Request::WithEncodinghttps://metacpan.org/pod/Plack::Request::WithEncodinghttps://github.com/moznion/Plack-Request-WithEncoding

Page 31: Plack::Request with Encoding

これを使うと, param()やparameters()が

decode済み文字列を 返してくれるので便利!

Page 32: Plack::Request with Encoding

Page 33: Plack::Request with Encoding

例 エンコーディングを指定

Page 34: Plack::Request with Encoding

decodedな文字列が得られる

Page 35: Plack::Request with Encoding

職人の仕事を 肩代わり!

Page 36: Plack::Request with Encoding

フレームワークを使わなくても Plack::Request::WithEncodingと Plack::Requestの組み合わせで カジュアルにアプリが書ける!

Page 37: Plack::Request with Encoding

と偉そうに言ったものの 中身はほぼAmon2からのパク^H^Hインスパイア

Page 38: Plack::Request with Encoding

パッチやご意見 お待ちしています

Page 39: Plack::Request with Encoding

で,

Page 40: Plack::Request with Encoding

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

Page 41: Plack::Request with Encoding

アーハン?

Page 42: Plack::Request with Encoding

という訳で実装

Page 43: Plack::Request with Encoding

Plack::Middleware:: AutoDetectEncoding

https://github.com/moznion/Plack-Middleware-AutoDetectEncoding

Page 44: Plack::Request with Encoding

Rails3で言うところの snowmanに近い実装

Page 45: Plack::Request with Encoding

Page 46: Plack::Request with Encoding

☃ Him!

Page 47: Plack::Request with Encoding

☃のような 特定の文字コードでしか 使われない文字を使って 文字コードを特定

Page 48: Plack::Request with Encoding

ただ今回のケースでは ☃が使えないので

(↑Unicodeの為) 別の文字で代替

Page 49: Plack::Request with Encoding

formタグ内に <input type="hidden"

name=“__plack_middleware_auto_detect_encoding” value="駱駝" />

のようなinput要素を追加 フォームデータと共に

判別用文字を送ってもらう

Page 50: Plack::Request with Encoding

リクエストとして来た URLエンコード済み 判別用文字を

各エンコーディングと比較

Page 51: Plack::Request with Encoding

エンコーディングを 特定したら

$env->{‘plack.request.withencoding.encoding’}

にそれを格納する

Page 52: Plack::Request with Encoding

こんな感じ

Page 53: Plack::Request with Encoding

ただ, これで良いのか感

Page 54: Plack::Request with Encoding

なんか微妙なので GitHub止まりです

Page 55: Plack::Request with Encoding
Page 56: Plack::Request with Encoding
Page 57: Plack::Request with Encoding

斬新なdescription!

Page 58: Plack::Request with Encoding

なにか良いアイデア ございましたら 教えてください

Page 59: Plack::Request with Encoding

あと思いつきで vim-plackというvim plug-in

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

Page 60: Plack::Request with Encoding

おわり