Diff

plugins/mod_http_errors.lua @ 8366:272ff3ab25f3

Merge 0.10->trunk
author Kim Alvefur <zash@zash.se>
date Sun, 29 Oct 2017 02:05:19 +0200
parent 8364:f91ab40a3105
child 9760:88640b3ea6b8
line wrap: on
line diff
--- a/plugins/mod_http_errors.lua	Wed Oct 25 21:59:33 2017 +0200
+++ b/plugins/mod_http_errors.lua	Sun Oct 29 02:05:19 2017 +0200
@@ -2,6 +2,8 @@
 
 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);
@@ -21,56 +23,52 @@
 <!DOCTYPE html>
 <html>
 <head>
-	<meta charset="utf-8">
-	<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>
+<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>
+<h1>{title}</h1>
+<p>{message}</p>
+<p>{extra?}</p>
 </body>
 </html>
 ]];
-html = html:gsub("%s%s+", "");
-
-local entities = {
-	["<"] = "&lt;", [">"] = "&gt;", ["&"] = "&amp;",
-	["'"] = "&apos;", ["\""] = "&quot;", ["\n"] = "<br/>",
-};
-
-local function tohtml(plain)
-	return (plain:gsub("[<>&'\"\n]", entities));
-
-end
 
 local function get_page(code, extra)
 	local message = messages[code];
 	if always_serve or message then
 		message = message or default_message;
-		return (html:gsub("$(%a+)", {
+		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 = tohtml(extra or "");
-		}));
+			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);