Files
TGSS/internal/server/ratelimiter.go
T
mahdium ee5534a2ce feat: add rate limiting to feed endpoint and update route paths
- Implement per-client rate limiting (5 requests per 3 seconds)
- Change /channel/:id routes to /feed/:id for consistency
- Add data/ to .gitignore
- Include RateLimit middleware on GET /feed/:id endpoint
2026-03-11 00:36:40 +03:30

47 lines
798 B
Go

package server
import (
"sync"
"time"
"github.com/gin-gonic/gin"
"golang.org/x/time/rate"
)
type ClientLimiter struct {
limiter *rate.Limiter
lastSeen time.Time
}
var clients = map[string]*ClientLimiter{}
var mu sync.Mutex
func getLimiter(ip string) *rate.Limiter {
mu.Lock()
defer mu.Unlock()
if c, ok := clients[ip]; ok {
c.lastSeen = time.Now()
return c.limiter
}
limiter := rate.NewLimiter(rate.Every(time.Second * 3), 5) // TODO: get from config
clients[ip] = &ClientLimiter{limiter: limiter, lastSeen: time.Now()}
return limiter
}
func RateLimit() gin.HandlerFunc {
return func(c *gin.Context) {
ip := c.ClientIP()
limiter := getLimiter(ip)
if !limiter.Allow() {
c.AbortWithStatusJSON(429, gin.H{"error": "Slow down pls"})
return
}
c.Next()
}
}