• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Plack::Request with Encoding
 

Plack::Request with Encoding

on

  • 624 views

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

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

Statistics

Views

Total Views
624
Views on SlideShare
621
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 を書きましたが あまり便利になりませんでした
    • おわり