package middleware 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(3, 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) }) }