thinとunicornでrequest.bodyは全く違うので注意。

Rails内でrequest.bodyの扱いがHTTPサーバによって違ったのでメモ。

(id:secondlife さんからTwitter上で”thin / unicorn で異なるところに着目するより、rack.input を見てそれが異なってる、というところのほうが重要じゃないかな。" とアドバイス頂いたので、後日再エントリー書きます!)

環境

thin 1.3.1
unicorn 4.2.1

詳細

thinの場合

p request.body.class # => StringIO

unicornの場合

p request.body.class # => Rack::Lint::InputWrapper

上記の場合、引数にStringやStringIOを想定して実装しているメソッドでエラーになる。
thinに合わせるのなら、unicornでrequest.body.readにする必要がある。

p request.body.read.class # => String

これが正解。


[PR]Spreeの情報を集めています。

ECを持ちたい方、仕事でECを使いたい方向けのコミュニティサイトです。
このサイトでは世界で最も使用されているECの1つであるSpreeについての情報を提供しています。
http://spreecommerce.jp/