Plack::Response::AutoEncode を作ったらすぐに死んだので原因を書き留めておく
先週の金曜日に Plack::Response::AutoEncode というものを作ってshipitした。どういうものか掻い摘んで書くと、アプリケーションのレスポンスにおいて、Content-Typeがtext/* のときにcharsetに応じてcontent-bodyをencodeするという物で、見ての通りPlack::Responseのサブクラスとして定義した。
その数十分後、僕はなかなか激しい(今思うと至極真っ当な)皮肉を目にすることになる。まとめると、「こんなものあげるな」ということらしい。 とはいえ、理由も聞かされないまま突然そんなこと言われても、こちらとしては皆目ダメな点がわからない。
ダメな理由
というわけで、ほとぼりが冷めたであろう週明け(今日ですね)に、改めてなんでダメなのかを当の本人に教えていただいた。 曰く、PSGIの仕様としてはcontent-bodyはbyte-codeを期待していて、P::Res::AutoEncodeをつかうと、その前提が覆ってしまい、結果的に相反しているのではないか?ということらしい。 まったくその通りだったので、すぐにPAUSEから削除予約を行った。 また、作った理由についても念のため説明(毎回encodeするのが微妙ではないか?と思ったため)したが、それはあくまでApplication側でやるべきことだという、これも今思うと当たり前の指摘をいただいた。
まとめ
- インターフェース仕様を破壊するようなものはCPANに上げるべきではない
- そういうものはAppレイヤーでやるべき
- PrePANしとくべきだった