aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKim Alvefur <zash@zash.se>2018-02-08 17:35:42 +0100
committerKim Alvefur <zash@zash.se>2018-02-08 17:35:42 +0100
commit880077c1333c8386989a795cb08ef2cd93846f60 (patch)
treea127f737df0be02545230a398cc728487addc6aa
parentbee67a520425b68c7d84581ee7ed7cdd19602c8f (diff)
downloadprosody-880077c1333c8386989a795cb08ef2cd93846f60.tar.gz
prosody-880077c1333c8386989a795cb08ef2cd93846f60.zip
tools: Add a tool to generate net.http.codes from IANA registry
-rw-r--r--tools/http-status-codes.lua43
1 files changed, 43 insertions, 0 deletions
diff --git a/tools/http-status-codes.lua b/tools/http-status-codes.lua
new file mode 100644
index 00000000..39bee74c
--- /dev/null
+++ b/tools/http-status-codes.lua
@@ -0,0 +1,43 @@
+-- Generate net/http/codes.lua from IANA HTTP status code registry
+
+local xml = require "util.xml";
+local registry = xml.parse(io.read("*a"));
+
+io.write([[
+
+local response_codes = {
+ -- Source: http://www.iana.org/assignments/http-status-codes
+]]);
+
+for record in registry:get_child("registry"):childtags("record") do
+ -- Extract values
+ local value = record:get_child_text("value");
+ local description = record:get_child_text("description");
+ local ref = record:get_child_text("xref");
+ local code = tonumber(value);
+
+ -- Space between major groups
+ if code and code % 100 == 0 then
+ io.write("\n");
+ end
+
+ -- Reserved and Unassigned entries should be not be included
+ if description == "Reserved" or description == "Unassigned" or description == "(Unused)" then
+ code = nil;
+ end
+
+ -- Non-empty references become comments
+ if ref and ref:find("%S") then
+ ref = " -- " .. ref;
+ else
+ ref = "";
+ end
+
+ io.write((code and "\t[%d] = %q;%s\n" or "\t-- [%s] = %q;%s\n"):format(code or value, description, ref));
+end
+
+io.write([[};
+
+for k,v in pairs(response_codes) do response_codes[k] = k.." "..v; end
+return setmetatable(response_codes, { __index = function(_, k) return k.." Unassigned"; end })
+]]);