From b0def96d14416523e938e8187846c8d2b92d78bc Mon Sep 17 00:00:00 2001 From: Vasiliy Tolstov Date: Fri, 21 Jan 2022 18:20:56 +0300 Subject: [PATCH] errors: fix FromError and errors.Unmarshal Signed-off-by: Vasiliy Tolstov --- errors/errors.go | 11 ++++++++--- errors/errors_test.go | 14 ++++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/errors/errors.go b/errors/errors.go index 12daa47d..ace8a074 100644 --- a/errors/errors.go +++ b/errors/errors.go @@ -84,9 +84,9 @@ func New(id, detail string, code int32) error { // Parse tries to parse a JSON string into an error. If that // fails, it will set the given string as the error detail. func Parse(err string) *Error { - e := new(Error) - errr := json.Unmarshal([]byte(err), e) - if errr != nil { + e := &Error{} + nerr := json.Unmarshal([]byte(err), e) + if nerr != nil { e.Detail = err } return e @@ -283,6 +283,10 @@ func (e *Error) Unmarshal(data []byte) error { return r == ':' }) for idx := 0; idx < len(nparts); idx++ { + if len(nparts[idx+1]) < 3 { + idx++ + continue + } switch { case nparts[idx] == `"id"`: e.ID = nparts[idx+1][1 : len(nparts[idx+1])-1] @@ -297,6 +301,7 @@ func (e *Error) Unmarshal(data []byte) error { } e.Code = int32(c) } + idx++ } } return nil diff --git a/errors/errors_test.go b/errors/errors_test.go index a853f5c2..ae4d7a96 100644 --- a/errors/errors_test.go +++ b/errors/errors_test.go @@ -2,10 +2,24 @@ package errors import ( er "errors" + "fmt" "net/http" "testing" ) +func TestEmpty(t *testing.T) { + msg := "test" + var err *Error + err = FromError(fmt.Errorf(msg)) + if err.Detail != msg { + t.Fatalf("invalid error %v", err) + } + err = FromError(fmt.Errorf(`{"id":"","detail":"%s","status":"%s","code":0}`, msg, msg)) + if err.Detail != msg || err.Status != msg { + t.Fatalf("invalid error %#+v", err) + } +} + func TestFromError(t *testing.T) { err := NotFound("go.micro.test", "%s", "example") merr := FromError(err)