plack::request with encoding
DESCRIPTION
2013-11-20, shibuya.pl (plackcon)TRANSCRIPT
![Page 1: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/1.jpg)
Plack::Request with
EncodingHachioji.pm @moznion
![Page 2: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/2.jpg)
大学院生 !
アルバイター !
Hachioji.pm 所属
@moznion
![Page 3: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/3.jpg)
Plack::Requestと 文字列の エンコーディングの話
![Page 4: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/4.jpg)
Plack::Request
![Page 5: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/5.jpg)
皆さん使ってますか
![Page 6: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/6.jpg)
Plack::Request おさらい
![Page 7: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/7.jpg)
教典こと miyagawaさんの Plack Handbook から引用
![Page 8: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/8.jpg)
Plack::Requestは, PSGI環境変数や レスポンス配列に対して, 簡単な オブジェクト指向APIを提供します.
Plack Handbook 14章より引用
![Page 9: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/9.jpg)
新しいミドルウェアを記述する際のライブラリとしても利用できますし, PlackをベースにしたWebフレームワークを記述する際のリクエスト/レスポンスのベースクラスとしても使えます.
Plack Handbook 14章より引用
![Page 10: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/10.jpg)
WAF作る時とか Webアプリケーション 作る時とかに使う
(大体はparentとして)
![Page 11: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/11.jpg)
例 (あくまで例)
![Page 12: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/12.jpg)
![Page 13: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/13.jpg)
さてコレ
![Page 14: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/14.jpg)
param()やparameters()など を使うと, GETやPOSTの パラメータを取れる
![Page 15: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/15.jpg)
param()やparameters()など を使うと, GETやPOSTの パラメータを取れる
ただしバイト列で
![Page 16: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/16.jpg)
つまり?
![Page 17: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/17.jpg)
予期しない エンコーディングの 文字列が来ると 文字化けを起こす
![Page 18: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/18.jpg)
予期しない エンコーディングの 文字列が来ると 文字化けを起こす
![Page 19: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/19.jpg)
予期しない エンコーディングの 文字列が来ると 文字化けを起こす
![Page 20: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/20.jpg)
予期しない エンコーディングの 文字列が来ると 文字化けを起こす
![Page 21: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/21.jpg)
適切に decodeを施して Perl-Stringにしてやる
必要が有る
![Page 22: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/22.jpg)
WAF作る時とか Webアプリケーション 作る時とかに使う
(大体はparentとして)
(Plack::Requestは)
![Page 23: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/23.jpg)
WAF作る時とか Webアプリケーション 作る時とかに使う
(大体はparentとして)
(Plack::Requestは)
![Page 24: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/24.jpg)
decode処理を みんないちいち 書いてる
![Page 25: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/25.jpg)
職人が! 心をこめて! 書いている
![Page 26: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/26.jpg)
めっちゃ再発明されてる (大体コピペ[要出典]で)
![Page 27: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/27.jpg)
もう嫌
![Page 28: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/28.jpg)
もう嫌もう嫌
![Page 29: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/29.jpg)
という訳で そこら辺にケリを 付けるべく作ったのが
![Page 30: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/30.jpg)
Plack::Request::WithEncodinghttps://metacpan.org/pod/Plack::Request::WithEncodinghttps://github.com/moznion/Plack-Request-WithEncoding
![Page 31: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/31.jpg)
これを使うと, param()やparameters()が
decode済み文字列を 返してくれるので便利!
![Page 32: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/32.jpg)
例
![Page 33: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/33.jpg)
例 エンコーディングを指定
![Page 34: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/34.jpg)
例
decodedな文字列が得られる
![Page 35: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/35.jpg)
職人の仕事を 肩代わり!
![Page 36: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/36.jpg)
フレームワークを使わなくても Plack::Request::WithEncodingと Plack::Requestの組み合わせで カジュアルにアプリが書ける!
![Page 37: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/37.jpg)
と偉そうに言ったものの 中身はほぼAmon2からのパク^H^Hインスパイア
![Page 38: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/38.jpg)
パッチやご意見 お待ちしています
![Page 39: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/39.jpg)
で,
![Page 40: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/40.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/41.jpg)
アーハン?
![Page 42: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/42.jpg)
という訳で実装
![Page 43: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/43.jpg)
Plack::Middleware:: AutoDetectEncoding
https://github.com/moznion/Plack-Middleware-AutoDetectEncoding
![Page 44: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/44.jpg)
Rails3で言うところの snowmanに近い実装
![Page 45: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/45.jpg)
☃
![Page 46: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/46.jpg)
☃ Him!
![Page 47: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/47.jpg)
☃のような 特定の文字コードでしか 使われない文字を使って 文字コードを特定
![Page 48: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/48.jpg)
ただ今回のケースでは ☃が使えないので
(↑Unicodeの為) 別の文字で代替
![Page 49: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/49.jpg)
formタグ内に <input type="hidden"
name=“__plack_middleware_auto_detect_encoding” value="駱駝" />
のようなinput要素を追加 フォームデータと共に
判別用文字を送ってもらう
![Page 50: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/50.jpg)
リクエストとして来た URLエンコード済み 判別用文字を
各エンコーディングと比較
![Page 51: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/51.jpg)
エンコーディングを 特定したら
$env->{‘plack.request.withencoding.encoding’}
にそれを格納する
![Page 52: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/52.jpg)
こんな感じ
![Page 53: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/53.jpg)
ただ, これで良いのか感
![Page 54: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/54.jpg)
なんか微妙なので GitHub止まりです
![Page 55: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/55.jpg)
![Page 56: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/56.jpg)
![Page 57: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/57.jpg)
斬新なdescription!
![Page 58: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/58.jpg)
なにか良いアイデア ございましたら 教えてください
![Page 59: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/59.jpg)
あと思いつきで vim-plackというvim plug-in
を書きましたが あまり便利になりませんでした
![Page 60: Plack::Request with Encoding](https://reader034.vdocuments.mx/reader034/viewer/2022052619/556f5ea3d8b42a916b8b5139/html5/thumbnails/60.jpg)
おわり