Skip to content

Commit d269405

Browse files
core: Show JSON error offsets where possible (#7437)
1 parent e40bd01 commit d269405

File tree

4 files changed

+18
-4
lines changed

4 files changed

+18
-4
lines changed

admin.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1110,7 +1110,10 @@ func unsyncedConfigAccess(method, path string, body []byte, out io.Writer) error
11101110
if len(body) > 0 {
11111111
err = json.Unmarshal(body, &val)
11121112
if err != nil {
1113-
return fmt.Errorf("decoding request body: %v", err)
1113+
if jsonErr, ok := err.(*json.SyntaxError); ok {
1114+
return fmt.Errorf("decoding request body: %w, at offset %d", jsonErr, jsonErr.Offset)
1115+
}
1116+
return fmt.Errorf("decoding request body: %w", err)
11141117
}
11151118
}
11161119

caddyconfig/configadapters.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,11 @@ func JSONModuleObject(val any, fieldName, fieldVal string, warnings *[]Warning)
8181
err = json.Unmarshal(enc, &tmp)
8282
if err != nil {
8383
if warnings != nil {
84-
*warnings = append(*warnings, Warning{Message: err.Error()})
84+
message := err.Error()
85+
if jsonErr, ok := err.(*json.SyntaxError); ok {
86+
message = fmt.Sprintf("%v, at offset %d", jsonErr.Error(), jsonErr.Offset)
87+
}
88+
*warnings = append(*warnings, Warning{Message: message})
8589
}
8690
return nil
8791
}

cmd/main.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,10 @@ func loadConfigWithLogger(logger *zap.Logger, configFile, adapterName string) ([
231231
// validate that the config is at least valid JSON
232232
err = json.Unmarshal(config, new(any))
233233
if err != nil {
234-
return nil, "", "", fmt.Errorf("config is not valid JSON: %v; did you mean to use a config adapter (the --adapter flag)?", err)
234+
if jsonErr, ok := err.(*json.SyntaxError); ok {
235+
return nil, "", "", fmt.Errorf("config is not valid JSON: %w, at offset %d; did you mean to use a config adapter (the --adapter flag)?", err, jsonErr.Offset)
236+
}
237+
return nil, "", "", fmt.Errorf("config is not valid JSON: %w; did you mean to use a config adapter (the --adapter flag)?", err)
235238
}
236239
}
237240

modules.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,11 @@ func ParseStructTag(tag string) (map[string]string, error) {
342342
func StrictUnmarshalJSON(data []byte, v any) error {
343343
dec := json.NewDecoder(bytes.NewReader(data))
344344
dec.DisallowUnknownFields()
345-
return dec.Decode(v)
345+
err := dec.Decode(v)
346+
if jsonErr, ok := err.(*json.SyntaxError); ok {
347+
return fmt.Errorf("%w, at offset %d", jsonErr, jsonErr.Offset)
348+
}
349+
return err
346350
}
347351

348352
var JSONRawMessageType = reflect.TypeFor[json.RawMessage]()

0 commit comments

Comments
 (0)