X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fluci.git;a=blobdiff_plain;f=libs%2Fweb%2Fluasrc%2Fhttp.lua;h=d34e253a53a8c9a550304270633b59e3770e81e0;hp=e26b3b5dbb777adcd5193a35e5044ea1d7ceb0a5;hb=8038cbf00489fcd0d8406602e5155d2e63b6ad7f;hpb=a91f1a7e376ac6183859c726091191d3d3d6025f diff --git a/libs/web/luasrc/http.lua b/libs/web/luasrc/http.lua index e26b3b5db..d34e253a5 100644 --- a/libs/web/luasrc/http.lua +++ b/libs/web/luasrc/http.lua @@ -24,15 +24,20 @@ limitations under the License. ]]-- +local ltn12 = require "luci.ltn12" +local protocol = require "luci.http.protocol" +local util = require "luci.util" +local string = require "string" +local coroutine = require "coroutine" + +local pairs, tostring, error = pairs, tostring, error + --- LuCI Web Framework high-level HTTP functions. -module("luci.http", package.seeall) -local ltn12 = require("luci.ltn12") -require("luci.http.protocol") -require("luci.util") +module "luci.http" -context = luci.util.threadlocal() +context = util.threadlocal() -Request = luci.util.class() +Request = util.class() function Request.__init__(self, env, sourcein, sinkerr) self.input = sourcein self.error = sinkerr @@ -45,7 +50,7 @@ function Request.__init__(self, env, sourcein, sinkerr) self.message = { env = env, headers = {}, - params = luci.http.protocol.urldecode_params(env.QUERY_STRING or ""), + params = protocol.urldecode_params(env.QUERY_STRING or ""), } self.parsed_input = false @@ -81,6 +86,14 @@ function Request.formvaluetable(self, prefix) return vals end +function Request.content(self) + if not self.parsed_input then + self:_parse_input() + end + + return self.message.content, self.message.content_length +end + function Request.getcookie(self, name) local c = string.gsub(";" .. (self:getenv("HTTP_COOKIE") or "") .. ";", "%s*;%s*", ";") local p = ";" .. name .. "=(.-);" @@ -101,7 +114,7 @@ function Request.setfilehandler(self, callback) end function Request._parse_input(self) - luci.http.protocol.parse_message_body( + protocol.parse_message_body( self.input, self.message, self.filehandler @@ -122,6 +135,13 @@ function close() end end +--- Return the request content if the request was of unknown type. +-- @return HTTP request body +-- @return HTTP request body length +function content() + return context.request:content() +end + --- Get a certain HTTP input value or a table of all input values. -- @param name Name of the GET or POST variable to fetch -- @param noparse Don't parse POST data before getting the value @@ -172,7 +192,22 @@ end --- Set the mime type of following content data. -- @param mime Mimetype of following content function prepare_content(mime) - header("Content-Type", mime) + if not context.headers or not context.headers["content-type"] then + if mime == "application/xhtml+xml" then + if not getenv("HTTP_ACCEPT") or + not getenv("HTTP_ACCEPT"):find("application/xhtml+xml", nil, true) then + mime = "text/html; charset=UTF-8" + end + header("Vary", "Accept") + end + header("Content-Type", mime) + end +end + +--- Get the RAW HTTP input source +-- @return HTTP LTN12 source +function source() + return context.request.input end --- Set the HTTP status code and status message. @@ -211,6 +246,7 @@ function write(content, src_err) end if not context.headers["cache-control"] then header("Cache-Control", "no-cache") + header("Expires", "0") end @@ -222,6 +258,13 @@ function write(content, src_err) end end +--- Splice data from a filedescriptor to the client. +-- @param fp File descriptor +-- @param size Bytes to splice (optional) +function splice(fd, size) + coroutine.yield(6, fd, size) +end + --- Redirects the client to a new URL and closes the connection. -- @param url Target URL function redirect(url) @@ -248,10 +291,10 @@ end -- @param no_plus Don't decode + to " " -- @return URL-decoded string -- @see urlencode -urldecode = luci.http.protocol.urldecode +urldecode = protocol.urldecode --- Return the URL-encoded equivalent of a string. -- @param str Source string -- @return URL-encoded string -- @see urldecode -urlencode = luci.http.protocol.urlencode +urlencode = protocol.urlencode