Your SlideShare is downloading. ×

Plack::Request with Encoding

498

Published on

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

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

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
498
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

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

×