treewide: do not use Lua module()

This commit is contained in:
Matthias Schiffer 2019-06-16 15:51:43 +02:00
parent 3ec108aacc
commit da45bd5987
No known key found for this signature in database
GPG Key ID: 16EF3F64CB201D9C
17 changed files with 252 additions and 258 deletions

View File

@ -1,8 +1,10 @@
local site = require 'gluon.site'
module 'gluon.client_bridge'
local M = {}
function next_node_macaddr()
function M.next_node_macaddr()
return site.next_node.mac('16:41:95:40:f7:dc')
end
return M

View File

@ -1,21 +1,19 @@
local osm = require 'gluon.web.model.osm'
local site = require 'gluon.site'
local tonumber = tonumber
local M = {}
module 'gluon.config-mode.geo-location-osm'
M.MapValue = osm.MapValue
MapValue = osm.MapValue
function help(i18n)
function M.help(i18n)
local pkg_i18n = i18n 'gluon-config-mode-geo-location-osm'
return pkg_i18n.translate(
'You may also select the position on the map displayed below if your computer is connected to the internet at the moment.'
)
end
function options()
function M.options()
local config = site.config_mode.geo_location.osm
return {
@ -24,3 +22,5 @@ function options()
pos = config.center(),
}
end
return M

View File

@ -40,12 +40,12 @@ proto_gluon_wired_setup() {
json_init
json_add_string name "$meshif"
[ -n "$index" ] && json_add_string macaddr "$(lua -lgluon.util -e "print(gluon.util.generate_mac($index))")"
[ -n "$index" ] && json_add_string macaddr "$(lua -e "print(require('gluon.util').generate_mac($index))")"
json_add_string proto 'vxlan6'
json_add_string tunlink "$config"
json_add_string ip6addr "$(interface_linklocal "$ifname")"
json_add_string peer6addr 'ff02::15c'
json_add_int vid "$(lua -lgluon.util -e 'print(tonumber(gluon.util.domain_seed_bytes("gluon-mesh-vxlan", 3), 16))')"
json_add_int vid "$(lua -e 'print(tonumber(require("gluon.util").domain_seed_bytes("gluon-mesh-vxlan", 3), 16))')"
json_add_boolean rxcsum '0'
json_add_boolean txcsum '0'
json_close_object

View File

@ -1,10 +1,9 @@
local bit = require 'bit'
local string = string
local tonumber = tonumber
local table = table
module 'gluon.iputil'
function IPv6(address)
local M = {}
function M.IPv6(address)
--[[
(c) 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net>
(c) 2008 Steven Barth <steven@midlink.org>
@ -75,7 +74,7 @@ function IPv6(address)
end
end
function mac_to_ip(prefix, mac)
function M.mac_to_ip(prefix, mac)
local m1, m2, m3, m6, m7, m8 = string.match(mac, '(%x%x):(%x%x):(%x%x):(%x%x):(%x%x):(%x%x)')
local m4 = 0xff
local m5 = 0xfe
@ -89,8 +88,9 @@ function mac_to_ip(prefix, mac)
local prefix, plen = string.match(prefix, '(.*)/(%d+)')
plen = tonumber(plen, 10)
local p1, p2, p3, p4, p5, p6, p7, p8 = IPv6(prefix)
local p1, p2, p3, p4, p5, p6, p7, p8 = M.IPv6(prefix)
return string.format("%x:%x:%x:%x:%x:%x:%x:%x/%d", p1, p2, p3, p4, h1, h2, h3, h4, 128)
end
return M

View File

@ -1,49 +1,45 @@
local platform_info = require 'platform_info'
local util = require 'gluon.util'
local setmetatable = setmetatable
local M = setmetatable({}, {
__index = platform_info,
})
module 'gluon.platform'
function M.match(target, subtarget, boards)
if M.get_target() ~= target then
return false
end
setmetatable(_M,
{
__index = platform_info,
}
)
if M.get_subtarget() ~= subtarget then
return false
end
function match(target, subtarget, boards)
if get_target() ~= target then
return false
end
if boards and not util.contains(boards, M.get_board_name()) then
return false
end
if get_subtarget() ~= subtarget then
return false
end
if boards and not util.contains(boards, get_board_name()) then
return false
end
return true
return true
end
function is_outdoor_device()
if match('ar71xx', 'generic', {
'cpe510-520-v1',
'ubnt-nano-m',
'ubnt-nano-m-xw',
}) then
return true
function M.is_outdoor_device()
if M.match('ar71xx', 'generic', {
'cpe510-520-v1',
'ubnt-nano-m',
'ubnt-nano-m-xw',
}) then
return true
elseif match('ar71xx', 'generic', {'unifiac-lite'}) and
get_model() == 'Ubiquiti UniFi-AC-MESH' then
return true
elseif M.match('ar71xx', 'generic', {'unifiac-lite'}) and
M.get_model() == 'Ubiquiti UniFi-AC-MESH' then
return true
elseif match('ar71xx', 'generic', {'unifiac-pro'}) and
get_model() == 'Ubiquiti UniFi-AC-MESH-PRO' then
return true
end
elseif M.match('ar71xx', 'generic', {'unifiac-pro'}) and
M.get_model() == 'Ubiquiti UniFi-AC-MESH-PRO' then
return true
end
return false
return false
end
return M

View File

@ -20,15 +20,7 @@ local function set(_, name, val)
end
end
local setmetatable = setmetatable
module 'gluon.sysconfig'
setmetatable(_M,
{
__index = get,
__newindex = set,
}
)
return _M
return setmetatable({}, {
__index = get,
__newindex = set,
})

View File

@ -1,20 +1,19 @@
local util = require 'gluon.util'
local os = os
local string = string
local M = {}
module 'gluon.users'
function remove_user(username)
function M.remove_user(username)
os.execute('exec lock /var/lock/passwd')
util.replace_prefix('/etc/passwd', username .. ':')
util.replace_prefix('/etc/shadow', username .. ':')
os.execute('exec lock -u /var/lock/passwd')
end
function remove_group(groupname)
function M.remove_group(groupname)
os.execute('exec lock /var/lock/group')
util.replace_prefix('/etc/group', groupname .. ':')
os.execute('exec lock -u /var/lock/group')
end
return M

View File

@ -1,3 +1,12 @@
local bit = require 'bit'
local posix_glob = require 'posix.glob'
local hash = require 'hash'
local sysconfig = require 'gluon.sysconfig'
local site = require 'gluon.site'
local M = {}
-- Writes all lines from the file input to the file output except those starting with prefix
-- Doesn't close the output file, but returns the file object
local function do_filter_prefix(input, output, prefix)
@ -13,29 +22,11 @@ local function do_filter_prefix(input, output, prefix)
return f
end
local io = io
local os = os
local string = string
local tonumber = tonumber
local ipairs = ipairs
local pairs = pairs
local table = table
local bit = require 'bit'
local posix_glob = require 'posix.glob'
local hash = require 'hash'
local sysconfig = require 'gluon.sysconfig'
local site = require 'gluon.site'
module 'gluon.util'
function trim(str)
function M.trim(str)
return str:gsub("^%s*(.-)%s*$", "%1")
end
function contains(table, value)
function M.contains(table, value)
for k, v in pairs(table) do
if value == v then
return k
@ -44,7 +35,7 @@ function contains(table, value)
return false
end
function add_to_set(t, itm)
function M.add_to_set(t, itm)
for _,v in ipairs(t) do
if v == itm then return false end
end
@ -52,7 +43,7 @@ function add_to_set(t, itm)
return true
end
function remove_from_set(t, itm)
function M.remove_from_set(t, itm)
local i = 1
local changed = false
while i <= #t do
@ -67,7 +58,7 @@ function remove_from_set(t, itm)
end
-- Removes all lines starting with a prefix from a file, optionally adding a new one
function replace_prefix(file, prefix, add)
function M.replace_prefix(file, prefix, add)
local tmp = file .. '.tmp'
local f = do_filter_prefix(file, tmp, prefix)
if add then
@ -87,23 +78,23 @@ local function readall(f)
return data
end
function readfile(file)
function M.readfile(file)
return readall(io.open(file))
end
function exec(command)
function M.exec(command)
return readall(io.popen(command))
end
function node_id()
function M.node_id()
return string.gsub(sysconfig.primary_mac, ':', '')
end
function default_hostname()
return site.hostname_prefix('') .. node_id()
function M.default_hostname()
return site.hostname_prefix('') .. M.node_id()
end
function domain_seed_bytes(key, length)
function M.domain_seed_bytes(key, length)
local ret = ''
local v = ''
local i = 0
@ -119,7 +110,7 @@ function domain_seed_bytes(key, length)
return ret:sub(0, 2*length)
end
function get_mesh_devices(uconn)
function M.get_mesh_devices(uconn)
local dump = uconn:call("network.interface", "dump", {})
local devices = {}
for _, interface in ipairs(dump.interface) do
@ -132,13 +123,13 @@ end
-- Safe glob: returns an empty table when the glob fails because of
-- a non-existing path
function glob(pattern)
function M.glob(pattern)
return posix_glob.glob(pattern) or {}
end
local function find_phy_by_path(path)
local phy = glob('/sys/devices/' .. path .. '/ieee80211/phy*')[1]
or glob('/sys/devices/platform/' .. path .. '/ieee80211/phy*')[1]
local phy = M.glob('/sys/devices/' .. path .. '/ieee80211/phy*')[1]
or M.glob('/sys/devices/platform/' .. path .. '/ieee80211/phy*')[1]
if phy then
return phy:match('([^/]+)$')
@ -147,14 +138,14 @@ end
local function find_phy_by_macaddr(macaddr)
local addr = macaddr:lower()
for _, file in ipairs(glob('/sys/class/ieee80211/*/macaddress')) do
if trim(readfile(file)) == addr then
for _, file in ipairs(M.glob('/sys/class/ieee80211/*/macaddress')) do
if M.trim(M.readfile(file)) == addr then
return file:match('([^/]+)/macaddress$')
end
end
end
function find_phy(config)
function M.find_phy(config)
if not config or config.type ~= 'mac80211' then
return nil
elseif config.path then
@ -167,7 +158,7 @@ function find_phy(config)
end
local function get_addresses(uci, radio)
local phy = find_phy(radio)
local phy = M.find_phy(radio)
if not phy then
return function() end
end
@ -187,7 +178,7 @@ end
-- 5: mesh1
-- 6: ibss1
-- 7: wan_radio1 (private WLAN); mesh VPN
function generate_mac(i)
function M.generate_mac(i)
if i > 7 or i < 0 then return nil end -- max allowed id (0b111)
local hashed = string.sub(hash.md5(sysconfig.primary_mac), 0, 12)
@ -231,19 +222,19 @@ local function get_wlan_mac_from_driver(uci, radio, vif)
end
end
function get_wlan_mac(uci, radio, index, vif)
function M.get_wlan_mac(uci, radio, index, vif)
local addr = get_wlan_mac_from_driver(uci, radio, vif)
if addr then
return addr
end
return generate_mac(4*(index-1) + (vif-1))
return M.generate_mac(4*(index-1) + (vif-1))
end
-- Iterate over all radios defined in UCI calling
-- f(radio, index, site.wifiX) for each radio found while passing
-- site.wifi24 for 2.4 GHz devices and site.wifi5 for 5 GHz ones.
function foreach_radio(uci, f)
function M.foreach_radio(uci, f)
local radios = {}
uci:foreach('wireless', 'wifi-device', function(radio)
@ -261,11 +252,13 @@ function foreach_radio(uci, f)
end
end
function get_uptime()
local uptime_file = readfile("/proc/uptime")
function M.get_uptime()
local uptime_file = M.readfile("/proc/uptime")
if uptime_file == nil then
-- Something went wrong reading "/proc/uptime"
return nil
end
return tonumber(uptime_file:match('^[^ ]+'))
end
return M

View File

@ -36,7 +36,7 @@ proto_gluon_bat0_renew() {
proto_gluon_bat0_setup() {
local config="$1"
local primary0_mac="$(lua -lgluon.util -e 'print(gluon.util.generate_mac(3))')"
local primary0_mac="$(lua -e 'print(require("gluon.util").generate_mac(3))')"
ip link add primary0 type dummy
echo 1 > /proc/sys/net/ipv6/conf/primary0/disable_ipv6

View File

@ -1,5 +1,5 @@
local uci = require("simple-uci").cursor()
local util = gluon.util
local util = require 'gluon.util'
local f = Form(translate('Mesh VPN'))

View File

@ -2,8 +2,6 @@
-- Copyright 2017-2018 Matthias Schiffer <mschiffer@universe-factory.net>
-- Licensed to the public under the Apache License 2.0.
module('gluon.web.model', package.seeall)
local unistd = require 'posix.unistd'
local classes = require 'gluon.web.model.classes'

View File

@ -2,17 +2,18 @@
-- Copyright 2017-2018 Matthias Schiffer <mschiffer@universe-factory.net>
-- Licensed to the public under the Apache License 2.0.
module("gluon.web.model.classes", package.seeall)
local util = require "gluon.web.util"
local datatypes = require "gluon.web.model.datatypes"
local class = util.class
local instanceof = util.instanceof
FORM_NODATA = 0
FORM_VALID = 1
FORM_INVALID = -1
local M = {}
M.FORM_NODATA = 0
M.FORM_VALID = 1
M.FORM_INVALID = -1
local function parse_datatype(code)
@ -41,7 +42,8 @@ local function verify_datatype(dt, value)
end
Node = class()
local Node = class()
M.Node = Node
function Node:__init__(name, title, description)
self.children = {}
@ -107,7 +109,8 @@ function Node:handle()
end
Template = class(Node)
local Template = class(Node)
M.Template = Template
function Template:__init__(template)
Node.__init__(self)
@ -115,75 +118,8 @@ function Template:__init__(template)
end
Form = class(Node)
function Form:__init__(title, description, name)
Node.__init__(self, name, title, description)
self.template = "model/form"
end
function Form:submitstate(http)
return http:getenv("REQUEST_METHOD") == "POST" and http:formvalue(self:id()) ~= nil
end
function Form:parse(http)
if not self:submitstate(http) then
self.state = FORM_NODATA
return
end
Node.parse(self, http)
while self:resolve_depends() do end
for _, s in ipairs(self.children) do
for _, v in ipairs(s.children) do
if v.state == FORM_INVALID then
self.state = FORM_INVALID
return
end
end
end
self.state = FORM_VALID
end
function Form:handle()
if self.state == FORM_VALID then
Node.handle(self)
self:write()
end
end
function Form:write()
end
function Form:section(t, ...)
assert(instanceof(t, Section), "class must be a descendent of Section")
local obj = t(...)
self:append(obj)
return obj
end
Section = class(Node)
function Section:__init__(title, description, name)
Node.__init__(self, name, title, description)
self.template = "model/section"
end
function Section:option(t, ...)
assert(instanceof(t, AbstractValue), "class must be a descendant of AbstractValue")
local obj = t(...)
self:append(obj)
return obj
end
AbstractValue = class(Node)
local AbstractValue = class(Node)
M.AbstractValue = AbstractValue
function AbstractValue:__init__(...)
Node.__init__(self, ...)
@ -195,7 +131,7 @@ function AbstractValue:__init__(...)
self.template = "model/valuewrapper"
self.state = FORM_NODATA
self.state = M.FORM_NODATA
end
function AbstractValue:depends(field, value)
@ -234,7 +170,7 @@ function AbstractValue:formvalue(http)
end
function AbstractValue:cfgvalue()
if self.state == FORM_NODATA then
if self.state == M.FORM_NODATA then
return self:defaultvalue()
else
return self.data
@ -250,7 +186,7 @@ function AbstractValue:add_error(type, msg)
self.tag_missing = true
end
self.state = FORM_INVALID
self.state = M.FORM_INVALID
end
function AbstractValue:reset()
@ -258,7 +194,7 @@ function AbstractValue:reset()
self.tag_invalid = nil
self.tag_missing = nil
self.data = nil
self.state = FORM_NODATA
self.state = M.FORM_NODATA
end
@ -275,18 +211,18 @@ function AbstractValue:parse(http)
return
end
self.state = FORM_VALID
self.state = M.FORM_VALID
end
function AbstractValue:resolve_depends()
if self.state == FORM_NODATA or #self.deps == 0 then
if self.state == M.FORM_NODATA or #self.deps == 0 then
return false
end
for _, d in ipairs(self.deps) do
local valid = true
for k, v in pairs(d) do
if k.state ~= FORM_VALID or k.data ~= v then
if k.state ~= M.FORM_VALID or k.data ~= v then
valid = false
break
end
@ -316,7 +252,7 @@ function AbstractValue:validate()
end
function AbstractValue:handle()
if self.state == FORM_VALID then
if self.state == M.FORM_VALID then
self:write(self.data)
end
end
@ -325,7 +261,8 @@ function AbstractValue:write(value)
end
Value = class(AbstractValue)
local Value = class(AbstractValue)
M.Value = Value
function Value:__init__(...)
AbstractValue.__init__(self, ...)
@ -333,7 +270,8 @@ function Value:__init__(...)
end
Flag = class(AbstractValue)
local Flag = class(AbstractValue)
M.Flag = Flag
function Flag:__init__(...)
AbstractValue.__init__(self, ...)
@ -351,7 +289,8 @@ function Flag:validate()
end
ListValue = class(AbstractValue)
local ListValue = class(AbstractValue)
M.ListValue = ListValue
function ListValue:__init__(...)
AbstractValue.__init__(self, ...)
@ -411,7 +350,8 @@ function ListValue:validate()
end
DynamicList = class(AbstractValue)
local DynamicList = class(AbstractValue)
M.DynamicList = DynamicList
function DynamicList:__init__(...)
AbstractValue.__init__(self, ...)
@ -450,9 +390,83 @@ function DynamicList:validate()
end
TextValue = class(AbstractValue)
local TextValue = class(AbstractValue)
M.TextValue = TextValue
function TextValue:__init__(...)
AbstractValue.__init__(self, ...)
self.subtemplate = "model/tvalue"
end
local Section = class(Node)
M.Section = Section
function Section:__init__(title, description, name)
Node.__init__(self, name, title, description)
self.template = "model/section"
end
function Section:option(t, ...)
assert(instanceof(t, AbstractValue), "class must be a descendant of AbstractValue")
local obj = t(...)
self:append(obj)
return obj
end
local Form = class(Node)
M.Form = Form
function Form:__init__(title, description, name)
Node.__init__(self, name, title, description)
self.template = "model/form"
end
function Form:submitstate(http)
return http:getenv("REQUEST_METHOD") == "POST" and http:formvalue(self:id()) ~= nil
end
function Form:parse(http)
if not self:submitstate(http) then
self.state = M.FORM_NODATA
return
end
Node.parse(self, http)
while self:resolve_depends() do end
for _, s in ipairs(self.children) do
for _, v in ipairs(s.children) do
if v.state == M.FORM_INVALID then
self.state = M.FORM_INVALID
return
end
end
end
self.state = M.FORM_VALID
end
function Form:handle()
if self.state == M.FORM_VALID then
Node.handle(self)
self:write()
end
end
function Form:write()
end
function Form:section(t, ...)
assert(instanceof(t, Section), "class must be a descendent of Section")
local obj = t(...)
self:append(obj)
return obj
end
return M

View File

@ -2,13 +2,9 @@
-- Copyright 2017 Matthias Schiffer <mschiffer@universe-factory.net>
-- Licensed to the public under the Apache License 2.0.
local tonumber = tonumber
local M = {}
module "gluon.web.model.datatypes"
function bool(val)
function M.bool(val)
if val == "1" or val == "yes" or val == "on" or val == "true" then
return true
elseif val == "0" or val == "no" or val == "off" or val == "false" then
@ -32,29 +28,29 @@ local function int(val)
end
end
function uinteger(val)
function M.uinteger(val)
local n = int(val)
return (n ~= nil and n >= 0)
end
function integer(val)
function M.integer(val)
return (int(val) ~= nil)
end
function ufloat(val)
function M.ufloat(val)
local n = dec(val)
return (n ~= nil and n >= 0)
end
function float(val)
function M.float(val)
return (dec(val) ~= nil)
end
function ipaddr(val)
return ip4addr(val) or ip6addr(val)
function M.ipaddr(val)
return M.ip4addr(val) or M.ip6addr(val)
end
function ip4addr(val)
function M.ip4addr(val)
local g = '(%d%d?%d?)'
local v1, v2, v3, v4 = val:match('^'..((g..'%.'):rep(3))..g..'$')
local n1, n2, n3, n4 = tonumber(v1), tonumber(v2), tonumber(v3), tonumber(v4)
@ -69,7 +65,7 @@ function ip4addr(val)
)
end
function ip6addr(val)
function M.ip6addr(val)
local g1 = '%x%x?%x?%x?'
if not val:match('::') then
@ -100,7 +96,7 @@ function ip6addr(val)
return false
end
function wpakey(val)
function M.wpakey(val)
if #val == 64 then
return (val:match("^%x+$") ~= nil)
else
@ -108,11 +104,11 @@ function wpakey(val)
end
end
function range(val, vmin, vmax)
return min(val, vmin) and max(val, vmax)
function M.range(val, vmin, vmax)
return M.min(val, vmin) and M.max(val, vmax)
end
function min(val, min)
function M.min(val, min)
val = dec(val)
min = tonumber(min)
@ -123,7 +119,7 @@ function min(val, min)
return false
end
function max(val, max)
function M.max(val, max)
val = dec(val)
max = tonumber(max)
@ -134,19 +130,19 @@ function max(val, max)
return false
end
function irange(val, vmin, vmax)
return integer(val) and range(val, vmin, vmax)
function M.irange(val, vmin, vmax)
return M.integer(val) and M.range(val, vmin, vmax)
end
function imin(val, vmin)
return integer(val) and min(val, vmin)
function M.imin(val, vmin)
return M.integer(val) and M.min(val, vmin)
end
function imax(val, vmax)
return integer(val) and max(val, vmax)
function M.imax(val, vmax)
return M.integer(val) and M.max(val, vmax)
end
function minlength(val, min)
function M.minlength(val, min)
min = tonumber(min)
if min ~= nil then
@ -156,7 +152,7 @@ function minlength(val, min)
return false
end
function maxlength(val, max)
function M.maxlength(val, max)
max = tonumber(max)
if max ~= nil then
@ -165,3 +161,5 @@ function maxlength(val, max)
return false
end
return M

View File

@ -1,5 +1,3 @@
module('gluon.web.model.osm', package.seeall)
local classes = require 'gluon.web.model.classes'
local util = require "gluon.web.util"
@ -9,7 +7,10 @@ local class = util.class
local DEFAULT_URL = 'https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/v5.2.0'
MapValue = class(classes.AbstractValue)
local M = {}
local MapValue = class(classes.AbstractValue)
M.MapValue = MapValue
function MapValue:__init__(title, options)
classes.AbstractValue.__init__(self, title)
@ -41,3 +42,5 @@ end
function MapValue:validate()
return true
end
return M

View File

@ -2,17 +2,15 @@
-- Copyright 2017 Matthias Schiffer <mschiffer@universe-factory.net>
-- Licensed to the public under the Apache License 2.0.
local string = string
local table = table
local protocol = require "gluon.web.http.protocol"
local util = require "gluon.web.util"
local ipairs, pairs, tostring = ipairs, pairs, tostring
module "gluon.web.http"
local M = {}
local Http = util.class()
M.Http = Http
Http = util.class()
function Http:__init__(env, input, output)
self.input = input
self.output = output
@ -120,3 +118,5 @@ function Http:redirect(url)
self:header("Location", url)
self:close()
end
return M

View File

@ -4,11 +4,8 @@
-- This class contains several functions useful for http message- and content
-- decoding and to retrive form data from raw http messages.
module("gluon.web.http.protocol", package.seeall)
HTTP_MAX_CONTENT = 1024*8 -- 8 kB maximum content size
local M = {}
local function pump(src, snk)
while true do
@ -26,7 +23,7 @@ local function pump(src, snk)
end
end
function urlencode(s)
function M.urlencode(s)
return (string.gsub(s, '[^a-zA-Z0-9%-_%.~]',
function(c)
local ret = ''
@ -41,7 +38,7 @@ function urlencode(s)
end
-- the "+" sign to " " - and return the decoded string.
function urldecode(str, no_plus)
function M.urldecode(str, no_plus)
local function chrdec(hex)
return string.char(tonumber(hex, 16))
@ -75,7 +72,7 @@ end
-- Simple parameters are stored as string values associated with the parameter
-- name within the table. Parameters with multiple values are stored as array
-- containing the corresponding values.
function urldecode_params(url)
function M.urldecode_params(url)
local params = {}
if url:find("?") then
@ -85,8 +82,8 @@ function urldecode_params(url)
for pair in url:gmatch("[^&;]+") do
-- find key and value
local key = urldecode(pair:match("^([^=]+)"))
local val = urldecode(pair:match("^[^=]+=(.+)$"))
local key = M.urldecode(pair:match("^([^=]+)"))
local val = M.urldecode(pair:match("^[^=]+=(.+)$"))
-- store
if key and key:len() > 0 then
@ -110,7 +107,7 @@ end
-- o Table containing decoded (name, file) and raw (headers) mime header data
-- o String value containing a chunk of the file data
-- o Boolean which indicates whether the current chunk is the last one (eof)
function mimedecode_message_body(src, msg, filecb)
local function mimedecode_message_body(src, msg, filecb)
if msg and msg.env.CONTENT_TYPE then
msg.mime_boundary = msg.env.CONTENT_TYPE:match("^multipart/form%-data; boundary=(.+)$")
@ -257,7 +254,7 @@ end
-- This function will examine the Content-Type within the given message object
-- to select the appropriate content decoder.
-- Currently only the multipart/form-data mime type is supported.
function parse_message_body(src, msg, filecb)
function M.parse_message_body(src, msg, filecb)
if not (msg.env.REQUEST_METHOD == "POST" and msg.env.CONTENT_TYPE) then
return
end
@ -266,3 +263,5 @@ function parse_message_body(src, msg, filecb)
return mimedecode_message_body(src, msg, filecb)
end
end
return M

View File

@ -4,10 +4,8 @@
local tparser = require "gluon.web.template.parser"
local getmetatable, setmetatable = getmetatable, setmetatable
local tostring = tostring
module "gluon.web.util"
local M = {}
--
-- Class helper routines
@ -33,14 +31,14 @@ end
-- to the __init__ function of this class - if such a function exists.
-- The __init__ function must be used to set any object parameters that are not shared
-- with other objects of this class. Any return values will be ignored.
function class(base)
function M.class(base)
return setmetatable({}, {
__call = _instantiate,
__index = base
})
end
function instanceof(object, class)
function M.instanceof(object, class)
while object do
if object == class then
return true
@ -56,6 +54,8 @@ end
-- String and data manipulation routines
--
function pcdata(value)
function M.pcdata(value)
return value and tparser.pcdata(tostring(value))
end
return M