Compare commits
5 Commits
Author | SHA1 | Date | |
---|---|---|---|
56ae0cfc6c | |||
202afc9068
|
|||
56094b3cb6
|
|||
0da098e9f9
|
|||
f0881c9fd6
|
@@ -306,7 +306,7 @@ func (b *Builder) GinReq(ctx context.Context, g *gin.Context, req *http.Request)
|
||||
}
|
||||
b.Str("gin.method", req.Method)
|
||||
b.Str("gin.path", g.FullPath())
|
||||
b.Str("gin.header", formatHeader(g.Request.Header))
|
||||
b.Strs("gin.header", extractHeader(g.Request.Header))
|
||||
if req.URL != nil {
|
||||
b.Str("gin.url", req.URL.String())
|
||||
}
|
||||
@@ -322,22 +322,38 @@ func (b *Builder) GinReq(ctx context.Context, g *gin.Context, req *http.Request)
|
||||
if ctxVal := g.GetString("reqid"); ctxVal != "" {
|
||||
b.Str("gin.context.reqid", ctxVal)
|
||||
}
|
||||
if req.Method != "GET" && req.Body != nil && req.Header.Get("Content-Type") == "application/json" {
|
||||
if brc, ok := req.Body.(dataext.BufferedReadCloser); ok {
|
||||
if bin, err := brc.BufferedAll(); err == nil {
|
||||
if len(bin) < 16*1024 {
|
||||
var prettyJSON bytes.Buffer
|
||||
err = json.Indent(&prettyJSON, bin, "", " ")
|
||||
if err == nil {
|
||||
b.Str("gin.body", string(prettyJSON.Bytes()))
|
||||
if req.Method != "GET" && req.Body != nil {
|
||||
|
||||
if req.Header.Get("Content-Type") == "application/json" {
|
||||
if brc, ok := req.Body.(dataext.BufferedReadCloser); ok {
|
||||
if bin, err := brc.BufferedAll(); err == nil {
|
||||
if len(bin) < 16*1024 {
|
||||
var prettyJSON bytes.Buffer
|
||||
err = json.Indent(&prettyJSON, bin, "", " ")
|
||||
if err == nil {
|
||||
b.Str("gin.body", string(prettyJSON.Bytes()))
|
||||
} else {
|
||||
b.Bytes("gin.body", bin)
|
||||
}
|
||||
} else {
|
||||
b.Bytes("gin.body", bin)
|
||||
b.Str("gin.body", fmt.Sprintf("[[%v bytes | %s]]", len(bin), req.Header.Get("Content-Type")))
|
||||
}
|
||||
} else {
|
||||
b.Str("gin.body", fmt.Sprintf("[[%v bytes]]", len(bin)))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if req.Header.Get("Content-Type") == "multipart/form-data" || req.Header.Get("Content-Type") == "x-www-form-urlencoded" {
|
||||
if brc, ok := req.Body.(dataext.BufferedReadCloser); ok {
|
||||
if bin, err := brc.BufferedAll(); err == nil {
|
||||
if len(bin) < 16*1024 {
|
||||
b.Bytes("gin.body", bin)
|
||||
} else {
|
||||
b.Str("gin.body", fmt.Sprintf("[[%v bytes | %s]]", len(bin), req.Header.Get("Content-Type")))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
b.containsGinData = true
|
||||
@@ -367,6 +383,20 @@ func formatHeader(header map[string][]string) string {
|
||||
return r
|
||||
}
|
||||
|
||||
func extractHeader(header map[string][]string) []string {
|
||||
r := make([]string, 0, len(header))
|
||||
for k, v := range header {
|
||||
for _, hval := range v {
|
||||
value := hval
|
||||
value = strings.ReplaceAll(value, "\n", "\\n")
|
||||
value = strings.ReplaceAll(value, "\r", "\\r")
|
||||
value = strings.ReplaceAll(value, "\t", "\\t")
|
||||
r = append(r, k+": "+value)
|
||||
}
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// Build creates a new error, ready to pass up the stack
|
||||
|
@@ -8,6 +8,7 @@ import (
|
||||
"gogs.mikescher.com/BlackForestBytes/goext/exerr"
|
||||
"gogs.mikescher.com/BlackForestBytes/goext/langext"
|
||||
"runtime/debug"
|
||||
"time"
|
||||
)
|
||||
|
||||
type PreContext struct {
|
||||
@@ -18,6 +19,7 @@ type PreContext struct {
|
||||
body any
|
||||
form any
|
||||
header any
|
||||
timeout *time.Duration
|
||||
}
|
||||
|
||||
func (pctx *PreContext) URI(uri any) *PreContext {
|
||||
@@ -45,6 +47,11 @@ func (pctx *PreContext) Header(header any) *PreContext {
|
||||
return pctx
|
||||
}
|
||||
|
||||
func (pctx *PreContext) WithTimeout(to time.Duration) *PreContext {
|
||||
pctx.timeout = &to
|
||||
return pctx
|
||||
}
|
||||
|
||||
func (pctx PreContext) Start() (*AppContext, *gin.Context, *HTTPResponse) {
|
||||
if pctx.uri != nil {
|
||||
if err := pctx.ginCtx.ShouldBindUri(pctx.uri); err != nil {
|
||||
@@ -92,6 +99,14 @@ func (pctx PreContext) Start() (*AppContext, *gin.Context, *HTTPResponse) {
|
||||
Build()
|
||||
return nil, nil, langext.Ptr(Error(err))
|
||||
}
|
||||
} else if pctx.ginCtx.ContentType() == "application/x-www-form-urlencoded" {
|
||||
if err := pctx.ginCtx.ShouldBindWith(pctx.form, binding.Form); err != nil {
|
||||
err = exerr.Wrap(err, "Failed to read urlencoded-form").
|
||||
WithType(exerr.TypeBindFailFormData).
|
||||
Str("struct_type", fmt.Sprintf("%T", pctx.form)).
|
||||
Build()
|
||||
return nil, nil, langext.Ptr(Error(err))
|
||||
}
|
||||
} else {
|
||||
err := exerr.New(exerr.TypeBindFailFormData, "missing form body").
|
||||
Str("struct_type", fmt.Sprintf("%T", pctx.form)).
|
||||
@@ -110,7 +125,7 @@ func (pctx PreContext) Start() (*AppContext, *gin.Context, *HTTPResponse) {
|
||||
}
|
||||
}
|
||||
|
||||
ictx, cancel := context.WithTimeout(context.Background(), pctx.wrapper.requestTimeout)
|
||||
ictx, cancel := context.WithTimeout(context.Background(), langext.Coalesce(pctx.timeout, pctx.wrapper.requestTimeout))
|
||||
actx := CreateAppContext(pctx.ginCtx, ictx, cancel)
|
||||
|
||||
return actx, pctx.ginCtx, nil
|
||||
|
2
go.mod
2
go.mod
@@ -14,7 +14,7 @@ require (
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/bytedance/sonic v1.10.0-rc3 // indirect
|
||||
github.com/bytedance/sonic v1.10.0 // indirect
|
||||
github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect
|
||||
github.com/chenzhuoyu/iasm v0.9.0 // indirect
|
||||
github.com/gabriel-vasile/mimetype v1.4.2 // indirect
|
||||
|
2
go.sum
2
go.sum
@@ -4,6 +4,8 @@ github.com/bytedance/sonic v1.10.0-rc2 h1:oDfRZ+4m6AYCOC0GFeOCeYqvBmucy1isvouS2K
|
||||
github.com/bytedance/sonic v1.10.0-rc2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=
|
||||
github.com/bytedance/sonic v1.10.0-rc3 h1:uNSnscRapXTwUgTyOF0GVljYD08p9X/Lbr9MweSV3V0=
|
||||
github.com/bytedance/sonic v1.10.0-rc3/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=
|
||||
github.com/bytedance/sonic v1.10.0 h1:qtNZduETEIWJVIyDl01BeNxur2rW9OwTQ/yBqFRkKEk=
|
||||
github.com/bytedance/sonic v1.10.0/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=
|
||||
github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=
|
||||
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=
|
||||
github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=
|
||||
|
@@ -1,5 +1,5 @@
|
||||
package goext
|
||||
|
||||
const GoextVersion = "0.0.236"
|
||||
const GoextVersion = "0.0.241"
|
||||
|
||||
const GoextVersionTimestamp = "2023-08-09T17:48:06+0200"
|
||||
const GoextVersionTimestamp = "2023-08-14T15:54:50+0200"
|
||||
|
@@ -467,3 +467,13 @@ func ArrayToInterface[T any](t []T) []interface{} {
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
func JoinString(arr []string, delimiter string) string {
|
||||
str := ""
|
||||
for i, v := range arr {
|
||||
str += v
|
||||
if i < len(arr)-1 {
|
||||
str += delimiter
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user