72 lines
1.4 KiB
Go
72 lines
1.4 KiB
Go
// 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
|
|
}
|