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[any]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
 | |
| }
 |