Files
fn_registry/functions/infra/rate_limit_middleware.md
T
egutierrez c3d9fbd8d3 feat(infra): rate limit middlewares HTTP por IP y por key + tests
Implementa fase 2 del issue 0016:
- rate_limit_middleware: limita por IP (X-Forwarded-For > X-Real-IP > RemoteAddr)
- rate_limiter_by_key: middleware configurable con keyFunc custom (API key, user ID...)
- Cuando se rechaza responde 429 con HTTPError JSON y headers Retry-After + X-RateLimit-*
- Tests con httptest.NewRecorder cubriendo: limite, burst, IPs independientes, XFF prioritario,
  recarga temporal, JSON body, headers IETF, GC stop idempotente, key vacia salta limit
2026-04-18 17:14:25 +02:00

1.8 KiB

name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, params, output, tested, tests, test_file_path, file_path
name kind lang domain version purity signature description tags uses_functions uses_types returns returns_optional error_type imports params output tested tests test_file_path file_path
rate_limit_middleware function go infra 1.0.0 impure func RateLimitMiddleware(rl *RateLimiter) Middleware Middleware HTTP que aplica rate limiting por IP del cliente. Extrae IP de X-Forwarded-For, X-Real-IP o RemoteAddr. Responde 429 con headers Retry-After y X-RateLimit-* cuando se supera el limite.
rate_limit
http
middleware
ip
server
infra
rate_limiter_by_key_go_infra
RateLimiter_go_infra
Middleware_go_infra
Middleware_go_infra
false error_go_core
net
net/http
strings
name desc
rl puntero al RateLimiter compartido entre todos los requests
Middleware que limita por IP del cliente y responde 429 cuando se excede true
permite request bajo el limite
responde 429 cuando se excede el limite
IPs distintas tienen buckets independientes
X-Forwarded-For tiene prioridad sobre RemoteAddr
responde con Retry-After header en 429
functions/infra/rate_limit_middleware_test.go functions/infra/rate_limit_middleware.go

Ejemplo

rl := RateLimiterNew(10, 20)
chain := HTTPMiddlewareChain(
    HTTPCORSMiddleware([]string{"*"}, []string{"GET", "POST"}),
    RateLimitMiddleware(rl),
    HTTPLoggerMiddleware(os.Stderr),
)
http.ListenAndServe(":8080", chain(mux))

Notas

Funcion impura — el middleware producido muta el estado del limiter en cada request. Internamente delega en RateLimiterByKey con un keyFunc que extrae la IP segun cabeceras estandar de proxy. La extraccion de IP confia en X-Forwarded-For: para uso publico real habria que validar contra trusted proxies para evitar spoofing. Para entornos internos (deploy con Traefik/Nginx delante) es seguro.