-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathratelimiter.go
More file actions
45 lines (39 loc) · 1006 Bytes
/
ratelimiter.go
File metadata and controls
45 lines (39 loc) · 1006 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package ratelimiter
import (
"net/http"
"time"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
)
type Ratelimiter struct {
collector *Collector
logger zerolog.Logger
}
func NewRatelimiter(logger ...zerolog.Logger) *Ratelimiter {
if len(logger) == 0 {
logger = []zerolog.Logger{log.Logger}
}
return &Ratelimiter{
collector: NewCollector(logger[0]),
logger: logger[0].With().Str("component", "ratelimiter").Logger(),
}
}
func (r *Ratelimiter) Limit(req *http.Request) error {
res := r.collector.global.Reserve()
time.Sleep(res.Delay())
log.Debug().Msg("Got global reservation")
bucket, id := r.collector.GetBucket(req.URL.Path)
if bucket != nil {
res := bucket.Reserve()
if !res.OK() {
return NewErrUnavailable("not OK")
}
time.Sleep(res.Delay())
log.Debug().Str("bucket", id).Msg("Got bucket reservation")
}
return nil
}
func (r *Ratelimiter) Update(resp *http.Response) {
r.collector.UpdateFromResponse(resp)
log.Debug().Msg("Updated from response")
}