diff --git a/core/mapping/jsonunmarshaler_test.go b/core/mapping/jsonunmarshaler_test.go index c98244c7..ccaf6b6c 100644 --- a/core/mapping/jsonunmarshaler_test.go +++ b/core/mapping/jsonunmarshaler_test.go @@ -871,3 +871,50 @@ func TestUnmarshalReaderError(t *testing.T) { assert.NotNil(t, err) assert.True(t, strings.Contains(err.Error(), payload)) } + +func TestUnmarshalMap(t *testing.T) { + t.Run("nil map and valid", func(t *testing.T) { + var m map[string]interface{} + var v struct { + Any string `json:",optional"` + } + + err := UnmarshalJsonMap(m, &v) + assert.Nil(t, err) + assert.True(t, len(v.Any) == 0) + }) + + t.Run("empty map but not valid", func(t *testing.T) { + m := map[string]interface{}{} + var v struct { + Any string + } + + err := UnmarshalJsonMap(m, &v) + assert.NotNil(t, err) + }) + + t.Run("empty map and valid", func(t *testing.T) { + m := map[string]interface{}{} + var v struct { + Any string `json:",optional"` + } + + err := UnmarshalJsonMap(m, &v) + assert.Nil(t, err) + assert.True(t, len(v.Any) == 0) + }) + + t.Run("valid map", func(t *testing.T) { + m := map[string]interface{}{ + "Any": "foo", + } + var v struct { + Any string + } + + err := UnmarshalJsonMap(m, &v) + assert.Nil(t, err) + assert.Equal(t, "foo", v.Any) + }) +} diff --git a/rest/handler/timeouthandler.go b/rest/handler/timeouthandler.go index 0e81c161..1b9532cf 100644 --- a/rest/handler/timeouthandler.go +++ b/rest/handler/timeouthandler.go @@ -89,6 +89,8 @@ func (h *timeoutHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { case <-ctx.Done(): tw.mu.Lock() defer tw.mu.Unlock() + // there isn't any user-defined middleware before TimoutHandler, + // so we can guarantee that cancelation in biz related code won't come here. if errors.Is(ctx.Err(), context.Canceled) { w.WriteHeader(statusClientClosedRequest) } else { diff --git a/rest/httpx/requests.go b/rest/httpx/requests.go index 2609030d..170e31c9 100644 --- a/rest/httpx/requests.go +++ b/rest/httpx/requests.go @@ -25,8 +25,6 @@ var ( pathUnmarshaler = mapping.NewUnmarshaler(pathKey, mapping.WithStringValues()) headerUnmarshaler = mapping.NewUnmarshaler(headerKey, mapping.WithStringValues(), mapping.WithCanonicalKeyFunc(textproto.CanonicalMIMEHeaderKey)) - - emptyMap = map[string]interface{}{} ) // Parse parses the request. @@ -107,13 +105,12 @@ func ParseHeader(headerValue string) map[string]string { // ParseJsonBody parses the post request which contains json in body. func ParseJsonBody(r *http.Request, v interface{}) error { - var reader io.Reader if withJsonBody(r) { - reader = io.LimitReader(r.Body, maxBodyLen) + reader := io.LimitReader(r.Body, maxBodyLen) return mapping.UnmarshalJsonReader(reader, v) } - return mapping.UnmarshalJsonMap(emptyMap, v) + return mapping.UnmarshalJsonMap(nil, v) } // ParsePath parses the symbols reside in url path. diff --git a/rest/httpx/requests_test.go b/rest/httpx/requests_test.go index 76cbe346..7e40fb94 100644 --- a/rest/httpx/requests_test.go +++ b/rest/httpx/requests_test.go @@ -196,9 +196,7 @@ Content-Disposition: form-data; name="age" } func TestParseJsonBody(t *testing.T) { - t.Run("has body", func(t *testing.T) { - var v struct { Name string `json:"name"` Age int `json:"age"` @@ -211,11 +209,9 @@ func TestParseJsonBody(t *testing.T) { assert.Nil(t, Parse(r, &v)) assert.Equal(t, "kevin", v.Name) assert.Equal(t, 18, v.Age) - }) t.Run("hasn't body", func(t *testing.T) { - var v struct { Name string `json:"name,optional"` Age int `json:"age,optional"` @@ -225,9 +221,7 @@ func TestParseJsonBody(t *testing.T) { assert.Nil(t, Parse(r, &v)) assert.Equal(t, "", v.Name) assert.Equal(t, 0, v.Age) - }) - } func TestParseRequired(t *testing.T) { diff --git a/rest/internal/security/contentsecurity.go b/rest/internal/security/contentsecurity.go index ec66f04c..4ed4237a 100644 --- a/rest/internal/security/contentsecurity.go +++ b/rest/internal/security/contentsecurity.go @@ -119,18 +119,10 @@ func VerifySignature(r *http.Request, securityHeader *ContentSecurityHeader, tol }, "\n") actualSignature := codec.HmacBase64(securityHeader.Key, signContent) - /*passed := securityHeader.Signature == actualSignature - if !passed { - logx.Infof("signature different, expect: %s, actual: %s", - securityHeader.Signature, actualSignature) - } - - if passed { - return httpx.CodeSignaturePass - }*/ if securityHeader.Signature == actualSignature { return httpx.CodeSignaturePass } + logx.Infof("signature different, expect: %s, actual: %s", securityHeader.Signature, actualSignature) diff --git a/tools/goctl/bug/env.go b/tools/goctl/bug/env.go index 6f954520..da66e8bd 100644 --- a/tools/goctl/bug/env.go +++ b/tools/goctl/bug/env.go @@ -21,7 +21,7 @@ func (e env) string() string { w.WriteString(fmt.Sprintf("%s = %q\n", k, v)) } - return strings.TrimSuffix(w.String(),"\n") + return strings.TrimSuffix(w.String(), "\n") } func getEnv() env { diff --git a/tools/goctl/bug/issue.go b/tools/goctl/bug/issue.go index c3cd0981..0c623aad 100644 --- a/tools/goctl/bug/issue.go +++ b/tools/goctl/bug/issue.go @@ -1,6 +1,6 @@ package bug -const issueTemplate=` +const issueTemplate = ` ### What category of issue (goctl or sdk)?