Ai
2 Star 1 Fork 2

go-mao/mao

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
middlewares.go 1.38 KB
一键复制 编辑 原始数据 按行查看 历史
haitgo 提交于 2022-12-03 11:58 +08:00 . 1.0.1
package frame
import (
"fmt"
"strings"
"sync"
"gitee.com/go-mao/mao/libs/utils"
)
/*
签名中间件
计算规则
sign=SHA256()
*/
func (this *WebEngine) MiddleSign() HandlerFunc {
var signsMap = new(sync.Map)
var signLength = 0
var signKey = strings.TrimSpace(this.server.config.File.Section("server").Key("sign").String())
return func(w *Webline) {
if signKey == "" {
return
}
signLength++
if signLength > 100000 {
signsMap = new(sync.Map)
signLength = 0
}
signStr := w.GetHeader("Sign")
if l := len(signStr); l < 74 || l > 104 {
w.AbortWithStatus(403)
return
}
signIndex := utils.Sha256(w.ClientIP(), w.Request.RequestURI, signStr)
if _, ok := signsMap.Load(signIndex); ok {
w.AbortWithStatus(403)
return
}
start := len(signStr) - 64
token := signStr[:start]
sign := signStr[start:]
if utils.Sha256(fmt.Sprint(token, signKey)) != sign { //签名未通过
w.AbortWithStatus(403)
return
}
signsMap.Store(signIndex, true)
}
}
/*
限制最大连接数
*/
func (this *WebEngine) middleMaxConnect() HandlerFunc {
var max = this.server.config.File.Section("server").Key("max_allow").MustInt()
if max == 0 {
max = 255
}
type s struct{}
sem := make(chan s, max)
acquire := func() {
sem <- s{}
}
release := func() {
<-sem
}
return func(c *Webline) {
acquire() //before request
defer release() //after request
c.Next()
}
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/go-mao/mao.git
git@gitee.com:go-mao/mao.git
go-mao
mao
mao
v1.0.9

搜索帮助