summaryrefslogtreecommitdiffstats
path: root/client
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2023-03-16 08:46:01 +0100
committerMartin Polden <mpolden@mpolden.no>2023-03-23 12:13:16 +0100
commit6c8f5bcaf130edcd364dc45fa44502e24b18c5fa (patch)
tree62a6a1cc978cce56bfcc9a5e6899e4fd6e79ebc5 /client
parent1f568435f5111da3eb19d6be2e9be7d89c1d60dc (diff)
Report byte offset on parse error
Diffstat (limited to 'client')
-rw-r--r--client/go/internal/vespa/feed/document.go8
-rw-r--r--client/go/internal/vespa/feed/document_test.go21
2 files changed, 29 insertions, 0 deletions
diff --git a/client/go/internal/vespa/feed/document.go b/client/go/internal/vespa/feed/document.go
index eccbb80b7c2..609e3f6c5aa 100644
--- a/client/go/internal/vespa/feed/document.go
+++ b/client/go/internal/vespa/feed/document.go
@@ -95,6 +95,14 @@ func (d *Decoder) readCloseToken() error {
}
func (d *Decoder) Decode() (Document, error) {
+ doc, err := d.decode()
+ if err != nil && err != io.EOF {
+ return Document{}, fmt.Errorf("invalid json at byte offset %d: %w", d.dec.InputOffset(), err)
+ }
+ return doc, err
+}
+
+func (d *Decoder) decode() (Document, error) {
if err := d.guessMode(); err != nil {
return Document{}, err
}
diff --git a/client/go/internal/vespa/feed/document_test.go b/client/go/internal/vespa/feed/document_test.go
index 6c8f92bdaa6..452c184a05a 100644
--- a/client/go/internal/vespa/feed/document_test.go
+++ b/client/go/internal/vespa/feed/document_test.go
@@ -132,4 +132,25 @@ func testDocumentDecoder(t *testing.T, jsonLike string) {
func TestDocumentDecoder(t *testing.T) {
testDocumentDecoder(t, feedInput(false))
testDocumentDecoder(t, feedInput(true))
+
+ jsonLike := `
+{
+ "put": "id:ns:type::doc1",
+ "fields": {"foo": "123"}
+}
+{
+ "put": "id:ns:type::doc1",
+ "fields": {"foo": "invalid
+}
+`
+ r := NewDecoder(strings.NewReader(jsonLike))
+ _, err := r.Decode() // first object is valid
+ if err != nil {
+ t.Errorf("unexpected error: %s", err)
+ }
+ _, err = r.Decode()
+ wantErr := "invalid json at byte offset 60: invalid character '\\n' in string literal"
+ if err.Error() != wantErr {
+ t.Errorf("want error %q, got %q", wantErr, err.Error())
+ }
}