X-Git-Url: http://git.archive.openwrt.org/?a=blobdiff_plain;f=libs%2Fweb%2Fluasrc%2Fhttp.lua;h=6838220ce8a8163b4c74f6d382b2611911802680;hb=66a6492ae5aa9779af6d22eaddf0f5f253ed1189;hp=bb05c680b1072c1e23f1ac991373e18e9dacd890;hpb=1a9fe9cd77e70674270101c9566efea6fd7c11bb;p=project%2Fluci.git diff --git a/libs/web/luasrc/http.lua b/libs/web/luasrc/http.lua index bb05c680b..6838220ce 100644 --- a/libs/web/luasrc/http.lua +++ b/libs/web/luasrc/http.lua @@ -7,9 +7,6 @@ HTTP-Header manipulator and form variable preprocessor FileId: $Id$ -ToDo: -- Cookie handling - License: Copyright 2008 Steven Barth @@ -28,7 +25,7 @@ limitations under the License. ]]-- module("luci.http", package.seeall) -require("ltn12") +local ltn12 = require("luci.ltn12") require("luci.http.protocol") require("luci.util") @@ -51,24 +48,16 @@ function Request.__init__(self, env, sourcein, sinkerr) params = luci.http.protocol.urldecode_params(env.QUERY_STRING or ""), } - setmetatable(self.message.params, {__index = - function(tbl, key) - setmetatable(tbl, nil) - - luci.http.protocol.parse_message_body( - self.input, - self.message, - self.filehandler - ) - - return rawget(tbl, key) - end - }) + self.parsed_input = false end -function Request.formvalue(self, name, default) +function Request.formvalue(self, name, noparse) + if not noparse and not self.parsed_input then + self:_parse_input() + end + if name then - return self.message.params[name] and tostring(self.message.params[name]) or default + return self.message.params[name] else return self.message.params end @@ -78,6 +67,10 @@ function Request.formvaluetable(self, prefix) local vals = {} prefix = prefix and prefix .. "." or "." + if not self.parsed_input then + self:_parse_input() + end + local void = self.message.params[nil] for k, v in pairs(self.message.params) do if k:find(prefix, 1, true) == 1 then @@ -88,6 +81,13 @@ function Request.formvaluetable(self, prefix) return vals end +function Request.getcookie(self, name) + local c = string.gsub(";" .. (self:getenv("HTTP_COOKIE") or "") .. ";", "%s*;%s*", ";") + local p = ";" .. name .. "=(.-);" + local i, j, value = c:find(p) + return value and urldecode(value) +end + function Request.getenv(self, name) if name then return self.message.env[name] @@ -100,6 +100,15 @@ function Request.setfilehandler(self, callback) self.filehandler = callback end +function Request._parse_input(self) + luci.http.protocol.parse_message_body( + self.input, + self.message, + self.filehandler + ) + self.parsed_input = true +end + function close() if not context.eoh then @@ -121,6 +130,10 @@ function formvaluetable(...) return context.request:formvaluetable(...) end +function getcookie(...) + return context.request:getcookie(...) +end + function getvalue(...) return context.request:getvalue(...) end @@ -138,9 +151,6 @@ function setfilehandler(...) end function header(key, value) - if not context.status then - status() - end if not context.headers then context.headers = {} end @@ -159,38 +169,35 @@ function status(code, message) coroutine.yield(1, code, message) end -function write(content) - if not content or #content == 0 then - return - end - if not context.eoh then - if not context.status then - status() +function write(content, src_err) + if not content then + if src_err then + error(src_err) + else + close() end - if not context.headers or not context.headers["content-type"] then - header("Content-Type", "text/html; charset=utf-8") + return true + elseif #content == 0 then + return true + else + if not context.eoh then + if not context.status then + status() + end + if not context.headers or not context.headers["content-type"] then + header("Content-Type", "text/html; charset=utf-8") + end + + context.eoh = true + coroutine.yield(3) end - - context.eoh = true - coroutine.yield(3) + coroutine.yield(4, content) + return true end - coroutine.yield(4, content) -end - - -function basic_auth(realm, errorpage) - header("Status", "401 Unauthorized") - header("WWW-Authenticate", string.format('Basic realm="%s"', realm or "")) - - if errorpage then - errorpage() - end - - close() end function redirect(url) - header("Status", "302 Found") + status(302, "Found") header("Location", url) close() end