diff --git a/ginext/commonMiddlewares.go b/ginext/commonMiddlewares.go new file mode 100644 index 0000000..410b6f3 --- /dev/null +++ b/ginext/commonMiddlewares.go @@ -0,0 +1,14 @@ +package ginext + +import ( + "github.com/gin-gonic/gin" + "gogs.mikescher.com/BlackForestBytes/goext/dataext" +) + +func BodyBuffer() gin.HandlerFunc { + return func(g *gin.Context) { + if g.Request.Body != nil { + g.Request.Body = dataext.NewBufferedReadCloser(g.Request.Body) + } + } +} diff --git a/ginext/engine.go b/ginext/engine.go index fb753a4..771801b 100644 --- a/ginext/engine.go +++ b/ginext/engine.go @@ -18,6 +18,7 @@ type GinWrapper struct { allowCors bool ginDebug bool + bufferBody bool requestTimeout time.Duration routeSpecs []ginRouteSpec @@ -30,7 +31,13 @@ type ginRouteSpec struct { Handler string } -func NewEngine(allowCors bool, ginDebug bool, timeout time.Duration) *GinWrapper { +// NewEngine creates a new (wrapped) ginEngine +// Parameters are: +// - [allowCors] Add cors handler to allow all CORS requests on the default http methods +// - [ginDebug] Set gin.debug to true (adds more logs) +// - [bufferBody] Buffers the input body stream, this way the ginext error handler can later include the whole request body +// - [timeout] The default handler timeout +func NewEngine(allowCors bool, ginDebug bool, bufferBody bool, timeout time.Duration) *GinWrapper { engine := gin.New() wrapper := &GinWrapper{ @@ -38,6 +45,7 @@ func NewEngine(allowCors bool, ginDebug bool, timeout time.Duration) *GinWrapper SuppressGinLogs: false, allowCors: allowCors, ginDebug: ginDebug, + bufferBody: bufferBody, requestTimeout: timeout, } diff --git a/ginext/routes.go b/ginext/routes.go index 3b396a0..7ac2ced 100644 --- a/ginext/routes.go +++ b/ginext/routes.go @@ -111,6 +111,13 @@ func (w *GinRouteBuilder) Use(middleware ...gin.HandlerFunc) *GinRouteBuilder { func (w *GinRouteBuilder) Handle(handler WHandlerFunc) { + if w.routes.wrapper.bufferBody { + arr := make([]gin.HandlerFunc, len(w.handlers)+1) + arr = append(arr, BodyBuffer()) + arr = append(arr, w.handlers...) + w.handlers = arr + } + middlewareNames := langext.ArrMap(w.handlers, func(v gin.HandlerFunc) string { return nameOfFunction(v) }) handlerName := nameOfFunction(handler) diff --git a/go.mod b/go.mod index 5bb2964..a2650e9 100644 --- a/go.mod +++ b/go.mod @@ -6,8 +6,8 @@ require ( github.com/gin-gonic/gin v1.9.1 github.com/jmoiron/sqlx v1.3.5 github.com/rs/xid v1.5.0 - github.com/rs/zerolog v1.29.1 - go.mongodb.org/mongo-driver v1.12.0 + github.com/rs/zerolog v1.30.0 + go.mongodb.org/mongo-driver v1.12.1 golang.org/x/crypto v0.11.0 golang.org/x/sys v0.10.0 golang.org/x/term v0.10.0 @@ -42,7 +42,7 @@ require ( github.com/xdg-go/stringprep v1.0.4 // indirect github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect golang.org/x/arch v0.4.0 // indirect - golang.org/x/net v0.12.0 // indirect + golang.org/x/net v0.13.0 // indirect golang.org/x/sync v0.3.0 // indirect golang.org/x/text v0.11.0 // indirect google.golang.org/protobuf v1.31.0 // indirect diff --git a/go.sum b/go.sum index e2ccdc1..b06a770 100644 --- a/go.sum +++ b/go.sum @@ -87,6 +87,8 @@ github.com/rs/zerolog v1.29.0 h1:Zes4hju04hjbvkVkOhdl2HpZa+0PmVwigmo8XoORE5w= github.com/rs/zerolog v1.29.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0= github.com/rs/zerolog v1.29.1 h1:cO+d60CHkknCbvzEWxP0S9K6KqyTjrCNUy1LdQLCGPc= github.com/rs/zerolog v1.29.1/go.mod h1:Le6ESbR7hc+DP6Lt1THiV8CQSdkkNrd3R0XbEgp3ZBU= +github.com/rs/zerolog v1.30.0 h1:SymVODrcRsaRaSInD9yQtKbtWqwsfoPcRff/oRXLj4c= +github.com/rs/zerolog v1.30.0/go.mod h1:/tk+P47gFdPXq4QYjvCmT5/Gsug2nagsFWBWhAiSi1w= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= @@ -122,6 +124,8 @@ go.mongodb.org/mongo-driver v1.11.2 h1:+1v2rDQUWNcGW7/7E0Jvdz51V38XXxJfhzbV17aNH go.mongodb.org/mongo-driver v1.11.2/go.mod h1:s7p5vEtfbeR1gYi6pnj3c3/urpbLv2T5Sfd6Rp2HBB8= go.mongodb.org/mongo-driver v1.12.0 h1:aPx33jmn/rQuJXPQLZQ8NtfPQG8CaqgLThFtqRb0PiE= go.mongodb.org/mongo-driver v1.12.0/go.mod h1:AZkxhPnFJUoH7kZlFkVKucV20K387miPfm7oimrSmK0= +go.mongodb.org/mongo-driver v1.12.1 h1:nLkghSU8fQNaK7oUmDhQFsnrtcoNy7Z6LVFKsEecqgE= +go.mongodb.org/mongo-driver v1.12.1/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.4.0 h1:A8WCeEWhLwPBKNbFi5Wv5UTCBx5zzubnXDlMOFAzFMc= golang.org/x/arch v0.4.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= @@ -141,6 +145,8 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.13.0 h1:Nvo8UFsZ8X3BhAC9699Z1j7XQ3rsZnUUm7jfBEk1ueY= +golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= diff --git a/goextVersion.go b/goextVersion.go index c1a9e57..43fe6fd 100644 --- a/goextVersion.go +++ b/goextVersion.go @@ -1,5 +1,5 @@ package goext -const GoextVersion = "0.0.219" +const GoextVersion = "0.0.220" -const GoextVersionTimestamp = "2023-07-28T15:42:12+0200" +const GoextVersionTimestamp = "2023-08-03T09:09:27+0200"