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
 | 
						|
}
 |