rack-attack-rate-limit 0.1.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.rubocop.yml +6 -0
- data/CHANGELOG.md +12 -0
- data/lib/rack/attack/rate-limit.rb +21 -16
- data/lib/rack/attack/rate-limit/version.rb +2 -2
- data/rack-attack-rate-limit.gemspec +6 -5
- data/spec/spec_helper.rb +3 -5
- metadata +36 -32
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ae6161b3d1a8760682d587b41b570240aea058f4
|
4
|
+
data.tar.gz: 96c6e87f6143f46feb7c38c136a16c00fc6e7188
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4b487f260716def9aa4bba218fcbda154a214132eaaa0055cc13e6e90702f9008d2bc146fd0c00d86f4f77ac1c186c9a0f6d6898a276d2f9ad723c2f78f520b8
|
7
|
+
data.tar.gz: 6a34a589b16e7ea377ed4e1ec751ffee171a0897d11e6087b3f1ac339aef2bcbcb9ca1f966eadd0bb21682f273640bda3f2fd8e91441cd141a8a3689e1eceaa1
|
data/.rubocop.yml
ADDED
data/CHANGELOG.md
ADDED
@@ -1,11 +1,17 @@
|
|
1
|
+
unless defined?(Rack::Attack)
|
2
|
+
module Rack
|
3
|
+
class Attack
|
4
|
+
end
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
1
8
|
module Rack
|
2
|
-
|
9
|
+
class Attack
|
3
10
|
class RateLimit
|
4
|
-
|
5
11
|
RACK_ATTACK_KEY = 'rack.attack.throttle_data'
|
6
12
|
|
7
13
|
attr_reader :app, :options
|
8
|
-
|
14
|
+
|
9
15
|
def initialize(app, options = {})
|
10
16
|
@app = app
|
11
17
|
@options = default_options.merge(options)
|
@@ -13,31 +19,31 @@ module Rack
|
|
13
19
|
|
14
20
|
def call(env)
|
15
21
|
# If env does not have necessary data to extract rate limit data for the provider, then app.call
|
16
|
-
return app.call(env) unless rate_limit_available?(env)
|
22
|
+
return app.call(env) unless rate_limit_available?(env)
|
17
23
|
# Otherwise, add rate limit headers
|
18
24
|
status, headers, body = app.call(env)
|
19
25
|
add_rate_limit_headers!(headers, env)
|
20
|
-
[status, headers, body]
|
26
|
+
[status, headers, body]
|
21
27
|
end
|
22
|
-
|
28
|
+
|
23
29
|
# Returns env key used by Rack::Attack to namespace data
|
24
30
|
#
|
25
31
|
# Returns string
|
26
32
|
def rack_attack_key
|
27
33
|
RACK_ATTACK_KEY
|
28
34
|
end
|
29
|
-
|
35
|
+
|
30
36
|
# Default options to configure Rack::RateLimit
|
31
37
|
#
|
32
38
|
# Returns hash
|
33
39
|
def default_options
|
34
40
|
{ throttle: 'throttle' }
|
35
41
|
end
|
36
|
-
|
42
|
+
|
37
43
|
def throttle
|
38
44
|
options[:throttle] || ''
|
39
45
|
end
|
40
|
-
|
46
|
+
|
41
47
|
# Return hash of headers with Rate Limiting data
|
42
48
|
#
|
43
49
|
# headers - Hash of headers
|
@@ -48,9 +54,9 @@ module Rack
|
|
48
54
|
headers['X-RateLimit-Remaining'] = rate_limit_remaining(env).to_s
|
49
55
|
headers
|
50
56
|
end
|
51
|
-
|
57
|
+
|
52
58
|
protected
|
53
|
-
|
59
|
+
|
54
60
|
# RateLimit upper limit from Rack::Attack
|
55
61
|
#
|
56
62
|
# env - Hash
|
@@ -59,7 +65,7 @@ module Rack
|
|
59
65
|
def rate_limit_limit(env)
|
60
66
|
env[rack_attack_key][throttle][:limit]
|
61
67
|
end
|
62
|
-
|
68
|
+
|
63
69
|
# RateLimit remaining request from Rack::Attack
|
64
70
|
#
|
65
71
|
# env - Hash
|
@@ -68,17 +74,16 @@ module Rack
|
|
68
74
|
def rate_limit_remaining(env)
|
69
75
|
rate_limit_limit(env) - env[rack_attack_key][throttle][:count]
|
70
76
|
end
|
71
|
-
|
77
|
+
|
72
78
|
# Rate Limit available method for Rack::Attack provider
|
73
79
|
# Checks the key identifed by options[:namespace] under the rack.attak.throttle_data env hash key
|
74
80
|
#
|
75
81
|
# env - Hash
|
76
82
|
#
|
77
|
-
# Returns boolean
|
83
|
+
# Returns boolean
|
78
84
|
def rate_limit_available?(env)
|
79
|
-
env.key?(rack_attack_key)
|
85
|
+
env.key?(rack_attack_key) && env[rack_attack_key].key?(throttle)
|
80
86
|
end
|
81
|
-
|
82
87
|
end
|
83
88
|
end
|
84
89
|
end
|
@@ -18,12 +18,13 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
19
19
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
20
20
|
spec.require_paths = ["lib"]
|
21
|
-
|
21
|
+
|
22
22
|
spec.add_dependency 'rack'
|
23
23
|
|
24
24
|
spec.add_development_dependency "bundler", "~> 1.3"
|
25
|
-
spec.add_development_dependency
|
26
|
-
spec.add_development_dependency
|
27
|
-
spec.add_development_dependency
|
28
|
-
|
25
|
+
spec.add_development_dependency 'rake'
|
26
|
+
spec.add_development_dependency 'rspec'
|
27
|
+
spec.add_development_dependency 'rack-test'
|
28
|
+
spec.add_development_dependency 'rubocop'
|
29
|
+
|
29
30
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -5,10 +5,8 @@ require 'rack/test'
|
|
5
5
|
require 'rack/attack/rate-limit'
|
6
6
|
|
7
7
|
RSpec::configure do |config|
|
8
|
-
|
8
|
+
|
9
9
|
config.treat_symbols_as_metadata_keys_with_true_values = true
|
10
|
-
config.formatter = :documentation
|
10
|
+
config.formatter = :documentation
|
11
11
|
config.tty = true
|
12
|
-
|
13
|
-
|
14
|
-
end
|
12
|
+
end
|
metadata
CHANGED
@@ -1,105 +1,110 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-attack-rate-limit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
5
|
-
prerelease:
|
4
|
+
version: 1.0.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Jason Byck
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-06-23 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: rack
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - ">="
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - ">="
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '0'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: bundler
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- - ~>
|
31
|
+
- - "~>"
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: '1.3'
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- - ~>
|
38
|
+
- - "~>"
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: '1.3'
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: rake
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - ">="
|
52
46
|
- !ruby/object:Gem::Version
|
53
47
|
version: '0'
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - ">="
|
60
53
|
- !ruby/object:Gem::Version
|
61
54
|
version: '0'
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: rspec
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
|
-
- -
|
59
|
+
- - ">="
|
68
60
|
- !ruby/object:Gem::Version
|
69
61
|
version: '0'
|
70
62
|
type: :development
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
|
-
- -
|
66
|
+
- - ">="
|
76
67
|
- !ruby/object:Gem::Version
|
77
68
|
version: '0'
|
78
69
|
- !ruby/object:Gem::Dependency
|
79
70
|
name: rack-test
|
80
71
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
72
|
requirements:
|
83
|
-
- -
|
73
|
+
- - ">="
|
84
74
|
- !ruby/object:Gem::Version
|
85
75
|
version: '0'
|
86
76
|
type: :development
|
87
77
|
prerelease: false
|
88
78
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
79
|
requirements:
|
91
|
-
- -
|
80
|
+
- - ">="
|
92
81
|
- !ruby/object:Gem::Version
|
93
82
|
version: '0'
|
94
|
-
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rubocop
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
description: " Add RateLimit headers for Rack::Attack throttling "
|
95
98
|
email:
|
96
99
|
- jasonbyck@gmail.com
|
97
100
|
executables: []
|
98
101
|
extensions: []
|
99
102
|
extra_rdoc_files: []
|
100
103
|
files:
|
101
|
-
- .gitignore
|
102
|
-
- .
|
104
|
+
- ".gitignore"
|
105
|
+
- ".rubocop.yml"
|
106
|
+
- ".travis.yml"
|
107
|
+
- CHANGELOG.md
|
103
108
|
- Gemfile
|
104
109
|
- LICENSE.txt
|
105
110
|
- README.md
|
@@ -112,27 +117,26 @@ files:
|
|
112
117
|
homepage: https://github.com/jbyck/rack-attack-rate-limit
|
113
118
|
licenses:
|
114
119
|
- MIT
|
120
|
+
metadata: {}
|
115
121
|
post_install_message:
|
116
122
|
rdoc_options: []
|
117
123
|
require_paths:
|
118
124
|
- lib
|
119
125
|
required_ruby_version: !ruby/object:Gem::Requirement
|
120
|
-
none: false
|
121
126
|
requirements:
|
122
|
-
- -
|
127
|
+
- - ">="
|
123
128
|
- !ruby/object:Gem::Version
|
124
129
|
version: '0'
|
125
130
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
126
|
-
none: false
|
127
131
|
requirements:
|
128
|
-
- -
|
132
|
+
- - ">="
|
129
133
|
- !ruby/object:Gem::Version
|
130
134
|
version: '0'
|
131
135
|
requirements: []
|
132
136
|
rubyforge_project:
|
133
|
-
rubygems_version:
|
137
|
+
rubygems_version: 2.2.2
|
134
138
|
signing_key:
|
135
|
-
specification_version:
|
139
|
+
specification_version: 4
|
136
140
|
summary: Add RateLimit headers for Rack::Attack throttling
|
137
141
|
test_files:
|
138
142
|
- spec/rack/attack/rate-limit_spec.rb
|