74 lines
1.7 KiB
Go
74 lines
1.7 KiB
Go
package throttled
|
|
|
|
import (
|
|
"net/http"
|
|
"time"
|
|
)
|
|
|
|
// DEPRECATED. Quota returns the number of requests allowed and the custom time window.
|
|
func (q Rate) Quota() (int, time.Duration) {
|
|
return q.count, q.period * time.Duration(q.count)
|
|
}
|
|
|
|
// DEPRECATED. Q represents a custom quota.
|
|
type Q struct {
|
|
Requests int
|
|
Window time.Duration
|
|
}
|
|
|
|
// DEPRECATED. Quota returns the number of requests allowed and the custom time window.
|
|
func (q Q) Quota() (int, time.Duration) {
|
|
return q.Requests, q.Window
|
|
}
|
|
|
|
// DEPRECATED. The Quota interface defines the method to implement to describe
|
|
// a time-window quota, as required by the RateLimit throttler.
|
|
type Quota interface {
|
|
// Quota returns a number of requests allowed, and a duration.
|
|
Quota() (int, time.Duration)
|
|
}
|
|
|
|
// DEPRECATED. Throttler is a backwards-compatible alias for HTTPLimiter.
|
|
type Throttler struct {
|
|
HTTPRateLimiter
|
|
}
|
|
|
|
// DEPRECATED. Throttle is an alias for HTTPLimiter#Limit
|
|
func (t *Throttler) Throttle(h http.Handler) http.Handler {
|
|
return t.RateLimit(h)
|
|
}
|
|
|
|
// DEPRECATED. RateLimit creates a Throttler that conforms to the given
|
|
// rate limits
|
|
func RateLimit(q Quota, vary *VaryBy, store GCRAStore) *Throttler {
|
|
count, period := q.Quota()
|
|
|
|
if count < 1 {
|
|
count = 1
|
|
}
|
|
if period <= 0 {
|
|
period = time.Second
|
|
}
|
|
|
|
rate := Rate{period: period / time.Duration(count)}
|
|
limiter, err := NewGCRARateLimiter(store, RateQuota{rate, count - 1})
|
|
|
|
// This panic in unavoidable because the original interface does
|
|
// not support returning an error.
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
return &Throttler{
|
|
HTTPRateLimiter{
|
|
RateLimiter: limiter,
|
|
VaryBy: vary,
|
|
},
|
|
}
|
|
}
|
|
|
|
// DEPRECATED. Store is an alias for GCRAStore
|
|
type Store interface {
|
|
GCRAStore
|
|
}
|