rate_limiter 0.0.2 → 0.0.3
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.
- data/CHANGELOG.md +10 -0
- data/lib/rate_limiter.rb +42 -1
- data/lib/rate_limiter/config.rb +2 -1
- data/lib/rate_limiter/controller.rb +37 -0
- data/lib/rate_limiter/model.rb +16 -1
- data/lib/rate_limiter/version.rb +1 -1
- metadata +3 -2
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
## v0.0.3
|
2
|
+
|
3
|
+
* Added more if and unless conditions for rate limiting.
|
4
|
+
* Added ability to enable or disable rate limiting on a controller or model.
|
5
|
+
* Added RateLimiter source for determining the current user.
|
6
|
+
|
7
|
+
## v0.0.2
|
8
|
+
|
9
|
+
* RateLimiter.config.timestamp_field actually does something now.
|
10
|
+
|
1
11
|
## v0.0.1
|
2
12
|
|
3
13
|
* Initial release.
|
data/lib/rate_limiter.rb
CHANGED
@@ -1,10 +1,27 @@
|
|
1
1
|
require 'singleton'
|
2
2
|
|
3
3
|
require 'rate_limiter/config'
|
4
|
+
require 'rate_limiter/controller'
|
4
5
|
require 'rate_limiter/model'
|
5
6
|
|
6
7
|
module RateLimiter
|
7
|
-
def self.
|
8
|
+
def self.enabled=(value)
|
9
|
+
RateLimiter.config.enabled = value
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.enabled?
|
13
|
+
!!RateLimiter.config.enabled
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.enabled_for_controller=(value)
|
17
|
+
RateLimiter.store[:request_enabled_for_controller] = value
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.enabled_for_controller?
|
21
|
+
!!RateLimiter.store[:request_enabled_for_controller]
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.timestamp_field=(field_name)
|
8
25
|
RateLimiter.config.timestamp_field = field_name
|
9
26
|
end
|
10
27
|
|
@@ -12,8 +29,28 @@ module RateLimiter
|
|
12
29
|
RateLimiter.config.timestamp_field
|
13
30
|
end
|
14
31
|
|
32
|
+
def self.source=(value)
|
33
|
+
RateLimiter.store[:source] = value
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.source
|
37
|
+
RateLimiter.store[:source]
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.controller_info=(value)
|
41
|
+
RateLimiter.store[:controller_info] = value
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.controller_info
|
45
|
+
RateLimiter.store[:controller_info]
|
46
|
+
end
|
47
|
+
|
15
48
|
private
|
16
49
|
|
50
|
+
def self.store
|
51
|
+
Thread.current[:rate_limiter] || { :request_enabled_for_controller => true }
|
52
|
+
end
|
53
|
+
|
17
54
|
def self.config
|
18
55
|
@@config ||= RateLimiter::Config.instance
|
19
56
|
end
|
@@ -22,3 +59,7 @@ end
|
|
22
59
|
ActiveSupport.on_load(:active_record) do
|
23
60
|
include RateLimiter::Model
|
24
61
|
end
|
62
|
+
|
63
|
+
ActiveSupport.on_load(:action_controller) do
|
64
|
+
include RateLimiter::Controller
|
65
|
+
end
|
data/lib/rate_limiter/config.rb
CHANGED
@@ -0,0 +1,37 @@
|
|
1
|
+
module RateLimiter
|
2
|
+
module Controller
|
3
|
+
def self.included(base)
|
4
|
+
base.before_filter :set_rate_limiter_source
|
5
|
+
base.before_filter :set_rate_limiter_controller_info
|
6
|
+
base.before_filter :set_rate_limiter_enabled_for_controller
|
7
|
+
end
|
8
|
+
|
9
|
+
protected
|
10
|
+
|
11
|
+
def user_for_rate_limiter
|
12
|
+
current_user rescue nil
|
13
|
+
end
|
14
|
+
|
15
|
+
def info_for_rate_limiter
|
16
|
+
{}
|
17
|
+
end
|
18
|
+
|
19
|
+
def rate_limiter_enabled_for_controller
|
20
|
+
true
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def set_rate_limiter_source
|
26
|
+
::RateLimiter.source = user_for_rate_limiter
|
27
|
+
end
|
28
|
+
|
29
|
+
def set_rate_limiter_controller_info
|
30
|
+
::RateLimiter.controller_info = info_for_rate_limiter
|
31
|
+
end
|
32
|
+
|
33
|
+
def set_rate_limiter_enabled_for_controller
|
34
|
+
::RateLimiter.enabled_for_controller = rate_limiter_enabled_for_controller
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/rate_limiter/model.rb
CHANGED
@@ -20,13 +20,24 @@ module RateLimiter
|
|
20
20
|
class_attribute :rate_limit_unless_condition
|
21
21
|
self.rate_limit_unless_condition = options[:unless]
|
22
22
|
|
23
|
+
class_attribute :rate_limit_enabled_for_model
|
24
|
+
self.rate_limit_enabled_for_model = true
|
25
|
+
|
26
|
+
def rate_limit_off
|
27
|
+
self.rate_limit_enabled_for_model = false
|
28
|
+
end
|
29
|
+
|
30
|
+
def rate_limit_on
|
31
|
+
self.rate_limit_enabled_for_model = true
|
32
|
+
end
|
33
|
+
|
23
34
|
self.before_create :check_rate_limit
|
24
35
|
end
|
25
36
|
end
|
26
37
|
|
27
38
|
module InstanceMethods
|
28
39
|
def check_rate_limit
|
29
|
-
if rate_limit?
|
40
|
+
if switched_on? && rate_limit?
|
30
41
|
klass = self.class
|
31
42
|
|
32
43
|
others = klass.where("#{klass.rate_limit_on.to_s} = ? AND #{RateLimiter.config.timestamp_field.to_s} >= ?", self.send(klass.rate_limit_on), Time.now - klass.rate_limit_interval)
|
@@ -44,6 +55,10 @@ module RateLimiter
|
|
44
55
|
end
|
45
56
|
end
|
46
57
|
|
58
|
+
def switched_on?
|
59
|
+
RateLimiter.enabled? && RateLimiter.enabled_for_controller? && self.class.rate_limit_enabled_for_model
|
60
|
+
end
|
61
|
+
|
47
62
|
def rate_limit?
|
48
63
|
(rate_limit_if_condition.blank? || rate_limit_if_condition.call(self)) && !rate_limit_unless_condition.try(:call, self)
|
49
64
|
end
|
data/lib/rate_limiter/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rate_limiter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-12-
|
12
|
+
date: 2012-12-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: railties
|
@@ -76,6 +76,7 @@ files:
|
|
76
76
|
- Rakefile
|
77
77
|
- lib/rate_limiter.rb
|
78
78
|
- lib/rate_limiter/config.rb
|
79
|
+
- lib/rate_limiter/controller.rb
|
79
80
|
- lib/rate_limiter/model.rb
|
80
81
|
- lib/rate_limiter/version.rb
|
81
82
|
- rate_limiter.gemspec
|