2015-12-18 313 views
1

我在OpenWRT上的uhttpd上使用Lua,嘗試編寫我自己的門戶來捕獲自定義嵌入作業的表單數據。如何從OpenWRT上讀Lua的POST/uhttpd

我不需要路由器和LUCI的東西來完成這項工作,儘管我已經通過現有的Lua腳本拖動了沒有任何突破。

我很困惑uhttpd如何將POST數據放入Lua腳本中。這是如何發生的?什麼是我在最終的Lua腳本中訪問的POST和GET變量? (在PHP中,這是$ _POST,$ _GET或php://輸入,ruby on rails是請求對象,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 protected]" /> 
    <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 = '[email protected]' 

output = [[ 
Hello {email} 
]] 

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

瀏覽器輸出:

Hello [email protected] 

任何瞭解進入這個過程將是驚人的,謝謝!

回答

2

你可能確實想要Luci,或者至少看看Luci是怎麼做到的。

POST數據位於請求的正文中。 Luci創建了一個ltn12 compatible source to read itpasses it to the http.Request constructorsame with CGI)。

請求類callsprotocol.parse_message_body這是大部分工作。它將結果存儲在請求的params字段中。然後,您可以使用熟悉的formvalue方法(source - 您可以看到第一個呼叫調用_parse_input,我們先前看到)訪問它們。

2

HTTP標頭和POST內容的核心內容分別進入Lua。 HTTP Headers作爲環境變量加載,POST內容在運行後像交互式shell一樣發送到Lua腳本中。

因此,您可以在OpenWRT上使用os.getenv()nixio.getenv()來獲取HTTP標頭,例如HTTP_USER_AGENT

一個Lua CGI腳本讀取HTTP標頭和打印文章的內容是這樣的:

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標題。