/
filter.go
44 lines (35 loc) · 943 Bytes
/
filter.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package middleware
import (
"net/http"
"github.com/gin-gonic/gin"
"golang.org/x/time/rate"
"github.com/uerax/chatgpt-prj/common"
"github.com/uerax/goconf"
)
var (
irl *common.IpRateLimiter
Reqirl *rate.Limiter
)
func FilterInit() {
r := goconf.VarIntOrDefault(5, "filter", "ip", "rate")
size := goconf.VarIntOrDefault(5, "filter", "ip", "size")
ReqR := goconf.VarIntOrDefault(10, "filter", "request", "rate")
ReqSize := goconf.VarIntOrDefault(10, "filter", "request", "size")
irl = common.NewIpRateLimiter(r, size)
Reqirl = rate.NewLimiter(rate.Limit(ReqR), ReqSize)
}
func FilterHandler() gin.HandlerFunc {
return func(c *gin.Context) {
// TODO 可以加上一个全局限流器, 限制时间内最大访问数
l := irl.GetLimiter(c.ClientIP())
if !l.Allow() {
c.JSON(http.StatusTooManyRequests, nil)
return
}
if !Reqirl.Allow() {
c.JSON(http.StatusTooManyRequests, nil)
return
}
c.Next()
}
}