feat: 增加FakeGinContext 与 CopyGinContext
This commit is contained in:
71
util/fake.go
Normal file
71
util/fake.go
Normal 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
|
||||||
|
}
|
Reference in New Issue
Block a user