サナギわさわさ.json

サナギさんとキルミーベイベーとプログラミングが好きです

OpenRestyのngx.req.get_body_dataがnilになる問題

夏なのでOpenRestyを始めました。
Postで送られてくるデータを元に色々するためにngx.req.get_body_data()を使っていたのですが、
返り値がちょくちょくnilになる問題が発生しました。

ちょっと調べてみたところ、データサイズがclient_body_buffer_size(デフォルト8K or 16K?)を超えていた場合はデータがメモリに乗らずtmpファイルに書かれるようです。そのためngx.req.get_body_data()では取れなくなり、ngx.req.get_body_file()を代わりに使うとデータが取れるようになります。
簡単なサンプルコード置いておきます。

ngx.req.read_body()
local body_data = ngx.req.get_body_data()
if body_data == nil then
    local body_data_file = ngx.req.get_body_file()
    local fh, msg = io.open(body_data_file, "r")
    if fh then
        body_data = fh:read("*a")
        fh:close()      
        if body_data == nil then
            --some error handling
        end
    else
        --some error handling
    end
end

以上です。Luaは便利なんですが、Cもちゃんと書けるようになりたいですね。