From 4b422f9e4ca4e47db01f65e2150306f4ed90ab53 Mon Sep 17 00:00:00 2001 From: Alexander Yastrebov Date: Wed, 13 Jan 2021 00:46:23 +0100 Subject: [PATCH] Uses offset instead of line number in JSONSyntaxError --- .../k8s.io/apimachinery/pkg/util/yaml/BUILD | 1 - .../apimachinery/pkg/util/yaml/decoder.go | 36 +++++-------------- .../pkg/util/yaml/decoder_test.go | 5 +-- 3 files changed, 11 insertions(+), 31 deletions(-) diff --git a/staging/src/k8s.io/apimachinery/pkg/util/yaml/BUILD b/staging/src/k8s.io/apimachinery/pkg/util/yaml/BUILD index cb3c98e6f21..9488fdcf1a2 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/yaml/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/util/yaml/BUILD @@ -19,7 +19,6 @@ go_library( importpath = "k8s.io/apimachinery/pkg/util/yaml", deps = [ "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", "//vendor/sigs.k8s.io/yaml:go_default_library", ], ) diff --git a/staging/src/k8s.io/apimachinery/pkg/util/yaml/decoder.go b/staging/src/k8s.io/apimachinery/pkg/util/yaml/decoder.go index 7fe70646770..5b218c98ebe 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/yaml/decoder.go +++ b/staging/src/k8s.io/apimachinery/pkg/util/yaml/decoder.go @@ -22,13 +22,11 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "strings" "unicode" jsonutil "k8s.io/apimachinery/pkg/util/json" - "k8s.io/klog/v2" "sigs.k8s.io/yaml" ) @@ -215,16 +213,15 @@ type YAMLOrJSONDecoder struct { bufferSize int decoder decoder - rawData []byte } type JSONSyntaxError struct { - Line int - Err error + Offset int64 + Err error } func (e JSONSyntaxError) Error() string { - return fmt.Sprintf("json: line %d: %s", e.Line, e.Err.Error()) + return fmt.Sprintf("json: offset %d: %s", e.Offset, e.Err.Error()) } type YAMLSyntaxError struct { @@ -250,35 +247,18 @@ func NewYAMLOrJSONDecoder(r io.Reader, bufferSize int) *YAMLOrJSONDecoder { // provide object, or returns an error. func (d *YAMLOrJSONDecoder) Decode(into interface{}) error { if d.decoder == nil { - buffer, origData, isJSON := GuessJSONStream(d.r, d.bufferSize) + buffer, _, isJSON := GuessJSONStream(d.r, d.bufferSize) if isJSON { d.decoder = json.NewDecoder(buffer) - d.rawData = origData } else { d.decoder = NewYAMLToJSONDecoder(buffer) } } err := d.decoder.Decode(into) - if jsonDecoder, ok := d.decoder.(*json.Decoder); ok { - if syntax, ok := err.(*json.SyntaxError); ok { - data, readErr := ioutil.ReadAll(jsonDecoder.Buffered()) - if readErr != nil { - klog.V(4).Infof("reading stream failed: %v", readErr) - } - js := string(data) - - // if contents from io.Reader are not complete, - // use the original raw data to prevent panic - if int64(len(js)) <= syntax.Offset { - js = string(d.rawData) - } - - start := strings.LastIndex(js[:syntax.Offset], "\n") + 1 - line := strings.Count(js[:start], "\n") - return JSONSyntaxError{ - Line: line, - Err: fmt.Errorf(syntax.Error()), - } + if syntax, ok := err.(*json.SyntaxError); ok { + return JSONSyntaxError{ + Offset: syntax.Offset, + Err: syntax, } } return err diff --git a/staging/src/k8s.io/apimachinery/pkg/util/yaml/decoder_test.go b/staging/src/k8s.io/apimachinery/pkg/util/yaml/decoder_test.go index 1f4b158f968..fbbba51fcc7 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/yaml/decoder_test.go +++ b/staging/src/k8s.io/apimachinery/pkg/util/yaml/decoder_test.go @@ -242,8 +242,9 @@ func TestDecodeBrokenJSON(t *testing.T) { if err == nil { t.Fatal("expected error with json: prefix, got no error") } - if !strings.HasPrefix(err.Error(), "json: line 3:") { - t.Fatalf("expected %q to have 'json: line 3:' prefix", err.Error()) + const msg = `json: offset 28: invalid character '"' after object key:value pair` + if msg != err.Error() { + t.Fatalf("expected %q, got %q", msg, err.Error()) } }