Comments (1)
@fproulx-eoscanada
middlewares:
func authorizeMiddleware(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
ctx := context.WithValue(r.Context(), "user_id", "user-12345")
next(w, r.WithContext(ctx))
}
}
func limiterMiddleware(rateLimiter *redis_rate.Limiter, limit int64, next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
userID := r.Context().Value("user_id").(string)
rate, delay, allowed := rateLimiter.AllowMinute(userID, limit)
if !allowed {
h := w.Header()
h.Set("X-RateLimit-Limit", strconv.FormatInt(limit, 10))
h.Set("X-RateLimit-Remaining", strconv.FormatInt(limit-rate, 10))
delaySec := int64(delay / time.Second)
h.Set("X-RateLimit-Delay", strconv.FormatInt(delaySec, 10))
http.Error(w, "API rate limit exceeded.", 429)
buf := new(bytes.Buffer)
buf.WriteByte('\n')
fmt.Fprintf(buf, "Current rate: %d\n", rate)
fmt.Fprintf(buf, "Delay: %s\n", delay)
fmt.Fprintf(buf, "Allowed: %v\n", allowed)
fmt.Fprintf(buf, "Rate limit remaining: %s\n", strconv.FormatInt(limit-rate, 10))
buf.WriteTo(w)
return
}
next(w, r)
}
}
func handler(w http.ResponseWriter, _ *http.Request) {
fmt.Fprintf(w, "Hello world!\n")
}
func main:
redisClient := redis.NewClient(...)
limiter := redis_rate.NewLimiter(redisClient)
limit := int64(5)
http.HandleFunc("/", authorizeMiddleware(limiterMiddleware(limiter, limit, handler)))
log.Fatal(http.ListenAndServe("localhost:8820", nil))
from redis_rate.
Related Issues (20)
- Initialize the limit HOT 1
- WaitN
- How to retrieve the current state (peek)?
- how to clear old keys? HOT 1
- Dependency Dashboard
- questions about allown and allownMost
- Latency benchmarks
- Rate limiter not working as expected HOT 4
- Support go-redis v9? HOT 4
- Export rediser interface
- Problem with package "go-redis/redis/v10" vs "redis/go-redis/v10" HOT 1
- redis_rate.PerDay() ?? HOT 3
- dose lua script length limit?
- v is nil,occured pannic error HOT 1
- Delay returned by Allow* methods not explained
- why burst_offset is neccessary HOT 1
- Rate and Burst configurations are not clear HOT 1
- ERR bad lua script for redis cluster, all the keys that the script uses should be passed using the KEYS array, and KEYS should not be in expression
- change rate on the fly
- is it concurrency safe?
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from redis_rate.