mirror of
https://github.com/christianselig/apollo-backend
synced 2024-11-10 22:17:44 +00:00
i am idiot
This commit is contained in:
parent
5ad98494ee
commit
907dc5510d
1 changed files with 20 additions and 19 deletions
|
@ -147,7 +147,7 @@ func (rc *Client) doRequest(r *Request) ([]byte, *RateLimitingInfo, error) {
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
|
|
||||||
rli := &RateLimitingInfo{Present: false}
|
rli := &RateLimitingInfo{Present: false}
|
||||||
if _, ok := resp.Header[RateLimitRemainingHeader]; ok {
|
if resp.Header.Get(RateLimitRemainingHeader) != "" {
|
||||||
rli.Present = true
|
rli.Present = true
|
||||||
rli.Remaining, _ = strconv.ParseFloat(resp.Header.Get(RateLimitRemainingHeader), 64)
|
rli.Remaining, _ = strconv.ParseFloat(resp.Header.Get(RateLimitRemainingHeader), 64)
|
||||||
rli.Reset, _ = strconv.Atoi(resp.Header.Get(RateLimitResetHeader))
|
rli.Reset, _ = strconv.Atoi(resp.Header.Get(RateLimitResetHeader))
|
||||||
|
@ -167,7 +167,7 @@ func (rc *Client) doRequest(r *Request) ([]byte, *RateLimitingInfo, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rac *AuthenticatedClient) request(r *Request, rh ResponseHandler, empty interface{}) (interface{}, error) {
|
func (rac *AuthenticatedClient) request(r *Request, rh ResponseHandler, empty interface{}) (interface{}, error) {
|
||||||
if rl, err := rac.isRateLimited(); rl || err != nil {
|
if rac.isRateLimited() {
|
||||||
return nil, ErrRateLimited
|
return nil, ErrRateLimited
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -191,17 +191,14 @@ func (rac *AuthenticatedClient) request(r *Request, rh ResponseHandler, empty in
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if err == nil && rli.Present && rli.Remaining <= RequestRemainingBuffer {
|
|
||||||
_ = rac.statsd.Incr("reddit.api.ratelimit", r.tags, 0.1)
|
|
||||||
rac.markRateLimited(rli.Remaining, time.Duration(rli.Reset)*time.Second)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
_ = rac.statsd.Incr("reddit.api.errors", r.tags, 0.1)
|
_ = rac.statsd.Incr("reddit.api.errors", r.tags, 0.1)
|
||||||
if strings.Contains(err.Error(), "http2: timeout awaiting response headers") {
|
if strings.Contains(err.Error(), "http2: timeout awaiting response headers") {
|
||||||
return nil, ErrTimeout
|
return nil, ErrTimeout
|
||||||
}
|
}
|
||||||
return nil, err
|
return nil, err
|
||||||
|
} else {
|
||||||
|
rac.markRateLimited(rli)
|
||||||
}
|
}
|
||||||
|
|
||||||
if r.emptyResponseBytes > 0 && len(bb) == r.emptyResponseBytes {
|
if r.emptyResponseBytes > 0 && len(bb) == r.emptyResponseBytes {
|
||||||
|
@ -219,30 +216,34 @@ func (rac *AuthenticatedClient) request(r *Request, rh ResponseHandler, empty in
|
||||||
return rh(val), nil
|
return rh(val), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rac *AuthenticatedClient) isRateLimited() (bool, error) {
|
func (rac *AuthenticatedClient) isRateLimited() bool {
|
||||||
if rac.redditId == SkipRateLimiting {
|
if rac.redditId == SkipRateLimiting {
|
||||||
return false, nil
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
key := fmt.Sprintf("reddit:%s:ratelimited", rac.redditId)
|
key := fmt.Sprintf("reddit:%s:ratelimited", rac.redditId)
|
||||||
_, err := rac.redis.Get(context.Background(), key).Result()
|
_, err := rac.redis.Get(context.Background(), key).Result()
|
||||||
|
return err != redis.Nil
|
||||||
if err == redis.Nil {
|
|
||||||
return false, nil
|
|
||||||
} else if err == nil {
|
|
||||||
return true, nil
|
|
||||||
} else {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rac *AuthenticatedClient) markRateLimited(remaining float64, duration time.Duration) error {
|
func (rac *AuthenticatedClient) markRateLimited(rli *RateLimitingInfo) error {
|
||||||
if rac.redditId == SkipRateLimiting {
|
if rac.redditId == SkipRateLimiting {
|
||||||
return ErrRequiresRedditId
|
return ErrRequiresRedditId
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !rli.Present {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if rli.Remaining > RequestRemainingBuffer {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
_ = rac.statsd.Incr("reddit.api.ratelimit", nil, 0.1)
|
||||||
|
|
||||||
key := fmt.Sprintf("reddit:%s:ratelimited", rac.redditId)
|
key := fmt.Sprintf("reddit:%s:ratelimited", rac.redditId)
|
||||||
_, err := rac.redis.SetEX(context.Background(), key, remaining, duration).Result()
|
duration := time.Duration(rli.Reset) * time.Second
|
||||||
|
_, err := rac.redis.SetEX(context.Background(), key, rli.Remaining, duration).Result()
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue