File

plugins/mod_http_errors.lua @ 10453:926d6086a95a

net.websocket: Fix traceback in case of ondisconnect being called twice We want to figure out what situations the double ondisconnect happens in, and aim to fix the root cause in the future.
author Matthew Wild <mwild1@gmail.com>
date Tue, 26 Nov 2019 15:29:01 +0000
parent 10430:46dd9df2db0c
child 10574:f70c874b7936
line wrap: on
line source

module:set_global();

local server = require "net.http.server";
local codes = require "net.http.codes";
local xml_escape = require "util.stanza".xml_escape;
local render = require "util.interpolation".new("%b{}", xml_escape);

local show_private = module:get_option_boolean("http_errors_detailed", false);
local always_serve = module:get_option_boolean("http_errors_always_show", true);
local default_message = { module:get_option_string("http_errors_default_message", "That's all I know.") };
local default_messages = {
	[400] = { "What kind of request do you call that??" };
	[403] = { "You're not allowed to do that." };
	[404] = { "Whatever you were looking for is not here. %";
		"Where did you put it?", "It's behind you.", "Keep looking." };
	[500] = { "% Check your error log for more info.";
		"Gremlins.", "It broke.", "Don't look at me." };
};

local messages = setmetatable(module:get_option("http_errors_messages", {}), { __index = default_messages });

local html = [[
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>{title}</title>
<style>
body {
	margin-top : 14%;
	text-align : center;
	background-color : #F8F8F8;
	font-family : sans-serif
}

h1 {
	font-size : xx-large
}

p {
	font-size : x-large
}

p+p {
	font-size : large;
	font-family : courier
}
</style>
</head>
<body>
<h1>{title}</h1>
<p>{message}</p>
<p>{extra?}</p>
</body>
</html>
]];

local function get_page(code, extra)
	local message = messages[code];
	if always_serve or message then
		message = message or default_message;
		return render(html, {
			title = rawget(codes, code) or ("Code "..tostring(code));
			message = message[1]:gsub("%%", function ()
				return message[math.random(2, math.max(#message,2))];
			end);
			extra = extra;
		});
	end
end

module:hook_object_event(server, "http-error", function (event)
	if event.response then
		event.response.headers.content_type = "text/html; charset=utf-8";
	end
	return get_page(event.code, (show_private and event.private_message) or event.message);
end);

module:hook_object_event(server, "http-error", function (event)
	local request, response = event.request, event.response;
	if request and response and request.path == "/" and response.status_code == 404 then
		response.headers.content_type = "text/html; charset=utf-8";
		return render(html, {
				title = "Prosody is running!";
				message = "Welcome to the XMPP world!";
			});
	end
end, 1);