lhc 12.2.1 → 12.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +10 -4
- data/lib/lhc/interceptors/throttle.rb +7 -6
- data/lib/lhc/version.rb +1 -1
- data/spec/interceptors/throttle/main_spec.rb +80 -19
- 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: edceeb5ec4bd94dd580a56ed8a0ed0a71a31a8bd5c0b1f08dc96c7f8614d42b3
|
4
|
+
data.tar.gz: 183c118e2861b420877c37dfc8f86643d8fd410f8c2abbb8d681cdd168956108
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 92bd31139ebf0bc508e0681c99c5f35b8b9c93b0a6f56fdf2fcdbfb1faa1c3fa80c2894d48ebc31ad8c4138af5df9548b3f65f87a33bb5ebbf5a873a8d696585
|
7
|
+
data.tar.gz: 5b4f2fee1a99c4823ad1d0231624d6bf62794bff60bc27379c180b676439b88f89242813a2b306e44dde1946985114fa1190b1e67a22befdc089f41af520f759
|
data/README.md
CHANGED
@@ -895,16 +895,22 @@ LHC.get('http://local.ch', options)
|
|
895
895
|
LHC.get('http://local.ch', options)
|
896
896
|
# raises LHC::Throttle::OutOfQuota: Reached predefined quota for local.ch
|
897
897
|
```
|
898
|
+
|
898
899
|
**Options Description**
|
899
900
|
* `track`: enables tracking of current limit/remaining requests of rate-limiting
|
900
901
|
* `break`: quota in percent after which errors are raised. Percentage symbol is optional, values will be converted to integer (e.g. '23.5' will become 23)
|
901
902
|
* `provider`: name of the provider under which throttling tracking is aggregated,
|
902
|
-
* `limit`:
|
903
|
+
* `limit`:
|
904
|
+
* a hard-coded integer
|
905
|
+
* a hash pointing at the response header containing the limit value
|
906
|
+
* a proc that receives the response as argument and returns the limit value
|
903
907
|
* `remaining`:
|
904
908
|
* a hash pointing at the response header containing the current amount of remaining requests
|
905
|
-
* a proc that receives the response as argument and returns the current amount
|
906
|
-
|
907
|
-
*
|
909
|
+
* a proc that receives the response as argument and returns the current amount of remaining requests
|
910
|
+
* `expires`:
|
911
|
+
* a hash pointing at the response header containing the timestamp when the quota will reset
|
912
|
+
* a proc that receives the response as argument and returns the timestamp when the quota will reset
|
913
|
+
|
908
914
|
|
909
915
|
#### Zipkin
|
910
916
|
|
@@ -49,12 +49,12 @@ class LHC::Throttle < LHC::Interceptor
|
|
49
49
|
|
50
50
|
def limit(options:, response:)
|
51
51
|
@limit ||=
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
52
|
+
if options.is_a?(Proc)
|
53
|
+
options.call(response)
|
54
|
+
elsif options.is_a?(Integer)
|
55
|
+
options
|
56
|
+
elsif options.is_a?(Hash) && options[:header]
|
57
|
+
response.headers[options[:header]]&.to_i
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
@@ -79,6 +79,7 @@ class LHC::Throttle < LHC::Interceptor
|
|
79
79
|
|
80
80
|
def convert_expires(value)
|
81
81
|
return if value.blank?
|
82
|
+
return value.call(response) if value.is_a?(Proc)
|
82
83
|
return Time.parse(value) if value.match(/GMT/)
|
83
84
|
Time.zone.at(value.to_i).to_datetime
|
84
85
|
end
|
data/lib/lhc/version.rb
CHANGED
@@ -100,34 +100,95 @@ describe LHC::Throttle do
|
|
100
100
|
end
|
101
101
|
end
|
102
102
|
|
103
|
-
describe '
|
104
|
-
|
105
|
-
|
106
|
-
|
103
|
+
describe 'configuration values as Procs' do
|
104
|
+
describe 'calculate "limit" in proc' do
|
105
|
+
let(:options_limit) do
|
106
|
+
->(*) { 10_000 }
|
107
|
+
end
|
108
|
+
|
109
|
+
before(:each) do
|
110
|
+
LHC.get('http://local.ch', options)
|
111
|
+
end
|
112
|
+
|
113
|
+
context 'breaks' do
|
114
|
+
let(:options_break) { '80%' }
|
115
|
+
|
116
|
+
it 'hit the breaks if throttling quota is reached' do
|
117
|
+
expect { LHC.get('http://local.ch', options) }.to raise_error(
|
118
|
+
LHC::Throttle::OutOfQuota,
|
119
|
+
'Reached predefined quota for local.ch'
|
120
|
+
)
|
121
|
+
end
|
122
|
+
|
123
|
+
context 'still within quota' do
|
124
|
+
let(:options_break) { '90%' }
|
125
|
+
|
126
|
+
it 'does not hit the breaks' do
|
127
|
+
LHC.get('http://local.ch', options)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
107
131
|
end
|
108
132
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
133
|
+
describe 'calculate "remaining" in proc' do
|
134
|
+
let(:quota_current) { 8100 }
|
135
|
+
let(:options_remaining) do
|
136
|
+
->(response) { (response.headers['limit']).to_i - (response.headers['current']).to_i }
|
137
|
+
end
|
138
|
+
|
139
|
+
before(:each) do
|
140
|
+
stub_request(:get, 'http://local.ch').to_return(
|
141
|
+
headers: { 'limit' => quota_limit, 'current' => quota_current, 'reset' => quota_reset }
|
142
|
+
)
|
143
|
+
LHC.get('http://local.ch', options)
|
144
|
+
end
|
145
|
+
|
146
|
+
context 'breaks' do
|
147
|
+
let(:options_break) { '80%' }
|
148
|
+
|
149
|
+
it 'hit the breaks if throttling quota is reached' do
|
150
|
+
expect { LHC.get('http://local.ch', options) }.to raise_error(
|
151
|
+
LHC::Throttle::OutOfQuota,
|
152
|
+
'Reached predefined quota for local.ch'
|
153
|
+
)
|
154
|
+
end
|
155
|
+
|
156
|
+
context 'still within quota' do
|
157
|
+
let(:options_break) { '90%' }
|
158
|
+
|
159
|
+
it 'does not hit the breaks' do
|
160
|
+
LHC.get('http://local.ch', options)
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
114
164
|
end
|
115
165
|
|
116
|
-
|
117
|
-
let(:
|
166
|
+
describe 'calculate "reset" in proc' do
|
167
|
+
let(:options_expires) { ->(*) { Time.zone.now + 1.second } }
|
118
168
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
'Reached predefined quota for local.ch'
|
169
|
+
before(:each) do
|
170
|
+
stub_request(:get, 'http://local.ch').to_return(
|
171
|
+
headers: { 'limit' => quota_limit, 'remaining' => quota_remaining }
|
123
172
|
)
|
173
|
+
LHC.get('http://local.ch', options)
|
124
174
|
end
|
125
175
|
|
126
|
-
context '
|
127
|
-
let(:options_break) { '
|
176
|
+
context 'breaks' do
|
177
|
+
let(:options_break) { '80%' }
|
128
178
|
|
129
|
-
it '
|
130
|
-
LHC.get('http://local.ch', options)
|
179
|
+
it 'hit the breaks if throttling quota is reached' do
|
180
|
+
expect { LHC.get('http://local.ch', options) }.to raise_error(
|
181
|
+
LHC::Throttle::OutOfQuota,
|
182
|
+
'Reached predefined quota for local.ch'
|
183
|
+
)
|
184
|
+
end
|
185
|
+
|
186
|
+
context 'still within quota' do
|
187
|
+
let(:options_break) { '90%' }
|
188
|
+
|
189
|
+
it 'does not hit the breaks' do
|
190
|
+
LHC.get('http://local.ch', options)
|
191
|
+
end
|
131
192
|
end
|
132
193
|
end
|
133
194
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lhc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 12.
|
4
|
+
version: 12.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- https://github.com/local-ch/lhc/contributors
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-08-
|
11
|
+
date: 2020-08-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|