hobbit 0.3.1 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/README.md +75 -0
- data/lib/hobbit/base.rb +32 -4
- data/lib/hobbit/version.rb +1 -1
- data/spec/base_spec.rb +58 -0
- 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: 790649ff947ec7ea93289cc41f241ae04a2b60ea
|
4
|
+
data.tar.gz: af6820dcde77d613276b8f80a5a0bbef188c82c9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7a6f43952d33eb86244c7345b43a6490d487a1cc6934d428ebd0316433eaa7be801f0cc05a915cce7bf797fefe1b2184058974ddd10d9ef2aadbf114c56513b2
|
7
|
+
data.tar.gz: ea115f7eeb26199d18839cdfd1f03a6e05270effce2f95710e8694ccdbd7de8e24c89c18ceffa81256931e48231084dd61ed52e934280b073d0fa2da49707c26
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -229,6 +229,81 @@ end
|
|
229
229
|
run App.new
|
230
230
|
```
|
231
231
|
|
232
|
+
#### Halting
|
233
|
+
|
234
|
+
To immediately stop a request within a filter or route you must specify the
|
235
|
+
status:
|
236
|
+
|
237
|
+
```ruby
|
238
|
+
require 'hobbit'
|
239
|
+
|
240
|
+
class App < Hobbit::Base
|
241
|
+
use Rack::Session::Cookie, secret: SecureRandom.hex(64)
|
242
|
+
|
243
|
+
def session
|
244
|
+
env['rack.session']
|
245
|
+
end
|
246
|
+
|
247
|
+
get '/' do
|
248
|
+
halt 401 unless session['user_id']
|
249
|
+
end
|
250
|
+
end
|
251
|
+
```
|
252
|
+
|
253
|
+
And also you can add a body:
|
254
|
+
|
255
|
+
```ruby
|
256
|
+
require 'hobbit'
|
257
|
+
|
258
|
+
class App < Hobbit::Base
|
259
|
+
use Rack::Session::Cookie, secret: SecureRandom.hex(64)
|
260
|
+
|
261
|
+
def session
|
262
|
+
env['rack.session']
|
263
|
+
end
|
264
|
+
|
265
|
+
get '/' do
|
266
|
+
halt 401, body: 'This will be the body' unless session['user_id']
|
267
|
+
end
|
268
|
+
end
|
269
|
+
```
|
270
|
+
|
271
|
+
Or headers:
|
272
|
+
|
273
|
+
```ruby
|
274
|
+
require 'hobbit'
|
275
|
+
|
276
|
+
class App < Hobbit::Base
|
277
|
+
use Rack::Session::Cookie, secret: SecureRandom.hex(64)
|
278
|
+
|
279
|
+
def session
|
280
|
+
env['rack.session']
|
281
|
+
end
|
282
|
+
|
283
|
+
get '/' do
|
284
|
+
halt 401, headers: { 'Content-Type' => 'text/html; charset=utf-8' }
|
285
|
+
end
|
286
|
+
end
|
287
|
+
```
|
288
|
+
|
289
|
+
Or both:
|
290
|
+
|
291
|
+
``` ruby
|
292
|
+
require 'hobbit'
|
293
|
+
|
294
|
+
class App < Hobbit::Base
|
295
|
+
use Rack::Session::Cookie, secret: SecureRandom.hex(64)
|
296
|
+
|
297
|
+
def session
|
298
|
+
env['rack.session']
|
299
|
+
end
|
300
|
+
|
301
|
+
get '/' do
|
302
|
+
halt 401, headers: { 'Content-Type' => 'text/html; charset=utf-8' }, body: 'Woops'
|
303
|
+
end
|
304
|
+
end
|
305
|
+
```
|
306
|
+
|
232
307
|
### Security
|
233
308
|
|
234
309
|
By default, Hobbit (nor Rack) comes without any protection against web
|
data/lib/hobbit/base.rb
CHANGED
@@ -55,19 +55,47 @@ module Hobbit
|
|
55
55
|
@response.finish
|
56
56
|
end
|
57
57
|
|
58
|
+
# Stops the execution and return a response
|
59
|
+
#
|
60
|
+
# status | Number - HTTP status code
|
61
|
+
# body | Response body
|
62
|
+
# headers | Response headers
|
63
|
+
#
|
64
|
+
def halt(status, headers: {}, body: [])
|
65
|
+
response.status = status # Without a default, the user must know why is using halt
|
66
|
+
response.headers = headers
|
67
|
+
response.body = Array(body) # With this we support strings, arrays or hashes
|
68
|
+
|
69
|
+
throw :halt, response
|
70
|
+
end
|
71
|
+
|
58
72
|
private
|
59
73
|
|
60
74
|
def route_eval
|
61
|
-
|
75
|
+
catch :halt do
|
76
|
+
if route = find_route
|
77
|
+
response.write instance_eval(&route[:block])
|
78
|
+
else
|
79
|
+
halt 404
|
80
|
+
end
|
81
|
+
|
82
|
+
response
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def find_route
|
87
|
+
route = self.class.routes[request.request_method].detect do |r|
|
88
|
+
r[:compiled_path] =~ request.path_info
|
89
|
+
end
|
90
|
+
|
62
91
|
if route
|
63
92
|
$~.captures.each_with_index do |value, index|
|
64
93
|
param = route[:extra_params][index]
|
65
94
|
request.params[param] = value
|
66
95
|
end
|
67
|
-
response.write instance_eval(&route[:block])
|
68
|
-
else
|
69
|
-
response.status = 404
|
70
96
|
end
|
97
|
+
|
98
|
+
route
|
71
99
|
end
|
72
100
|
end
|
73
101
|
end
|
data/lib/hobbit/version.rb
CHANGED
data/spec/base_spec.rb
CHANGED
@@ -205,6 +205,64 @@ EOS
|
|
205
205
|
end
|
206
206
|
end
|
207
207
|
|
208
|
+
describe '::halt' do
|
209
|
+
before do
|
210
|
+
mock_app do
|
211
|
+
get '/halt' do
|
212
|
+
halt 501
|
213
|
+
response.write 'Hello world'
|
214
|
+
end
|
215
|
+
|
216
|
+
get '/halt_string' do
|
217
|
+
halt 501, body: 'Halt!'
|
218
|
+
end
|
219
|
+
|
220
|
+
get '/halt_array' do
|
221
|
+
halt 501, body: ['Halt!']
|
222
|
+
end
|
223
|
+
|
224
|
+
get '/halt_hash' do
|
225
|
+
halt 501, body: { message: 'Halt!' }
|
226
|
+
end
|
227
|
+
|
228
|
+
get '/halt_headers' do
|
229
|
+
halt 501, headers: { header: 'OK' }
|
230
|
+
end
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
it 'return the response given to halt function' do
|
235
|
+
get '/halt'
|
236
|
+
last_response.headers.must_equal({ 'Content-Length' => nil })
|
237
|
+
last_response.body.must_equal ''
|
238
|
+
last_response.status.must_equal 501
|
239
|
+
end
|
240
|
+
|
241
|
+
it 'accepts a string as body' do
|
242
|
+
get '/halt_string'
|
243
|
+
last_response.body.must_equal 'Halt!'
|
244
|
+
last_response.status.must_equal 501
|
245
|
+
end
|
246
|
+
|
247
|
+
it 'accepts an Array as body' do
|
248
|
+
get '/halt_array'
|
249
|
+
last_response.body.must_equal 'Halt!'
|
250
|
+
last_response.status.must_equal 501
|
251
|
+
end
|
252
|
+
|
253
|
+
it 'accepts a Hash as body' do
|
254
|
+
get '/halt_hash'
|
255
|
+
last_response.body.must_equal '[:message, "Halt!"]'
|
256
|
+
last_response.status.must_equal 501
|
257
|
+
end
|
258
|
+
|
259
|
+
it 'accepts headers' do
|
260
|
+
get '/halt_headers'
|
261
|
+
last_response.headers.must_equal({ header: 'OK', 'Content-Length' => nil })
|
262
|
+
last_response.status.must_equal 501
|
263
|
+
end
|
264
|
+
end
|
265
|
+
|
208
266
|
it 'must respond to call' do
|
209
267
|
app.to_app.must_respond_to :call
|
210
268
|
end
|