net/http/errors.lua
author Matthew Wild <mwild1@gmail.com>
Wed, 27 Mar 2024 15:35:15 +0000
branch0.12
changeset 13469 54a936345aaa
parent 11229 8c17c08d100e
child 12978 ba409c67353b
permissions -rw-r--r--
prosodyctl check: Warn about invalid domain names in the config file This ensures that domain names of virtual hosts and components are valid in XMPP, and that they are encoded correctly.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
11029
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     1
-- This module returns a table that is suitable for use as a util.error registry,
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     2
-- and a function to return a util.error object given callback 'code' and 'body'
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     3
-- parameters.
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     4
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     5
local codes = require "net.http.codes";
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     6
local util_error = require "util.error";
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     7
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     8
local error_templates = {
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     9
	-- This code is used by us to report a client-side or connection error.
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    10
	-- Instead of using the code, use the supplied body text to get one of
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    11
	-- the more detailed errors below.
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    12
	[0] = {
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    13
		code = 0, type = "cancel", condition = "internal-server-error";
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    14
		text = "Connection or internal error";
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    15
	};
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    16
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    17
	-- These are net.http built-in errors, they are returned in
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    18
	-- the body parameter when code == 0
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    19
	["cancelled"] = {
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    20
		code = 0, type = "cancel", condition = "remote-server-timeout";
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    21
		text = "Request cancelled";
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    22
	};
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    23
	["connection-closed"] = {
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    24
		code = 0, type = "wait", condition = "remote-server-timeout";
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    25
		text = "Connection closed";
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    26
	};
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    27
	["certificate-chain-invalid"] = {
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    28
		code = 0, type = "cancel", condition = "remote-server-timeout";
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    29
		text = "Server certificate not trusted";
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    30
	};
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    31
	["certificate-verify-failed"] = {
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    32
		code = 0, type = "cancel", condition = "remote-server-timeout";
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    33
		text = "Server certificate invalid";
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    34
	};
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    35
	["connection failed"] = {
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    36
		code = 0, type = "cancel", condition = "remote-server-not-found";
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    37
		text = "Connection failed";
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    38
	};
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    39
	["invalid-url"] = {
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    40
		code = 0, type = "modify", condition = "bad-request";
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    41
		text = "Invalid URL";
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    42
	};
11229
8c17c08d100e net.http.errors: Add error class for DNS resolution failures (thanks SouL)
Matthew Wild <mwild1@gmail.com>
parents: 11029
diff changeset
    43
	["unable to resolve service"] = {
8c17c08d100e net.http.errors: Add error class for DNS resolution failures (thanks SouL)
Matthew Wild <mwild1@gmail.com>
parents: 11029
diff changeset
    44
		code = 0, type = "cancel", condition = "remote-server-not-found";
8c17c08d100e net.http.errors: Add error class for DNS resolution failures (thanks SouL)
Matthew Wild <mwild1@gmail.com>
parents: 11029
diff changeset
    45
		text = "DNS resolution failed";
8c17c08d100e net.http.errors: Add error class for DNS resolution failures (thanks SouL)
Matthew Wild <mwild1@gmail.com>
parents: 11029
diff changeset
    46
	};
11029
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    47
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    48
	-- This doesn't attempt to map every single HTTP code (not all have sane mappings),
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    49
	-- but all the common ones should be covered. XEP-0086 was used as reference for
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    50
	-- most of these.
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    51
	[400] = { type = "modify", condition = "bad-request" };
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    52
	[401] = { type = "auth", condition = "not-authorized" };
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    53
	[402] = { type = "auth", condition = "payment-required" };
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    54
	[403] = { type = "auth", condition = "forbidden" };
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    55
	[404] = { type = "cancel", condition = "item-not-found" };
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    56
	[405] = { type = "cancel", condition = "not-allowed" };
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    57
	[406] = { type = "modify", condition = "not-acceptable" };
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    58
	[407] = { type = "auth", condition = "registration-required" };
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    59
	[408] = { type = "wait", condition = "remote-server-timeout" };
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    60
	[409] = { type = "cancel", condition = "conflict" };
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    61
	[410] = { type = "cancel", condition = "gone" };
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    62
	[411] = { type = "modify", condition = "bad-request" };
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    63
	[412] = { type = "cancel", condition = "conflict" };
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    64
	[413] = { type = "modify", condition = "resource-constraint" };
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    65
	[414] = { type = "modify", condition = "resource-constraint" };
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    66
	[415] = { type = "cancel", condition = "feature-not-implemented" };
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    67
	[416] = { type = "modify", condition = "bad-request" };
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    68
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    69
	[422] = { type = "modify", condition = "bad-request" };
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    70
	[423] = { type = "wait", condition = "resource-constraint" };
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    71
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    72
	[429] = { type = "wait", condition = "resource-constraint" };
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    73
	[431] = { type = "modify", condition = "resource-constraint" };
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    74
	[451] = { type = "auth", condition = "forbidden" };
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    75
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    76
	[500] = { type = "wait", condition = "internal-server-error" };
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    77
	[501] = { type = "cancel", condition = "feature-not-implemented" };
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    78
	[502] = { type = "wait", condition = "remote-server-timeout" };
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    79
	[503] = { type = "cancel", condition = "service-unavailable" };
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    80
	[504] = { type = "wait", condition = "remote-server-timeout" };
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    81
	[507] = { type = "wait", condition = "resource-constraint" };
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    82
	[511] = { type = "auth", condition = "not-authorized" };
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    83
};
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    84
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    85
for k, v in pairs(codes) do
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    86
	if error_templates[k] then
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    87
		error_templates[k].code = k;
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    88
		error_templates[k].text = v;
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    89
	else
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    90
		error_templates[k] = { type = "cancel", condition = "undefined-condition", text = v, code = k };
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    91
	end
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    92
end
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    93
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    94
setmetatable(error_templates, {
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    95
	__index = function(_, k)
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    96
		if type(k) ~= "number" then
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    97
			return nil;
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    98
		end
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    99
		return {
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   100
			type = "cancel";
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   101
			condition = "undefined-condition";
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   102
			text = codes[k] or (k.." Unassigned");
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   103
			code = k;
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   104
		};
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   105
	end
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   106
});
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   107
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   108
local function new(code, body, context)
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   109
	if code == 0 then
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   110
		return util_error.new(body, context, error_templates);
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   111
	else
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   112
		return util_error.new(code, context, error_templates);
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   113
	end
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   114
end
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   115
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   116
return {
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   117
	registry = error_templates;
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   118
	new = new;
e47e7185b403 net.http.errors: Add new module for converting net.http errors to util.error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   119
};