2 LuCI - HTTP-Interaction
5 HTTP-Header manipulator and form variable preprocessor
11 Copyright 2008 Steven Barth <steven@midlink.org>
13 Licensed under the Apache License, Version 2.0 (the "License");
14 you may not use this file except in compliance with the License.
15 You may obtain a copy of the License at
17 http://www.apache.org/licenses/LICENSE-2.0
19 Unless required by applicable law or agreed to in writing, software
20 distributed under the License is distributed on an "AS IS" BASIS,
21 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
22 See the License for the specific language governing permissions and
23 limitations under the License.
27 module("luci.http", package.seeall)
28 local ltn12 = require("luci.ltn12")
29 require("luci.http.protocol")
32 context = luci.util.threadlocal()
34 Request = luci.util.class()
35 function Request.__init__(self, env, sourcein, sinkerr)
41 self.filehandler = function() end
47 params = luci.http.protocol.urldecode_params(env.QUERY_STRING or ""),
50 self.parsed_input = false
53 function Request.formvalue(self, name, noparse)
54 if not noparse and not self.parsed_input then
59 return self.message.params[name]
61 return self.message.params
65 function Request.formvaluetable(self, prefix)
67 prefix = prefix and prefix .. "." or "."
69 if not self.parsed_input then
73 local void = self.message.params[nil]
74 for k, v in pairs(self.message.params) do
75 if k:find(prefix, 1, true) == 1 then
76 vals[k:sub(#prefix + 1)] = tostring(v)
83 function Request.getcookie(self, name)
84 local c = string.gsub(";" .. (self:getenv("HTTP_COOKIE") or "") .. ";", "%s*;%s*", ";")
85 local p = ";" .. name .. "=(.-);"
86 local i, j, value = c:find(p)
87 return value and urldecode(value)
90 function Request.getenv(self, name)
92 return self.message.env[name]
94 return self.message.env
98 function Request.setfilehandler(self, callback)
99 self.filehandler = callback
102 function Request._parse_input(self)
103 luci.http.protocol.parse_message_body(
108 self.parsed_input = true
111 --- Close the HTTP-Connection.
113 if not context.eoh then
118 if not context.closed then
119 context.closed = true
124 --- Get a certain HTTP input value or a table of all input values.
125 -- @param name Name of the GET or POST variable to fetch
126 -- @param noparse Don't parse POST data before getting the value
127 -- @return HTTP input value or table of all input value
128 function formvalue(name, noparse)
129 return context.request:formvalue(name, noparse)
132 --- Get a table of all HTTP input values with a certain prefix.
133 -- @param prefix Prefix
134 -- @return Table of all HTTP input values with given prefix
135 function formvaluetable(prefix)
136 return context.request:formvaluetable(prefix)
139 --- Get the value of a certain HTTP-Cookie.
140 -- @param name Cookie Name
141 -- @return String containing cookie data
142 function getcookie(name)
143 return context.request:getcookie(name)
146 --- Get the value of a certain HTTP environment variable
147 -- or the environment table itself.
148 -- @param name Environment variable
149 -- @return HTTP environment value or environment table
150 function getenv(name)
151 return context.request:getenv(name)
154 --- Set a handler function for incoming user file uploads.
155 -- @param callback Handler function
156 function setfilehandler(callback)
157 return context.request:setfilehandler(callback)
160 --- Send a HTTP-Header.
161 -- @param key Header key
162 -- @param value Header value
163 function header(key, value)
164 if not context.headers then
167 context.headers[key:lower()] = value
168 coroutine.yield(2, key, value)
171 --- Set the mime type of following content data.
172 -- @param mime Mimetype of following content
173 function prepare_content(mime)
174 header("Content-Type", mime)
177 --- Set the HTTP status code and status message.
178 -- @param code Status code
179 -- @param message Status message
180 function status(code, message)
182 message = message or "OK"
183 context.status = code
184 coroutine.yield(1, code, message)
187 --- Send a chunk of content data to the client.
188 -- This function is as a valid LTN12 sink.
189 -- If the content chunk is nil this function will automatically invoke close.
190 -- @param content Content chunk
191 -- @param src_err Error object from source (optional)
193 function write(content, src_err)
201 elseif #content == 0 then
204 if not context.eoh then
205 if not context.status then
208 if not context.headers or not context.headers["content-type"] then
209 header("Content-Type", "text/html; charset=utf-8")
211 if not context.headers["cache-control"] then
212 header("Cache-Control", "no-cache")
219 coroutine.yield(4, content)
224 --- Redirects the client to a new URL and closes the connection.
225 -- @param url Target URL
226 function redirect(url)
228 header("Location", url)
232 --- Create a querystring out of a table of key - value pairs.
233 -- @param table Query string source table
234 -- @return Encoded HTTP query string
235 function build_querystring(table)
238 for k, v in pairs(table) do
239 s = s .. urlencode(k) .. "=" .. urlencode(v) .. "&"
245 --- Return the URL-decoded equivalent of a string.
246 -- @param str URL-encoded string
247 -- @param no_plus Don't decode + to " "
248 -- @return URL-decoded string
250 urldecode = luci.http.protocol.urldecode
252 --- Return the URL-encoded equivalent of a string.
253 -- @param str Source string
254 -- @return URL-encoded string
256 urlencode = luci.http.protocol.urlencode