diff --git a/ginext/preContext.go b/ginext/preContext.go index 5957bde..6ab4497 100644 --- a/ginext/preContext.go +++ b/ginext/preContext.go @@ -15,16 +15,17 @@ import ( ) type PreContext struct { - ginCtx *gin.Context - wrapper *GinWrapper - uri any - query any - body any - rawbody *[]byte - form any - header any - timeout *time.Duration - persistantData *preContextData // must be a ptr, so that we can get the values back in out Wrap func + ginCtx *gin.Context + wrapper *GinWrapper + uri any + query any + body any + rawbody *[]byte + form any + header any + timeout *time.Duration + persistantData *preContextData // must be a ptr, so that we can get the values back in out Wrap func + ignoreWrongContentType bool } type preContextData struct { @@ -71,7 +72,12 @@ func (pctx *PreContext) WithSession(sessionObj SessionObject) *PreContext { return pctx } -func (pctx PreContext) Start() (*AppContext, *gin.Context, *HTTPResponse) { +func (pctx *PreContext) IgnoreWrongContentType() *PreContext { + pctx.ignoreWrongContentType = true + return pctx +} + +func (pctx PreContext) Start() (*AppContext, *gin.Context, *InspectableHTTPErrorResponse) { if pctx.uri != nil { if err := pctx.ginCtx.ShouldBindUri(pctx.uri); err != nil { err = exerr.Wrap(err, "Failed to read uri"). @@ -102,10 +108,12 @@ func (pctx PreContext) Start() (*AppContext, *gin.Context, *HTTPResponse) { return nil, nil, langext.Ptr(Error(err)) } } else { - err := exerr.New(exerr.TypeBindFailJSON, "missing JSON body"). - Str("struct_type", fmt.Sprintf("%T", pctx.body)). - Build() - return nil, nil, langext.Ptr(Error(err)) + if !pctx.ignoreWrongContentType { + err := exerr.New(exerr.TypeBindFailJSON, "missing JSON body"). + Str("struct_type", fmt.Sprintf("%T", pctx.body)). + Build() + return nil, nil, langext.Ptr(Error(err)) + } } } @@ -144,10 +152,12 @@ func (pctx PreContext) Start() (*AppContext, *gin.Context, *HTTPResponse) { return nil, nil, langext.Ptr(Error(err)) } } else { - err := exerr.New(exerr.TypeBindFailFormData, "missing form body"). - Str("struct_type", fmt.Sprintf("%T", pctx.form)). - Build() - return nil, nil, langext.Ptr(Error(err)) + if !pctx.ignoreWrongContentType { + err := exerr.New(exerr.TypeBindFailFormData, "missing form body"). + Str("struct_type", fmt.Sprintf("%T", pctx.form)). + Build() + return nil, nil, langext.Ptr(Error(err)) + } } } diff --git a/ginext/response.go b/ginext/response.go index c16d816..242b24b 100644 --- a/ginext/response.go +++ b/ginext/response.go @@ -36,6 +36,13 @@ type InspectableHTTPResponse interface { Headers() []string } +type InspectableHTTPErrorResponse interface { + HTTPResponse + InspectableHTTPResponse + + Error() error +} + func NotImplemented() HTTPResponse { return Error(exerr.New(exerr.TypeNotImplemented, "").Build()) } diff --git a/ginext/responseJsonAPI.go b/ginext/responseJsonAPI.go index e0dea10..58b8e46 100644 --- a/ginext/responseJsonAPI.go +++ b/ginext/responseJsonAPI.go @@ -13,6 +13,10 @@ type jsonAPIErrResponse struct { cookies []cookieval } +func (j jsonAPIErrResponse) Error() error { + return j.err +} + func (j jsonAPIErrResponse) Write(g *gin.Context) { for _, v := range j.headers { g.Header(v.Key, v.Val) @@ -64,7 +68,7 @@ func (j jsonAPIErrResponse) Unwrap() error { return j.err } -func Error(e error) HTTPResponse { +func Error(e error) InspectableHTTPErrorResponse { return &jsonAPIErrResponse{ err: exerr.FromError(e), } diff --git a/goextVersion.go b/goextVersion.go index 27c1463..76d62b1 100644 --- a/goextVersion.go +++ b/goextVersion.go @@ -1,5 +1,5 @@ package goext -const GoextVersion = "0.0.482" +const GoextVersion = "0.0.483" -const GoextVersionTimestamp = "2024-07-12T16:33:42+0200" +const GoextVersionTimestamp = "2024-07-16T15:08:37+0200"