goProject/.svn/pristine/c0/c08ddfac5b0e55a5d280c01f5ba84175746c6670.svn-base
2025-01-06 16:21:36 +08:00

163 lines
3.8 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package webServer
import (
"Framework/ipMgr"
"goutil/debugUtil"
"goutil/typeUtil"
)
// 参数传输类型
type ParamTransferType string
const (
// 以Form表单形式来传递参数
Con_Form ParamTransferType = "Form"
// 以二进制流形式来传递参数
Con_Stream ParamTransferType = "Stream"
)
type handlerFunc func(*Context)
// 请求处理配置对象
type HandlerConfig struct {
// 是否需要验证IP
IsCheckIP bool
// 参数类型
ParamTransferType ParamTransferType
// 方法参数名称集合
ParamNameList []string
// 非空参数名称集合
NotEmptyParamNameList []string
}
// 请求处理对象
type handler struct {
// 用户自定义数据(注册回调时设置通过Context传到用户回调) Add:raojianhua Time:2022-02-16 17:00
userData interface{}
// 注册的访问路径
path string
// 方法定义
funcObj handlerFunc
// 请求处理配置对象
configObj *HandlerConfig
// 正则表达式
regex bool
}
// 检查IP是否合法
func (this *handler) checkIP(context *Context, ifCheckIPWhenDebug bool) bool {
if this.configObj == nil {
return true
}
if this.configObj.IsCheckIP == false {
return true
}
if debugUtil.IsDebug() == true && ifCheckIPWhenDebug == false {
return true
}
if ipMgr.IsIpValid(context.GetRequestIP()) {
return true
}
return false
}
// 检测参数
func (this *handler) checkParam(context *Context, methodName string, paramCheckHandler func(paramMap typeUtil.MapData, paramNameList []string, notEmptyParamList []string) ([]string, []string, bool)) (missParamList []string, emptyParamList []string, valid bool) {
valid = true
if this.configObj == nil {
return
}
// 获取方法的参数集合
var dataMap typeUtil.MapData
switch this.configObj.ParamTransferType {
case Con_Stream:
data := new(map[string]interface{})
if exist, err := context.Unmarshal(data); err != nil || !exist {
valid = false
return
}
dataMap = typeUtil.NewMapData(*data)
default:
if methodName == "POST" {
dataMap = context.GetPostFormValueData()
} else {
dataMap = context.GetFormValueData()
}
}
// 定义默认的参数验证方法
defaultParamCheckHandler := func(paramMap typeUtil.MapData, paramNameList []string, notEmptyParamList []string) (_missParamList []string, _emptyParamList []string, _valid bool) {
_valid = true
// 遍历判断每一个参数是否存在;为了搜集所有的参数,所以不会提前返回
for _, name := range paramNameList {
if _, exist := paramMap[name]; !exist {
_missParamList = append(_missParamList, name)
_valid = false
}
}
for _, name := range notEmptyParamList {
if value, _ := paramMap[name]; value == "" {
_emptyParamList = append(_emptyParamList, name)
_valid = false
}
}
return
}
// 如果没有指定验证参数的方法,就使用默认方法
if paramCheckHandler == nil {
missParamList, emptyParamList, valid = defaultParamCheckHandler(dataMap, this.configObj.ParamNameList, this.configObj.NotEmptyParamNameList)
} else {
missParamList, emptyParamList, valid = paramCheckHandler(dataMap, this.configObj.ParamNameList, this.configObj.NotEmptyParamNameList)
}
return
}
// 检测POST参数
func (this *handler) checkPostParam(context *Context) bool {
if this.configObj == nil {
return true
}
for _, name := range this.configObj.ParamNameList {
if _, exist := context.GetPostFormValueData()[name]; !exist {
return false
}
}
for _, name := range this.configObj.NotEmptyParamNameList {
if value, _ := context.GetPostFormValueData()[name]; value == "" {
return false
}
}
return true
}
// 创建新的请求方法对象
func newHandler(path string, funcObj handlerFunc, configObj *HandlerConfig) *handler {
return &handler{
path: path,
funcObj: funcObj,
configObj: configObj,
regex: false,
}
}