AnonymousOverflow/src/middleware/ratelimit.go

45 lines
906 B
Go
Raw Normal View History

2022-12-28 00:00:17 -05:00
package middleware
import (
"sync"
"time"
"github.com/gin-gonic/gin"
)
var ipMap = sync.Map{}
func Ratelimit() gin.HandlerFunc {
return func(c *gin.Context) {
ip := c.ClientIP()
// log request count as the value, ip as key
// if the ip is not in the map, create a new entry with a value of 1
// if they exceed 30 requests in 1 minute, return a 429
// get the value from the map
val, ok := ipMap.Load(ip)
if !ok {
// if the ip is not in the map, create a new entry with a value of 1
ipMap.Store(ip, 1)
c.Next()
return
}
// if the ip is in the map, increment the value
ipMap.Store(ip, val.(int)+1)
// if they exceed 30 requests in 1 minute, return a 429
if val.(int) > 30 {
c.String(429, "429 Too Many Requests")
c.Abort()
return
}
// delete the ip from the map after 1 minute
time.AfterFunc(time.Minute, func() {
ipMap.Delete(ip)
})
}
}