Skip to content

Commit 316933f

Browse files
Merge pull request #226 from veqryn/veqryn/marshal-json
Sanitize for metadata should also handler json and []byte
2 parents d8cca0e + f6c5984 commit 316933f

File tree

2 files changed

+81
-10
lines changed

2 files changed

+81
-10
lines changed

v2/metadata.go

+10-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package bugsnag
22

33
import (
44
"encoding"
5+
"encoding/json"
56
"fmt"
67
"reflect"
78
"strings"
@@ -98,7 +99,7 @@ func (s sanitizer) Sanitize(data interface{}) interface{} {
9899
}
99100
}
100101

101-
// Handle certain well known interfaces and types
102+
// Handle certain well known interfaces and types, in preferred order
102103
switch dataT := data.(type) {
103104
case error:
104105
return dataT.Error()
@@ -114,6 +115,14 @@ func (s sanitizer) Sanitize(data interface{}) interface{} {
114115
if b, err := dataT.MarshalText(); err == nil {
115116
return string(b)
116117
}
118+
119+
case json.Marshaler:
120+
if b, err := dataT.MarshalJSON(); err == nil {
121+
return string(b)
122+
}
123+
124+
case []byte:
125+
return string(dataT)
117126
}
118127

119128
switch t.Kind() {

v2/metadata_test.go

+71-9
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package bugsnag
22

33
import (
4+
"encoding/json"
45
stderrors "errors"
56
"reflect"
67
"testing"
@@ -112,13 +113,13 @@ func TestMetadataAddPointer(t *testing.T) {
112113

113114
func TestMetadataAddNil(t *testing.T) {
114115
md := MetaData{}
115-
md.AddStruct("map", map[string]interface{}{
116-
"data": _testStruct{Name: nil},
117-
})
118116

119117
var nilMap map[string]interface{}
120118
md.AddStruct("nilmap", nilMap)
121119

120+
var nilSlice []interface{}
121+
md.AddStruct("nilSlice", nilSlice)
122+
122123
var nilError _testError
123124
md.AddStruct("error", nilError)
124125

@@ -137,20 +138,77 @@ func TestMetadataAddNil(t *testing.T) {
137138
var marshalFullPtr = &_textMarshaller{}
138139
md.AddStruct("marshalFullPtr", marshalFullPtr)
139140

141+
var nullJsonMarshaller json.RawMessage
142+
md.AddStruct("nullJsonMarshaller", nullJsonMarshaller)
143+
144+
var nullJsonMarshallerPtr *json.RawMessage
145+
md.AddStruct("nullJsonMarshallerPtr", nullJsonMarshallerPtr)
146+
147+
var emptyJsonMarshaller = &json.RawMessage{}
148+
md.AddStruct("emptyJsonMarshaller", emptyJsonMarshaller)
149+
150+
var nilBytes []byte
151+
md.AddStruct("nilBytes", nilBytes)
152+
153+
var nilBytesPtr *[]byte
154+
md.AddStruct("nilBytesPtr", nilBytesPtr)
155+
156+
var emptyBytes = []byte{}
157+
md.AddStruct("emptyBytes", emptyBytes)
158+
159+
md.AddStruct("map", map[string]interface{}{
160+
"data": _testStruct{Name: nil},
161+
"nilmap": nilMap,
162+
"nilSlice": nilSlice,
163+
"error": nilError,
164+
"errorNilPtr": nilErrorPtr,
165+
"timeUnset": timeVar,
166+
"durationUnset": duration,
167+
"marshalNilPtr": marshalNilPtr,
168+
"marshalFullPtr": marshalFullPtr,
169+
"nullJsonMarshaller": nullJsonMarshaller,
170+
"nullJsonMarshallerPtr": nullJsonMarshallerPtr,
171+
"emptyJsonMarshaller": emptyJsonMarshaller,
172+
"nilBytes": nilBytes,
173+
"nilBytesPtr": nilBytesPtr,
174+
"emptyBytes": emptyBytes,
175+
})
176+
140177
if !reflect.DeepEqual(md, MetaData{
141178
"map": {
142179
"data": map[string]interface{}{
143180
"Name": "<nil>",
144181
},
182+
"nilmap": map[string]interface{}{},
183+
"nilSlice": []interface{}{},
184+
"error": "errorstr",
185+
"errorNilPtr": "<nil>",
186+
"timeUnset": "0001-01-01T00:00:00Z",
187+
"durationUnset": "0s",
188+
"marshalFullPtr": "marshalled text",
189+
"marshalNilPtr": "<nil>",
190+
"nullJsonMarshaller": "null",
191+
"nullJsonMarshallerPtr": "<nil>",
192+
"emptyJsonMarshaller": "",
193+
"nilBytes": "",
194+
"nilBytesPtr": "<nil>",
195+
"emptyBytes": "",
145196
},
146197
"nilmap": map[string]interface{}{},
147198
"Extra data": {
148-
"error": "errorstr",
149-
"errorNilPtr": "<nil>",
150-
"timeUnset": "0001-01-01T00:00:00Z",
151-
"durationUnset": "0s",
152-
"marshalFullPtr": "marshalled text",
153-
"marshalNilPtr": "<nil>",
199+
"nilSlice": []interface{}{},
200+
"error": "errorstr",
201+
"errorNilPtr": "<nil>",
202+
"timeUnset": "0001-01-01T00:00:00Z",
203+
"durationUnset": "0s",
204+
"marshalFullPtr": "marshalled text",
205+
"marshalNilPtr": "<nil>",
206+
"nullJsonMarshaller": "null",
207+
"nullJsonMarshallerPtr": "<nil>",
208+
"emptyJsonMarshaller": "",
209+
"nilBytes": "",
210+
"nilBytesPtr": "<nil>",
211+
"emptyBytes": "",
154212
},
155213
}) {
156214
t.Errorf("metadata.AddStruct didn't work: %#v", md)
@@ -215,6 +273,8 @@ func TestMetaDataSanitize(t *testing.T) {
215273
"time": time.Date(2023, 12, 5, 23, 59, 59, 123456789, time.UTC),
216274
"duration": 105567462 * time.Millisecond,
217275
"text": _textMarshaller{},
276+
"json": json.RawMessage(`{"json_property": "json_value"}`),
277+
"bytes": []byte(`lots of bytes`),
218278
"array": []hash{{
219279
"creditcard": "1234567812345678",
220280
"broken": broken,
@@ -240,6 +300,8 @@ func TestMetaDataSanitize(t *testing.T) {
240300
"time": "2023-12-05T23:59:59.123456789Z",
241301
"duration": "29h19m27.462s",
242302
"text": "marshalled text",
303+
"json": `{"json_property": "json_value"}`,
304+
"bytes": "lots of bytes",
243305
"array": []interface{}{map[string]interface{}{
244306
"creditcard": "[FILTERED]",
245307
"broken": map[string]interface{}{

0 commit comments

Comments
 (0)