Nginx lua module + SPDY = no request body
KiberGus
kibergus at gmail.com
Thu Dec 11 13:58:28 UTC 2014
Hello. I'm experiencing problems with combination of nginx lua module
and SPDI. I use "access_by_lua_file" directive to validate requests.
In the script request checksumm is validated, so I need to get body of
the POST requests. "ngx.var.request_body" variable is used for this
purpose. This code works when client uses HTTP protocol, but when we
move to SPDY request body is always nil.
What I've tried:
I do call ngx.req.read_body() from lua script. Beside taht I've
added "lua_need_request_body on" directive to the nginx config (at
location and at server levels).
I've tried using "ngx.req.get_body_data()" instead of
"ngx.var.request_body".
I've checked that "ngx.req.get_body_file" returns nil. So request
is not written to file.
I've used wireshark to check, that request body is not empty.
If "access_by_lua_file" directive is removed, then backend receives
request body. So the problem occurs only within lua. We've tested
nginx=1.4.0 and nginx=1.6.2. So in case of 1.4 we use SPDY v2 and in
case SPDY v3.1.
Here is a test config:
server {
listen [::]:80;
listen [::]:6121 spdy;
spdy_headers_comp 9;
client_body_buffer_size 100k;
client_max_body_size 100k;
lua_need_request_body on;
server_name *;
location /test {
access_by_lua '
ngx.req.read_body()
if not ngx.req.get_body_data() then
return ngx.exit(403)
end
';
content_by_lua '
ngx.header["Content-Type"] = "text/plain"
ngx.say("hello world")
';
}
}
If you request it without body you get 403. Otherwice you get 200:
$ curl --data "TEST" http://localhost/test
hello world
$ curl http://localhost/test
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.4.0</center>
</body>
</html>
But if SPDY protocol is used, than it always returns 403. Any help is
appreciated. Thank you.
More information about the nginx
mailing list