Plack::Request with Encoding
Upcoming SlideShare
Loading in...5
×
 

Plack::Request with Encoding

on

  • 785 views

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

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

Statistics

Views

Total Views
785
Views on SlideShare
782
Embed Views
3

Actions

Likes
0
Downloads
0
Comments
0

2 Embeds 3

https://twitter.com 2
http://s.deeeki.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Plack::Request with Encoding Plack::Request with Encoding Presentation Transcript

  • Plack::Request with Encoding Hachioji.pm @moznion
  • @moznion 大学院生 ! アルバイター ! Hachioji.pm 所属
  • 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にしてやる 必要が有る
  • (Plack::Requestは) WAF作る時とか Webアプリケーション 作る時とかに使う (大体はparentとして)
  • (Plack::Requestは) WAF作る時とか Webアプリケーション 作る時とかに使う (大体はparentとして)
  • decode処理を みんないちいち 書いてる
  • 職人が! 心をこめて! 書いている
  • めっちゃ再発明されてる (大体コピペ[要出典]で)
  • もう嫌
  • もう嫌
  • という訳で そこら辺にケリを 付けるべく作ったのが
  • Plack::Request::WithEncoding https://metacpan.org/pod/Plack::Request::WithEncoding https://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 を書きましたが あまり便利になりませんでした
  • おわり