如何在OpenWRT / uhttpd上阅读Lua的POST

时间:2015-12-18 00:00:45

标签: web lua openwrt

我在OpenWRT上使用Lua on uhttpd,试图编写自己的门户来捕获自定义嵌入式作业的表单数据。

我不需要路由器和LUCI这项工作,虽然我已经通过现有的Lua脚本没有任何突破。

我对uhttpd如何将POST数据放入Lua脚本感到困惑。这是怎么发生的?我在生成的Lua脚本中访问的POST和GET变量是什么?

(在PHP中,这是$ _POST,$ _GET或php://输入,rails上的ruby是请求对象,python有cgi.FieldStorage()或request.POST ......它在Lua上是什么/ uhttpd?)

这是一个简单的示例脚本。

前端/index.html:

<!DOCTYPE html>
<html>
<body>
<form action="/cgi/luascripts/processform.lua" method="post">
  <input type="email" name="email" placeholder="email@example.com" />
  <input type="submit" value="submit" />
</form>
</body>
</html>

后端/cgi-bin/luascripts/processform.lua:

-- some magic happens to bring POST data into email variable (how does this happen?)
-- email = 'joe@somecompany.com'

output = [[
Hello {email}
]]

output = output:gsub("{email}", email)
print(output)

浏览器输出:

Hello joe@somecompany.com

对这个过程的任何见解都会很棒,谢谢!

2 个答案:

答案 0 :(得分:2)

你可能确实想要Luci,或者至少看看Luci是如何做到的。

POST数据位于请求正文中。 Luci创建了ltn12 compatible source to read itpasses it to the http.Request constructorsame with CGI)。

请求类calls protocol.parse_message_body执行大部分工作。它将结果存储在请求的params字段中。然后,您可以使用熟悉的formvalue方法(source)访问它们 - 您可以看到我们之前看到的第一个来电呼叫_parse_input

答案 1 :(得分:2)

在其核心,HTTP标头和POST内容分别进入Lua。 HTTP标头作为环境变量加载,POST内容在运行后就像交互式shell一样发送到Lua脚本中。

因此,您可以在OpenWRT上使用HTTP_USER_AGENTos.getenv()获取nixio.getenv()等HTTP标头。

读取HTTP标头并打印POST内容的Lua CGI脚本如下所示:

require "nixio"

-- prepare the browser for content:
print("\r")

-- print http headers
http_headers = nixio.getenv()
for k,v in pairs(http_headers) do
  print(k, v)
end

-- print POST output
print(io.read("*all"))

结果输出如下所示:

HTTP_ACCEPT text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
SCRIPT_NAME /cgi-bin/test.htm
QUERY_STRING    parm1=val&parm2=val2
HTTP_ACCEPT_ENCODING    gzip, deflate
SERVER_ADDR 192.168.1.1
GATEWAY_INTERFACE   CGI/1.1
HTTP_AUTHORIZATION  
CONTENT_LENGTH  23
SERVER_PORT 80
SCRIPT_FILENAME /www/cgi-bin/test.htm
REQUEST_URI /cgi-bin/test.htm?parm1=val&parm2=val2
...
DOCUMENT_ROOT   /www
CONTENT_TYPE    application/x-www-form-urlencoded
HTTP_CONNECTION keep-alive
HTTP_USER_AGENT Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.1 Safari/537.36
HTTP_ACCEPT_LANGUAGE    en-us
REQUEST_METHOD  POST

test=value&test1=value1

值得注意的是,uhttpd将代表CGI脚本将HTTP标头输出到浏览器,包括与CGI脚本的文件扩展名匹配的Content-Type。因此,.json将有Content-Type: application/json标头,.html文件将有Content-Type: text/html标头。