feat(api): create api proxy/ratelimiting/metrics
This commit is contained in:
43
services/web-proxy/rate_limit.go
Normal file
43
services/web-proxy/rate_limit.go
Normal file
@@ -0,0 +1,43 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"web-proxy/redis_rate"
|
||||
)
|
||||
|
||||
func is_api_ratelimited(rw http.ResponseWriter, r *http.Request) bool {
|
||||
var limit int
|
||||
var key string
|
||||
|
||||
if r.Header.Get("X-PluralKit-App") == token2 {
|
||||
limit = 20
|
||||
key = "token2"
|
||||
} else {
|
||||
limit = 2
|
||||
key = r.Header.Get("Fly-Client-IP")
|
||||
}
|
||||
|
||||
res, err := limiter.Allow(r.Context(), "ratelimit:"+key, redis_rate.Limit{
|
||||
Period: time.Second,
|
||||
Rate: limit,
|
||||
Burst: 5,
|
||||
})
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
rw.Header().Set("X-RateLimit-Limit", fmt.Sprint(limit))
|
||||
rw.Header().Set("X-RateLimit-Remaining", fmt.Sprint(res.Remaining))
|
||||
rw.Header().Set("X-RateLimit-Reset", fmt.Sprint(time.Now().Add(res.ResetAfter).UnixNano()/1_000_000))
|
||||
|
||||
if res.Allowed < 1 {
|
||||
rw.WriteHeader(429)
|
||||
rw.Write([]byte(`{"message":"429: too many requests","retry_after":` + fmt.Sprint(res.RetryAfter.Milliseconds()) + `,"code":0}`))
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
Reference in New Issue
Block a user