Changelog
Version v1.1.1
🐛 Bug Fixes
- Fixed Header Value Formatting in nethttp Middleware
- Issue: The nethttp middleware previously formatted rate limit header values using http.StatusText() instead of stringifying numerical values. This resulted in improper header values such as X-RateLimit-Limit: OK.
- Fix: Replaced http.StatusText() with strconv.FormatInt(). Header values now correctly output formatted numeric strings (e.g., X-RateLimit-Limit: 100).
- Resolved Failover Race Condition in hybrid Driver
- Issue: Under high concurrent loads during primary driver outages, multiple goroutines could simultaneously trigger the onError callback and update lastFailUnix timestamps.
- Fix: Converted the isDown state transition to use atomic CompareAndSwap(false, true). Now, exactly one goroutine executes the circuit breaker transition and triggers the error callback per failure event.
- Added Guard Against nil Functions in WithKeyFunc
- Issue: Passing WithKeyFunc(nil) explicitly during distlimit.New() initialization cleared the default key extraction function, leading to potential nil pointer dereference panics during Allow().
- Fix: Added a nil check in WithKeyFunc(). If a nil function is provided, the Limiter safely preserves the default key extraction logic (“global”)
✨ New Features & Enhancements
- Manual Rate Limit Reset API (ResetKey & Driver.Reset)
- Introduced Limiter.ResetKey(ctx context.Context, key string) error allowing operators to manually reset the rate limit counter for a specific key (e.g., following successful CAPTCHA verification or administrator action).
- Added Reset(ctx context.Context, key string) error method to the Driver interface, implemented across all standard drivers:
- Memory Driver: Removes state entries directly from the designated hash shard.
- Redis Driver: Deletes the key and its corresponding sequence tracking key atomically in Redis.
- Hybrid Driver: Delegates reset operations to both the primary and fallback storage drivers.
- RFC 6585 & IETF Draft Header Standardization
- All HTTP framework middleware adapters (nethttp, gin, echo, echov5, fiber) now inject standard IETF RFC 6585 headers alongside legacy X-RateLimit-* headers for backward compatibility:
- RateLimit-Limit: Maximum capacity for the window.
- RateLimit-Remaining: Remaining quota in the current window.
- RateLimit-Reset: Time remaining in seconds until window reset.
- Fallback Handling for Empty Keys
- Updated Allow(), AllowKey(), and ResetKey() to automatically convert empty key strings (“”) to “global” to prevent key collisions across empty extractions.
📦 Upgrade Guide
To update your project to v1.1.1, run:
go get -u github.com/balramadan/distlimit@v1.1.1What’s Changed
- Hotfix/v1.1.1 by @balramadan in https://github.com/balramadan/distlimit/pull/2
Full Changelog: https://github.com/balramadan/distlimit/compare/v1.1.0...v1.1.1