Plack::Request with Encoding

  • 402 views
Uploaded on

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

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

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
402
On Slideshare
0
From Embeds
0
Number of Embeds
2

Actions

Shares
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. おわり