sinatra-rate-limiter 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +4 -3
- data/lib/sinatra/rate-limiter.rb +11 -11
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e2eb98d3fb4708f2dde94dc7aa8fac5e790eea55
|
4
|
+
data.tar.gz: eff8f03476da900eff856f94b20989608cd07c1d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cc4c520d384178af38c646dd55aedfcf08ee89d96a464825b4c26f3ddc66e3084e9a0a2831d2e68772073c75dd583b97636acb9a29b0fd96aec670ba2c22661b
|
7
|
+
data.tar.gz: 409c06eefea02caf1cea1c6a7b8a5fa662abaa7647a11660011c6a30e2c5ff2fada3e04e8f565a6e5f75e3e5452353922476b1bf4d2c4e1e2b568d07a996cb26
|
data/README.md
CHANGED
@@ -66,9 +66,10 @@ See the _Examples_ section below for usage examples.
|
|
66
66
|
### Error handling
|
67
67
|
|
68
68
|
When a rate limit is exceeded, the exception `Sinatra::RateLimiter::Exceeded`
|
69
|
-
is thrown. By default, this sends an response code `429` with
|
70
|
-
|
71
|
-
|
69
|
+
is thrown. By default, this sends an response code `429` with a simple plain
|
70
|
+
text error message. You can use Sinatra's error handling to customise this.
|
71
|
+
|
72
|
+
E.g.:
|
72
73
|
|
73
74
|
```
|
74
75
|
error Sinatra::RateLimiter::Exceeded do
|
data/lib/sinatra/rate-limiter.rb
CHANGED
@@ -20,20 +20,16 @@ module Sinatra
|
|
20
20
|
limiter.request = request
|
21
21
|
limiter.options = options
|
22
22
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
end
|
23
|
+
limiter.headers.each{|h,v| response.headers[h] = v} if limiter.options.send_headers
|
24
|
+
|
25
|
+
if (error_locals = limiter.limits_exceeded?)
|
26
|
+
response.headers['Retry-After'] = error_locals[:try_again] if limiter.options.send_headers
|
28
27
|
|
29
28
|
request.env['sinatra.error.rate_limiter'] = Struct.new(*error_locals.keys).new(*error_locals.values)
|
30
|
-
raise Sinatra::RateLimiter::Exceeded, "
|
31
|
-
" #{error_locals[:requests]} requests in #{error_locals[:seconds]} seconds." +
|
32
|
-
" Try again in #{error_locals[:try_again]} seconds."
|
29
|
+
raise Sinatra::RateLimiter::Exceeded, "#{bucket.eql?('default') ? 'R' : bucket + ' r'}ate limit exceeded"
|
33
30
|
end
|
34
31
|
|
35
32
|
limiter.log_request
|
36
|
-
limiter.headers.each{|h,v| response.headers[h] = v} if limiter.options.send_headers
|
37
33
|
end
|
38
34
|
|
39
35
|
private
|
@@ -92,7 +88,11 @@ module Sinatra
|
|
92
88
|
app.error Sinatra::RateLimiter::Exceeded do
|
93
89
|
status 429
|
94
90
|
content_type 'text/plain'
|
95
|
-
|
91
|
+
|
92
|
+
"#{env['sinatra.error.rate_limiter'].bucket.eql?('default') ? 'R' : env['sinatra.error.rate_limiter'].bucket + ' R'}" +
|
93
|
+
"ate limit exceeded: #{env['sinatra.error.rate_limiter'].requests} requests" +
|
94
|
+
" in #{env['sinatra.error.rate_limiter'].seconds} seconds." +
|
95
|
+
" Try again in #{env['sinatra.error.rate_limiter'].try_again} seconds."
|
96
96
|
end
|
97
97
|
end
|
98
98
|
|
@@ -144,7 +144,7 @@ module Sinatra
|
|
144
144
|
|
145
145
|
if exceeded
|
146
146
|
try_again = limit_reset(exceeded)
|
147
|
-
return exceeded.merge({try_again: try_again.to_i})
|
147
|
+
return exceeded.merge({try_again: try_again.to_i, bucket: @bucket})
|
148
148
|
end
|
149
149
|
end
|
150
150
|
|