別の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とか使えばいいかな。
じゃあね〜〜〜〜。