package middleware import ( "net/http" "sync" "github.com/gin-gonic/gin" "golang.org/x/time/rate" ) func RateLimitMiddleware(rps float64, burst int) gin.HandlerFunc { var limiters sync.Map return func(c *gin.Context) { key := c.ClientIP() l, _ := limiters.LoadOrStore(key, rate.NewLimiter(rate.Limit(rps), burst)) if !l.(*rate.Limiter).Allow() { c.JSON(http.StatusTooManyRequests, gin.H{"error": "too many requests"}) c.Abort() return } c.Next() } }