millrace 0.1.0 → 0.1.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 +23 -0
- data/lib/millrace/rate_limit.rb +3 -7
- data/lib/millrace/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d1a9fd88ce31a92e5f735102b1ff07bdcd65d40ad6381a558996005f02dc47e2
|
4
|
+
data.tar.gz: c3c6396bc63e2bbc35a89dcb425b70786fc89af743fa1daad2ad4710c9855c54
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b84c05d38d74d43a5f3fa36847a74ce9057076192cdd97b999513ceba2fe44a85c0c64d914a0642ca6fc54d4b821d8729e7244b83e9061412af1ac13ed3f0429
|
7
|
+
data.tar.gz: '0438195141540b2e865676b7eef7837323c2ebc7bac91f11d9088d2bd1f12a6e850b7c340038379e3ef7c93422386eff3e5c5b7d6bb0526763d4568dfdd0e375'
|
data/README.md
CHANGED
@@ -1,5 +1,28 @@
|
|
1
1
|
# Millrace
|
2
2
|
|
3
|
+
## Usage
|
4
|
+
|
5
|
+
```
|
6
|
+
class UsersController
|
7
|
+
|
8
|
+
before_action Millrace::RateLimit.new(
|
9
|
+
name: "follows",
|
10
|
+
rate: 1/60.0, # 1 request per minute
|
11
|
+
window: 1.minute,
|
12
|
+
penalty: 10.minutes,
|
13
|
+
), only: :create
|
14
|
+
|
15
|
+
rescue_from Millrace::RateLimited do |error|
|
16
|
+
# perhaps record metrics here
|
17
|
+
response.set_header "Retry-After", error.retry_after
|
18
|
+
head :too_many_requests
|
19
|
+
end
|
20
|
+
|
21
|
+
...
|
22
|
+
|
23
|
+
end
|
24
|
+
```
|
25
|
+
|
3
26
|
## Contributing
|
4
27
|
|
5
28
|
Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/millrace. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/[USERNAME]/millrace/blob/main/CODE_OF_CONDUCT.md).
|
data/lib/millrace/rate_limit.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
girequire "digest"
|
2
2
|
require "prorate"
|
3
3
|
|
4
4
|
module Millrace
|
@@ -15,9 +15,9 @@ module Millrace
|
|
15
15
|
|
16
16
|
def before(controller)
|
17
17
|
bucket = get_bucket(controller.request.remote_ip)
|
18
|
-
level =
|
18
|
+
level = bucket.fillup(1).level
|
19
19
|
|
20
|
-
return
|
20
|
+
return if level < threshold
|
21
21
|
|
22
22
|
if level - 1 < threshold
|
23
23
|
level = bucket.fillup(penalty).level
|
@@ -32,10 +32,6 @@ module Millrace
|
|
32
32
|
((level - threshold) / rate).to_i
|
33
33
|
end
|
34
34
|
|
35
|
-
def record_request(bucket)
|
36
|
-
bucket.fillup(1).level
|
37
|
-
end
|
38
|
-
|
39
35
|
def get_bucket(ip)
|
40
36
|
Prorate::LeakyBucket.new(
|
41
37
|
redis: redis,
|
data/lib/millrace/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: millrace
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ed Robinson
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-06-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: prorate
|