Software /
code /
prosody
Annotate
util/error.lua @ 11098:5b778ec095f0
util.error: Expose source and registry as fields on the registry object
For access, e.g. to identify and compare errors later
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Mon, 28 Sep 2020 19:26:48 +0200 |
parent | 11095:1ea3574b19c8 |
child | 11100:3aa06cdd2dc8 |
rev | line source |
---|---|
11075
d8fad2b48b05
util.error: Add unique 'instance_id' to error objects
Matthew Wild <mwild1@gmail.com>
parents:
11054
diff
changeset
|
1 local id = require "util.id"; |
11051
08539aa129ee
util.error: Add configuration for including traceback in tostring()
Matthew Wild <mwild1@gmail.com>
parents:
11050
diff
changeset
|
2 |
08539aa129ee
util.error: Add configuration for including traceback in tostring()
Matthew Wild <mwild1@gmail.com>
parents:
11050
diff
changeset
|
3 -- Library configuration (see configure()) |
08539aa129ee
util.error: Add configuration for including traceback in tostring()
Matthew Wild <mwild1@gmail.com>
parents:
11050
diff
changeset
|
4 local auto_inject_traceback = false; |
08539aa129ee
util.error: Add configuration for including traceback in tostring()
Matthew Wild <mwild1@gmail.com>
parents:
11050
diff
changeset
|
5 local display_tracebacks = false; |
08539aa129ee
util.error: Add configuration for including traceback in tostring()
Matthew Wild <mwild1@gmail.com>
parents:
11050
diff
changeset
|
6 |
08539aa129ee
util.error: Add configuration for including traceback in tostring()
Matthew Wild <mwild1@gmail.com>
parents:
11050
diff
changeset
|
7 |
9746
848fd204708c
util.error: Add new util library for structured errors
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
8 local error_mt = { __name = "error" }; |
848fd204708c
util.error: Add new util library for structured errors
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
9 |
848fd204708c
util.error: Add new util library for structured errors
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
10 function error_mt:__tostring() |
11051
08539aa129ee
util.error: Add configuration for including traceback in tostring()
Matthew Wild <mwild1@gmail.com>
parents:
11050
diff
changeset
|
11 if display_tracebacks and self.context.traceback then |
08539aa129ee
util.error: Add configuration for including traceback in tostring()
Matthew Wild <mwild1@gmail.com>
parents:
11050
diff
changeset
|
12 return ("error<%s:%s:%s:%s>"):format(self.type, self.condition, self.text or "", self.context.traceback); |
08539aa129ee
util.error: Add configuration for including traceback in tostring()
Matthew Wild <mwild1@gmail.com>
parents:
11050
diff
changeset
|
13 end |
10069
6f317e51544d
util.error: Fix traceback due to missing text field
Kim Alvefur <zash@zash.se>
parents:
9749
diff
changeset
|
14 return ("error<%s:%s:%s>"):format(self.type, self.condition, self.text or ""); |
9746
848fd204708c
util.error: Add new util library for structured errors
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
15 end |
848fd204708c
util.error: Add new util library for structured errors
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
16 |
848fd204708c
util.error: Add new util library for structured errors
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
17 local function is_err(e) |
848fd204708c
util.error: Add new util library for structured errors
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
18 return getmetatable(e) == error_mt; |
848fd204708c
util.error: Add new util library for structured errors
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
19 end |
848fd204708c
util.error: Add new util library for structured errors
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
20 |
11050
51be24b16e8a
util.error: Allow optional tracebacks to be injected on errors
Matthew Wild <mwild1@gmail.com>
parents:
10501
diff
changeset
|
21 local function configure(opt) |
11051
08539aa129ee
util.error: Add configuration for including traceback in tostring()
Matthew Wild <mwild1@gmail.com>
parents:
11050
diff
changeset
|
22 if opt.display_tracebacks ~= nil then |
08539aa129ee
util.error: Add configuration for including traceback in tostring()
Matthew Wild <mwild1@gmail.com>
parents:
11050
diff
changeset
|
23 display_tracebacks = opt.display_tracebacks; |
08539aa129ee
util.error: Add configuration for including traceback in tostring()
Matthew Wild <mwild1@gmail.com>
parents:
11050
diff
changeset
|
24 end |
11050
51be24b16e8a
util.error: Allow optional tracebacks to be injected on errors
Matthew Wild <mwild1@gmail.com>
parents:
10501
diff
changeset
|
25 if opt.auto_inject_traceback ~= nil then |
51be24b16e8a
util.error: Allow optional tracebacks to be injected on errors
Matthew Wild <mwild1@gmail.com>
parents:
10501
diff
changeset
|
26 auto_inject_traceback = opt.auto_inject_traceback; |
51be24b16e8a
util.error: Allow optional tracebacks to be injected on errors
Matthew Wild <mwild1@gmail.com>
parents:
10501
diff
changeset
|
27 end |
51be24b16e8a
util.error: Allow optional tracebacks to be injected on errors
Matthew Wild <mwild1@gmail.com>
parents:
10501
diff
changeset
|
28 end |
51be24b16e8a
util.error: Allow optional tracebacks to be injected on errors
Matthew Wild <mwild1@gmail.com>
parents:
10501
diff
changeset
|
29 |
10493
d9132e7412b8
util.error: Write down some thoughts in comments
Kim Alvefur <zash@zash.se>
parents:
10365
diff
changeset
|
30 -- Do we want any more well-known fields? |
d9132e7412b8
util.error: Write down some thoughts in comments
Kim Alvefur <zash@zash.se>
parents:
10365
diff
changeset
|
31 -- Or could we just copy all fields from `e`? |
d9132e7412b8
util.error: Write down some thoughts in comments
Kim Alvefur <zash@zash.se>
parents:
10365
diff
changeset
|
32 -- Sometimes you want variable details in the `text`, how to handle that? |
d9132e7412b8
util.error: Write down some thoughts in comments
Kim Alvefur <zash@zash.se>
parents:
10365
diff
changeset
|
33 -- Translations? |
d9132e7412b8
util.error: Write down some thoughts in comments
Kim Alvefur <zash@zash.se>
parents:
10365
diff
changeset
|
34 -- Should the `type` be restricted to the stanza error types or free-form? |
d9132e7412b8
util.error: Write down some thoughts in comments
Kim Alvefur <zash@zash.se>
parents:
10365
diff
changeset
|
35 -- What to set `type` to for stream errors or SASL errors? Those don't have a 'type' attr. |
d9132e7412b8
util.error: Write down some thoughts in comments
Kim Alvefur <zash@zash.se>
parents:
10365
diff
changeset
|
36 |
11053
04ad9555c799
util.error: Add a 'source' parameter where origin module can be mentioned
Kim Alvefur <zash@zash.se>
parents:
11051
diff
changeset
|
37 local function new(e, context, registry, source) |
11080
ba77c142c9b1
util.error: Simplify error creation flow
Matthew Wild <mwild1@gmail.com>
parents:
11079
diff
changeset
|
38 local template = registry and registry[e]; |
ba77c142c9b1
util.error: Simplify error creation flow
Matthew Wild <mwild1@gmail.com>
parents:
11079
diff
changeset
|
39 if not template then |
ba77c142c9b1
util.error: Simplify error creation flow
Matthew Wild <mwild1@gmail.com>
parents:
11079
diff
changeset
|
40 if type(e) == "table" then |
ba77c142c9b1
util.error: Simplify error creation flow
Matthew Wild <mwild1@gmail.com>
parents:
11079
diff
changeset
|
41 template = { |
ba77c142c9b1
util.error: Simplify error creation flow
Matthew Wild <mwild1@gmail.com>
parents:
11079
diff
changeset
|
42 code = e.code; |
ba77c142c9b1
util.error: Simplify error creation flow
Matthew Wild <mwild1@gmail.com>
parents:
11079
diff
changeset
|
43 type = e.type; |
ba77c142c9b1
util.error: Simplify error creation flow
Matthew Wild <mwild1@gmail.com>
parents:
11079
diff
changeset
|
44 condition = e.condition; |
ba77c142c9b1
util.error: Simplify error creation flow
Matthew Wild <mwild1@gmail.com>
parents:
11079
diff
changeset
|
45 text = e.text; |
11081
0b68697450c5
util.error: Add well-known field 'extra'
Kim Alvefur <zash@zash.se>
parents:
11080
diff
changeset
|
46 extra = e.extra; |
11080
ba77c142c9b1
util.error: Simplify error creation flow
Matthew Wild <mwild1@gmail.com>
parents:
11079
diff
changeset
|
47 }; |
ba77c142c9b1
util.error: Simplify error creation flow
Matthew Wild <mwild1@gmail.com>
parents:
11079
diff
changeset
|
48 else |
ba77c142c9b1
util.error: Simplify error creation flow
Matthew Wild <mwild1@gmail.com>
parents:
11079
diff
changeset
|
49 template = {}; |
ba77c142c9b1
util.error: Simplify error creation flow
Matthew Wild <mwild1@gmail.com>
parents:
11079
diff
changeset
|
50 end |
ba77c142c9b1
util.error: Simplify error creation flow
Matthew Wild <mwild1@gmail.com>
parents:
11079
diff
changeset
|
51 end |
11076
505c3e5907a5
util.error: Simplify error creation - remove ability to set context from templates, and remove default context
Matthew Wild <mwild1@gmail.com>
parents:
11075
diff
changeset
|
52 context = context or {}; |
11050
51be24b16e8a
util.error: Allow optional tracebacks to be injected on errors
Matthew Wild <mwild1@gmail.com>
parents:
10501
diff
changeset
|
53 |
51be24b16e8a
util.error: Allow optional tracebacks to be injected on errors
Matthew Wild <mwild1@gmail.com>
parents:
10501
diff
changeset
|
54 if auto_inject_traceback then |
51be24b16e8a
util.error: Allow optional tracebacks to be injected on errors
Matthew Wild <mwild1@gmail.com>
parents:
10501
diff
changeset
|
55 context.traceback = debug.traceback("error stack", 2); |
51be24b16e8a
util.error: Allow optional tracebacks to be injected on errors
Matthew Wild <mwild1@gmail.com>
parents:
10501
diff
changeset
|
56 end |
51be24b16e8a
util.error: Allow optional tracebacks to be injected on errors
Matthew Wild <mwild1@gmail.com>
parents:
10501
diff
changeset
|
57 |
11077
8ea430de5fd3
util.error: Minor tweaks to error creation code to prepare for future changes
Matthew Wild <mwild1@gmail.com>
parents:
11076
diff
changeset
|
58 local error_instance = setmetatable({ |
11075
d8fad2b48b05
util.error: Add unique 'instance_id' to error objects
Matthew Wild <mwild1@gmail.com>
parents:
11054
diff
changeset
|
59 instance_id = id.short(); |
11077
8ea430de5fd3
util.error: Minor tweaks to error creation code to prepare for future changes
Matthew Wild <mwild1@gmail.com>
parents:
11076
diff
changeset
|
60 |
9746
848fd204708c
util.error: Add new util library for structured errors
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
61 type = template.type or "cancel"; |
848fd204708c
util.error: Add new util library for structured errors
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
62 condition = template.condition or "undefined-condition"; |
848fd204708c
util.error: Add new util library for structured errors
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
63 text = template.text; |
10501
e8186aba1583
util.error: Move default for numeric error code to net.http.server
Kim Alvefur <zash@zash.se>
parents:
10493
diff
changeset
|
64 code = template.code; |
11081
0b68697450c5
util.error: Add well-known field 'extra'
Kim Alvefur <zash@zash.se>
parents:
11080
diff
changeset
|
65 extra = template.extra; |
9746
848fd204708c
util.error: Add new util library for structured errors
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
66 |
11077
8ea430de5fd3
util.error: Minor tweaks to error creation code to prepare for future changes
Matthew Wild <mwild1@gmail.com>
parents:
11076
diff
changeset
|
67 context = context; |
11053
04ad9555c799
util.error: Add a 'source' parameter where origin module can be mentioned
Kim Alvefur <zash@zash.se>
parents:
11051
diff
changeset
|
68 source = source; |
9746
848fd204708c
util.error: Add new util library for structured errors
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
69 }, error_mt); |
11077
8ea430de5fd3
util.error: Minor tweaks to error creation code to prepare for future changes
Matthew Wild <mwild1@gmail.com>
parents:
11076
diff
changeset
|
70 |
8ea430de5fd3
util.error: Minor tweaks to error creation code to prepare for future changes
Matthew Wild <mwild1@gmail.com>
parents:
11076
diff
changeset
|
71 return error_instance; |
9746
848fd204708c
util.error: Add new util library for structured errors
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
72 end |
848fd204708c
util.error: Add new util library for structured errors
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
73 |
11054
ad07152d7bde
util.error: Add a wrapper for common parameters
Kim Alvefur <zash@zash.se>
parents:
11053
diff
changeset
|
74 local function init(source, registry) |
11078
fb3aec3dbe21
util.error: Have init() return an object to allow API extensibility via additional methods
Matthew Wild <mwild1@gmail.com>
parents:
11077
diff
changeset
|
75 return { |
11098
5b778ec095f0
util.error: Expose source and registry as fields on the registry object
Kim Alvefur <zash@zash.se>
parents:
11095
diff
changeset
|
76 source = source; |
5b778ec095f0
util.error: Expose source and registry as fields on the registry object
Kim Alvefur <zash@zash.se>
parents:
11095
diff
changeset
|
77 registry = registry; |
11078
fb3aec3dbe21
util.error: Have init() return an object to allow API extensibility via additional methods
Matthew Wild <mwild1@gmail.com>
parents:
11077
diff
changeset
|
78 new = function (e, context) |
fb3aec3dbe21
util.error: Have init() return an object to allow API extensibility via additional methods
Matthew Wild <mwild1@gmail.com>
parents:
11077
diff
changeset
|
79 return new(e, context, registry, source); |
fb3aec3dbe21
util.error: Have init() return an object to allow API extensibility via additional methods
Matthew Wild <mwild1@gmail.com>
parents:
11077
diff
changeset
|
80 end; |
fb3aec3dbe21
util.error: Have init() return an object to allow API extensibility via additional methods
Matthew Wild <mwild1@gmail.com>
parents:
11077
diff
changeset
|
81 }; |
11054
ad07152d7bde
util.error: Add a wrapper for common parameters
Kim Alvefur <zash@zash.se>
parents:
11053
diff
changeset
|
82 end |
ad07152d7bde
util.error: Add a wrapper for common parameters
Kim Alvefur <zash@zash.se>
parents:
11053
diff
changeset
|
83 |
9746
848fd204708c
util.error: Add new util library for structured errors
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
84 local function coerce(ok, err, ...) |
848fd204708c
util.error: Add new util library for structured errors
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
85 if ok or is_err(err) then |
848fd204708c
util.error: Add new util library for structured errors
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
86 return ok, err, ...; |
848fd204708c
util.error: Add new util library for structured errors
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
87 end |
848fd204708c
util.error: Add new util library for structured errors
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
88 |
11079
1e5a0e0469de
util.error: Switch coerce() to use new() and change 'native' to context field 'wrapped_error'
Matthew Wild <mwild1@gmail.com>
parents:
11078
diff
changeset
|
89 local new_err = new({ |
1e5a0e0469de
util.error: Switch coerce() to use new() and change 'native' to context field 'wrapped_error'
Matthew Wild <mwild1@gmail.com>
parents:
11078
diff
changeset
|
90 type = "cancel", condition = "undefined-condition" |
1e5a0e0469de
util.error: Switch coerce() to use new() and change 'native' to context field 'wrapped_error'
Matthew Wild <mwild1@gmail.com>
parents:
11078
diff
changeset
|
91 }, { wrapped_error = err }); |
9746
848fd204708c
util.error: Add new util library for structured errors
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
92 |
848fd204708c
util.error: Add new util library for structured errors
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
93 return ok, new_err, ...; |
848fd204708c
util.error: Add new util library for structured errors
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
94 end |
848fd204708c
util.error: Add new util library for structured errors
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
95 |
11094
03fdf41fd948
util.error: Pass converted stanza errors throguh new()
Kim Alvefur <zash@zash.se>
parents:
11092
diff
changeset
|
96 local function from_stanza(stanza, context, source) |
11092
bd13aa89262d
util.error: Collect Application-Specific Conditions from stanza errors
Kim Alvefur <zash@zash.se>
parents:
11091
diff
changeset
|
97 local error_type, condition, text, extra_tag = stanza:get_error(); |
11089
35d2260644d9
util.error: Extract error originator from stanza errors
Kim Alvefur <zash@zash.se>
parents:
11081
diff
changeset
|
98 local error_tag = stanza:get_child("error"); |
35d2260644d9
util.error: Extract error originator from stanza errors
Kim Alvefur <zash@zash.se>
parents:
11081
diff
changeset
|
99 context = context or {}; |
35d2260644d9
util.error: Extract error originator from stanza errors
Kim Alvefur <zash@zash.se>
parents:
11081
diff
changeset
|
100 context.stanza = stanza; |
11090
33b6fbdcec88
util.error: Default error originator to stanza sender
Kim Alvefur <zash@zash.se>
parents:
11089
diff
changeset
|
101 context.by = error_tag.attr.by or stanza.attr.from; |
33b6fbdcec88
util.error: Default error originator to stanza sender
Kim Alvefur <zash@zash.se>
parents:
11089
diff
changeset
|
102 |
11095
1ea3574b19c8
util.error: Turns out <gone> wasn't alone, there's also <redirect>
Kim Alvefur <zash@zash.se>
parents:
11094
diff
changeset
|
103 local uri; |
1ea3574b19c8
util.error: Turns out <gone> wasn't alone, there's also <redirect>
Kim Alvefur <zash@zash.se>
parents:
11094
diff
changeset
|
104 if condition == "gone" or condition == "redirect" then |
1ea3574b19c8
util.error: Turns out <gone> wasn't alone, there's also <redirect>
Kim Alvefur <zash@zash.se>
parents:
11094
diff
changeset
|
105 uri = error_tag:get_child_text(condition, "urn:ietf:params:xml:ns:xmpp-stanzas"); |
1ea3574b19c8
util.error: Turns out <gone> wasn't alone, there's also <redirect>
Kim Alvefur <zash@zash.se>
parents:
11094
diff
changeset
|
106 end |
1ea3574b19c8
util.error: Turns out <gone> wasn't alone, there's also <redirect>
Kim Alvefur <zash@zash.se>
parents:
11094
diff
changeset
|
107 |
11094
03fdf41fd948
util.error: Pass converted stanza errors throguh new()
Kim Alvefur <zash@zash.se>
parents:
11092
diff
changeset
|
108 return new({ |
9749
9361bd1b9c9b
util.error: Add a function for creating an error object from an error stanza
Kim Alvefur <zash@zash.se>
parents:
9746
diff
changeset
|
109 type = error_type or "cancel"; |
9361bd1b9c9b
util.error: Add a function for creating an error object from an error stanza
Kim Alvefur <zash@zash.se>
parents:
9746
diff
changeset
|
110 condition = condition or "undefined-condition"; |
9361bd1b9c9b
util.error: Add a function for creating an error object from an error stanza
Kim Alvefur <zash@zash.se>
parents:
9746
diff
changeset
|
111 text = text; |
11095
1ea3574b19c8
util.error: Turns out <gone> wasn't alone, there's also <redirect>
Kim Alvefur <zash@zash.se>
parents:
11094
diff
changeset
|
112 extra = (extra_tag or uri) and { |
1ea3574b19c8
util.error: Turns out <gone> wasn't alone, there's also <redirect>
Kim Alvefur <zash@zash.se>
parents:
11094
diff
changeset
|
113 uri = uri; |
11092
bd13aa89262d
util.error: Collect Application-Specific Conditions from stanza errors
Kim Alvefur <zash@zash.se>
parents:
11091
diff
changeset
|
114 tag = extra_tag; |
11091
4b4b5188492f
util.error: Add special case handling of <gone> with an URI
Kim Alvefur <zash@zash.se>
parents:
11090
diff
changeset
|
115 } or nil; |
11094
03fdf41fd948
util.error: Pass converted stanza errors throguh new()
Kim Alvefur <zash@zash.se>
parents:
11092
diff
changeset
|
116 }, context, nil, source); |
9749
9361bd1b9c9b
util.error: Add a function for creating an error object from an error stanza
Kim Alvefur <zash@zash.se>
parents:
9746
diff
changeset
|
117 end |
9361bd1b9c9b
util.error: Add a function for creating an error object from an error stanza
Kim Alvefur <zash@zash.se>
parents:
9746
diff
changeset
|
118 |
9746
848fd204708c
util.error: Add new util library for structured errors
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
119 return { |
848fd204708c
util.error: Add new util library for structured errors
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
120 new = new; |
11054
ad07152d7bde
util.error: Add a wrapper for common parameters
Kim Alvefur <zash@zash.se>
parents:
11053
diff
changeset
|
121 init = init; |
9746
848fd204708c
util.error: Add new util library for structured errors
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
122 coerce = coerce; |
848fd204708c
util.error: Add new util library for structured errors
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
123 is_err = is_err; |
9749
9361bd1b9c9b
util.error: Add a function for creating an error object from an error stanza
Kim Alvefur <zash@zash.se>
parents:
9746
diff
changeset
|
124 from_stanza = from_stanza; |
11050
51be24b16e8a
util.error: Allow optional tracebacks to be injected on errors
Matthew Wild <mwild1@gmail.com>
parents:
10501
diff
changeset
|
125 configure = configure; |
9746
848fd204708c
util.error: Add new util library for structured errors
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
126 } |