暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

lua脚本获取request body

编程阁楼 2020-07-08
2699
    有些时候我们需要在nginx反向代理层对请求报文做些处理,第一想到的就是lua这个脚本语言。
    lua获取get请求的args比较简单,通过以下方式即可获取到:
args = ngx.req.get_uri_args()
但是对于post请求,获取request body就没那么简单了,因为如果请求体的size大于nginx配置里的client_body_buffer_size,则会导致请求体被缓冲到磁盘临时文件里,client_body_buffer_size默认是8k(32位系统)或者16k(64位系统)。
那么具体应该怎么获取呢?参见以下代码:
--body_data不一定是普通的字符串,这与请求的content-type有关,如multipart/form-data
local body_data = ngx.req.get_body_data()
if not body_data then
local datafile = ngx.req.get_body_file()
ngx.log(ngx.ERR, "body is in file: ", tostring(datafile))


if datafile then
local fh, err = io.open(datafile, "r")
if fh then
fh:seek("set")
body_data = fh:read("*a")
fh:close()
if body_data == "" then
ngx.log(ngx.ERR, "request body is empty")
end
end
end
end
如果请求是普通post请求,以上方式获取request body已经足够了,但对于multipart/form-data类型请求,以上body_data中可能还包含了文件流信息,具体如何解析读者看先自行脑补。
multipart/form-data类型请求示例:
 --TNekoE5fCH9MSS3bDHD3cH42OnotPYF
Content-Disposition: form-data; name="_data_"
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit


{"fileName":"redis-use.png","bizCode":"1071"}
--TNekoE5fCH9MSS3bDHD3cH42OnotPYF
Content-Disposition: form-data; name="file"; filename="deaultFilename"
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
...省略略内容


TNekoE5fCH9MSS3bDHD3cH42OnotPYF--
当然,我们也可以使用前人写好的插件实现透明化的解析,如lua_multipart,读者可自行学习。
文章转载自编程阁楼,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论