feat: 增加FakeGinContext 与 CopyGinContext

This commit is contained in:
2025-08-18 21:52:54 +08:00
parent fbfb19ae49
commit b92a01c6ae

71
util/fake.go Normal file
View File

@ -0,0 +1,71 @@
// Package util ...
//
// Description : util ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2025-08-18 21:36
package util
import (
"net/http"
"net/url"
"os"
"reflect"
"sync"
"git.zhangdeman.cn/zhangdeman/consts"
"github.com/gin-gonic/gin"
)
const (
FakeUriDefault = "git.zhangdeman.cn/zhangdeman/gin@util/fake"
)
// FakeGinContext 伪造gin.Context
func FakeGinContext(fakeUri string, ctxData map[string]any) *gin.Context {
if fakeUri == "" {
fakeUri = FakeUriDefault
}
h, _ := os.Hostname()
ctx := &gin.Context{
Request: &http.Request{
Method: http.MethodPost,
URL: &url.URL{
Scheme: consts.SchemeHTTPS.String(),
User: nil,
Host: h,
Path: fakeUri,
},
Header: map[string][]string{},
Host: h,
RemoteAddr: "localhost",
RequestURI: fakeUri,
},
Keys: map[string]any{},
}
ctxReflectVal := reflect.ValueOf(ctx).Elem()
field := ctxReflectVal.FieldByName("mu")
if field.IsValid() && field.CanSet() {
field.Set(reflect.ValueOf(sync.Mutex{}))
}
for k, v := range ctxData {
ctx.Set(k, v)
}
ctx.Copy()
return ctx
}
// Copy 复制gin.Context, 解决原生复制没有初始化mu的问题
func Copy(ctx *gin.Context) *gin.Context {
if nil == ctx {
return nil
}
newCtx := ctx.Copy()
ctxReflectVal := reflect.ValueOf(newCtx).Elem()
field := ctxReflectVal.FieldByName("mu")
if field.IsValid() && field.CanSet() {
field.Set(reflect.ValueOf(sync.Mutex{}))
}
return newCtx
}