[Rails5 + Puma]Chunked Transfer-Encodingでリクエストすると、parameter bodyが空で取得できない

別のAPIからリクエストを受けるWebアプリをRails5で開発しているときに発生した現象の書き溜め。
Rails5 + pumaのアプリケーションサーバーだと、Chunked Transfer-Encodingに対して正しく動作しないことが判明した。

リクエストをすると、パラメーターを取得できない。

Railsではリクエストパラメータは、paramsで本来は取得できるのだが,
Chunked Transfer-Encodingでリクエストしたらbodyが空になってしまう。
loggerなどで出力してもnilになっているのだ。

広告

Chunked Transfer-Encoding リクエストの対策

対策としてNginxなどのウェブサーバーを挟むのがいい。
Nginxはchuked Requestを解釈してからpumaに渡してくれるので問題なし。

この現象は、
2014年から見つかっていたみたい。

Railsに対してissueも挙げられてたけど
特段動きはないので、現状だとこの人が用意したモンキーパッチを使用するか
Nginxをはさむのがいい。

run lambda { |env|
STDERR.puts env['rack.input'].read # => {"abc": "123"}

[200, {"Content-Type" => "application/json"}, [""]]
}

もしくは、Webrickやunincornだと問題ないという報告もあるので
そっちに切り替えちゃうのも手だと思う。

Rails側はあまり興味がないのか、別の要因なのか
とりあえず、Nginxとか使えばいいかな。



じゃあね〜〜〜〜。