mod_websocket: Fire pre-session-close event (fixes #1800)
This event was added in a7c183bb4e64 and is required to make mod_smacks know
that a session was intentionally closed and shouldn't be hibernated (see
fcea4d9e7502).
Because this was missing from mod_websocket's session.close(), mod_smacks
would always attempt to hibernate websocket sessions even if they closed
cleanly.
That mod_websocket has its own copy of session.close() is something to fix
another day (probably not in the stable branch). So for now this commit makes
the minimal change to get things working again.
Thanks to Damian and the Jitsi team for reporting.
-- This file is generated from teal-src/util/jsonschema.lua
local m_type = function(n)
return type(n) == "number" and n % 1 == 0 and n <= 9007199254740992 and n >= -9007199254740992 and "integer" or "float";
end;
local json = require("util.json")
local null = json.null;
local pointer = require("util.jsonpointer")
local json_type_name = json.json_type_name
local schema_t = {}
local json_schema_object = { xml_t = {} }
local function simple_validate(schema, data)
if schema == nil then
return true
elseif schema == "object" and type(data) == "table" then
return type(data) == "table" and (next(data) == nil or type((next(data, nil))) == "string")
elseif schema == "array" and type(data) == "table" then
return type(data) == "table" and (next(data) == nil or type((next(data, nil))) == "number")
elseif schema == "integer" then
return m_type(data) == schema
elseif schema == "null" then
return data == null
elseif type(schema) == "table" then
for _, one in ipairs(schema) do
if simple_validate(one, data) then
return true
end
end
return false
else
return type(data) == schema
end
end
local complex_validate
local function validate(schema, data, root)
if type(schema) == "boolean" then
return schema
else
return complex_validate(schema, data, root)
end
end
function complex_validate(schema, data, root)
if root == nil then
root = schema
end
if schema["$ref"] and schema["$ref"]:sub(1, 1) == "#" then
local referenced = pointer.resolve(root, schema["$ref"]:sub(2))
if referenced ~= nil and referenced ~= root and referenced ~= schema then
if not validate(referenced, data, root) then
return false
end
end
end
if not simple_validate(schema.type, data) then
return false
end
if schema.type == "object" then
if type(data) == "table" then
for k in pairs(data) do
if not (type(k) == "string") then
return false
end
end
end
end
if schema.type == "array" then
if type(data) == "table" then
for i in pairs(data) do
if not (m_type(i) == "integer") then
return false
end
end
end
end
if schema["enum"] ~= nil then
local match = false
for _, v in ipairs(schema["enum"]) do
if v == data then
match = true
break
end
end
if not match then
return false
end
end
if type(data) == "string" then
if schema.maxLength and #data > schema.maxLength then
return false
end
if schema.minLength and #data < schema.minLength then
return false
end
end
if type(data) == "number" then
if schema.multipleOf and (data == 0 or data % schema.multipleOf ~= 0) then
return false
end
if schema.maximum and not (data <= schema.maximum) then
return false
end
if schema.exclusiveMaximum and not (data < schema.exclusiveMaximum) then
return false
end
if schema.minimum and not (data >= schema.minimum) then
return false
end
if schema.exclusiveMinimum and not (data > schema.exclusiveMinimum) then
return false
end
end
if schema.allOf then
for _, sub in ipairs(schema.allOf) do
if not validate(sub, data, root) then
return false
end
end
end
if schema.oneOf then
local valid = 0
for _, sub in ipairs(schema.oneOf) do
if validate(sub, data, root) then
valid = valid + 1
end
end
if valid ~= 1 then
return false
end
end
if schema.anyOf then
local match = false
for _, sub in ipairs(schema.anyOf) do
if validate(sub, data, root) then
match = true
break
end
end
if not match then
return false
end
end
if schema["not"] then
if validate(schema["not"], data, root) then
return false
end
end
if schema["if"] ~= nil then
if validate(schema["if"], data, root) then
if schema["then"] then
return validate(schema["then"], data, root)
end
else
if schema["else"] then
return validate(schema["else"], data, root)
end
end
end
if schema.const ~= nil and schema.const ~= data then
return false
end
if type(data) == "table" then
if schema.maxItems and #data > schema.maxItems then
return false
end
if schema.minItems and #data < schema.minItems then
return false
end
if schema.required then
for _, k in ipairs(schema.required) do
if data[k] == nil then
return false
end
end
end
if schema.propertyNames ~= nil then
for k in pairs(data) do
if not validate(schema.propertyNames, k, root) then
return false
end
end
end
if schema.properties then
for k, sub in pairs(schema.properties) do
if data[k] ~= nil and not validate(sub, data[k], root) then
return false
end
end
end
if schema.additionalProperties ~= nil then
for k, v in pairs(data) do
if schema.properties == nil or schema.properties[k] == nil then
if not validate(schema.additionalProperties, v, root) then
return false
end
end
end
end
if schema.uniqueItems then
local values = {}
for _, v in pairs(data) do
if values[v] then
return false
end
values[v] = true
end
end
local p = 0
if schema.prefixItems ~= nil then
for i, s in ipairs(schema.prefixItems) do
if data[i] == nil then
break
elseif validate(s, data[i], root) then
p = i
else
return false
end
end
end
if schema.items ~= nil then
for i = p + 1, #data do
if not validate(schema.items, data[i], root) then
return false
end
end
end
if schema.contains ~= nil then
local found = false
for i = 1, #data do
if validate(schema.contains, data[i], root) then
found = true
break
end
end
if not found then
return false
end
end
end
return true
end
json_schema_object.validate = validate;
return json_schema_object