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