Files
website/helpers/ratelimit.go
2025-03-25 15:12:56 +00:00

36 lines
671 B
Go

package helpers
import (
"net"
"net/http"
"sync"
"golang.org/x/time/rate"
)
var visitors = make(map[string]*rate.Limiter)
var mu sync.Mutex
func GetVisitorLimiter(ip string) *rate.Limiter {
mu.Lock()
defer mu.Unlock()
limiter, exists := visitors[ip]
if !exists {
limiter = rate.NewLimiter(1, 5)
visitors[ip] = limiter
}
return limiter
}
func RateLimit(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
ip, _, _ := net.SplitHostPort(r.RemoteAddr)
if !GetVisitorLimiter(ip).Allow() {
http.Error(w, "Too many requests", http.StatusTooManyRequests)
return
}
next.ServeHTTP(w, r)
})
}