helmet 0.0.6 → 0.1.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.
- data/lib/helmet/api.rb +54 -43
- data/lib/helmet/handler.rb +68 -0
- data/lib/helmet/response.rb +28 -0
- data/lib/helmet/templates.rb +4 -4
- metadata +3 -1
data/lib/helmet/api.rb
CHANGED
@@ -1,37 +1,30 @@
|
|
1
1
|
require 'goliath/api'
|
2
2
|
|
3
|
-
require 'helmet/
|
3
|
+
require 'helmet/handler'
|
4
4
|
|
5
5
|
module Helmet
|
6
6
|
class API < Goliath::API
|
7
|
-
|
8
|
-
# Handle application routes
|
9
|
-
@@routes = {}
|
10
|
-
|
11
|
-
# Handle before filters
|
12
|
-
@@before_filters = []
|
13
7
|
|
14
8
|
class << self
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
@@public_folder = folder
|
9
|
+
|
10
|
+
def set(key, value)
|
11
|
+
@config[key.to_sym] = value
|
19
12
|
end
|
20
13
|
|
21
|
-
def
|
22
|
-
|
14
|
+
def config(key)
|
15
|
+
@config[key.to_sym]
|
23
16
|
end
|
24
|
-
|
25
|
-
def
|
26
|
-
|
17
|
+
|
18
|
+
def before(route, &block)
|
19
|
+
@before_filters << [route, block]
|
27
20
|
end
|
28
|
-
|
29
|
-
def
|
30
|
-
|
21
|
+
|
22
|
+
def routes
|
23
|
+
@routes
|
31
24
|
end
|
32
25
|
|
33
|
-
def
|
34
|
-
|
26
|
+
def before_filters
|
27
|
+
@before_filters
|
35
28
|
end
|
36
29
|
|
37
30
|
def get(route, &block)
|
@@ -45,27 +38,39 @@ module Helmet
|
|
45
38
|
|
46
39
|
def register_route(method, route, &block)
|
47
40
|
sig = API.signature(method, route)
|
48
|
-
|
41
|
+
@routes[sig] = block
|
49
42
|
end
|
50
|
-
|
43
|
+
|
51
44
|
def signature(method, route)
|
52
45
|
"#{method}#{route}"
|
53
46
|
end
|
54
47
|
|
55
48
|
def inherited(klass)
|
49
|
+
klass.init
|
50
|
+
|
56
51
|
# setup basic middlewares
|
57
52
|
setup_middlewares klass
|
58
53
|
|
59
54
|
# compute public/ views folder
|
60
|
-
base = File.dirname(caller.first[/^[^:]*/])
|
61
|
-
|
62
|
-
|
55
|
+
base = File.expand_path(File.dirname(caller.first[/^[^:]*/]))
|
56
|
+
klass.set :public_folder, File.join(base, 'public')
|
57
|
+
klass.set :views_folder, File.join(base, 'views')
|
63
58
|
|
64
59
|
super # update Goliath::Application.app_class
|
65
60
|
end
|
66
61
|
|
67
|
-
|
62
|
+
def init
|
63
|
+
# Handle application routes
|
64
|
+
@routes = {}
|
65
|
+
|
66
|
+
# Handle before filters
|
67
|
+
@before_filters = []
|
68
68
|
|
69
|
+
@config = {}
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
69
74
|
def setup_middlewares(klass)
|
70
75
|
# support for session
|
71
76
|
klass.use Rack::Session::Cookie
|
@@ -75,29 +80,35 @@ module Helmet
|
|
75
80
|
end
|
76
81
|
|
77
82
|
def response(env)
|
78
|
-
|
83
|
+
# request path
|
84
|
+
path = env['REQUEST_PATH']
|
85
|
+
|
86
|
+
# request handler
|
87
|
+
handler = Handler.new(env)
|
79
88
|
|
80
|
-
|
81
|
-
|
82
|
-
|
89
|
+
catch(:halt) do
|
90
|
+
# evaluate filters
|
91
|
+
self.class.before_filters.each do |route|
|
83
92
|
case route.first
|
84
93
|
when String
|
85
|
-
route[1]
|
94
|
+
handler.handle! &route[1] if route.first == path
|
86
95
|
when Regexp
|
87
|
-
route[1]
|
96
|
+
handler.handle! &route[1] if route.first =~ path
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
sig = API.signature(env['REQUEST_METHOD'], path)
|
101
|
+
block = self.class.routes[sig]
|
102
|
+
if block
|
103
|
+
handler.handle!(&block)
|
104
|
+
else
|
105
|
+
handler.handle! do
|
106
|
+
status 404
|
107
|
+
'not found!'
|
88
108
|
end
|
89
109
|
end
|
90
|
-
nil
|
91
|
-
end
|
92
|
-
return resp if resp
|
93
|
-
|
94
|
-
sig = API.signature(env['REQUEST_METHOD'], path)
|
95
|
-
block = @@routes[sig]
|
96
|
-
if block
|
97
|
-
block.call env
|
98
|
-
else
|
99
|
-
[404, {}, 'not found!']
|
100
110
|
end
|
111
|
+
handler.response.format_response
|
101
112
|
end
|
102
113
|
end
|
103
114
|
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'helmet/templates'
|
2
|
+
require 'helmet/response'
|
3
|
+
|
4
|
+
module Helmet
|
5
|
+
|
6
|
+
# Handle each request and provide usefull methods for request handling
|
7
|
+
class Handler
|
8
|
+
include Templates
|
9
|
+
|
10
|
+
# Request environment
|
11
|
+
attr_reader :env
|
12
|
+
|
13
|
+
attr_reader :response
|
14
|
+
|
15
|
+
def initialize(env)
|
16
|
+
@env = env
|
17
|
+
@response = Response.new(env)
|
18
|
+
end
|
19
|
+
|
20
|
+
# @return (Response) request response
|
21
|
+
def handle!(&block)
|
22
|
+
@response.body = instance_exec(&block)
|
23
|
+
@response.format_response
|
24
|
+
end
|
25
|
+
|
26
|
+
# @return (Rack::Session) the current session data
|
27
|
+
def session
|
28
|
+
@env['rack.session']
|
29
|
+
end
|
30
|
+
|
31
|
+
# Creates a redirect HTTP response
|
32
|
+
def redirect(uri)
|
33
|
+
@response.status = 302
|
34
|
+
@response.header['Location'] = uri
|
35
|
+
@response.body = ''
|
36
|
+
halt
|
37
|
+
end
|
38
|
+
|
39
|
+
# halt the execution
|
40
|
+
def halt(body=nil)
|
41
|
+
@response.body = body if body
|
42
|
+
throw :halt
|
43
|
+
end
|
44
|
+
|
45
|
+
# @return (Integer) response status code
|
46
|
+
def status
|
47
|
+
@response.status
|
48
|
+
end
|
49
|
+
|
50
|
+
# set response status code
|
51
|
+
def status(code)
|
52
|
+
@response.status = code
|
53
|
+
end
|
54
|
+
|
55
|
+
# @return (Hash) response header
|
56
|
+
def header
|
57
|
+
@response.header
|
58
|
+
end
|
59
|
+
|
60
|
+
# @return (String) response body
|
61
|
+
def body
|
62
|
+
@response.body
|
63
|
+
end
|
64
|
+
|
65
|
+
def content_type(type)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Helmet
|
2
|
+
|
3
|
+
class Response
|
4
|
+
# Request environment
|
5
|
+
attr_reader :env
|
6
|
+
|
7
|
+
# HTTP response status
|
8
|
+
attr_accessor :status
|
9
|
+
|
10
|
+
# HTTP response header
|
11
|
+
attr_accessor :header
|
12
|
+
|
13
|
+
# HTTP response body
|
14
|
+
attr_accessor :body
|
15
|
+
|
16
|
+
def initialize(env)
|
17
|
+
@env = env
|
18
|
+
@status = 200 # Default OK!
|
19
|
+
@header = {}
|
20
|
+
@body = ''
|
21
|
+
end
|
22
|
+
|
23
|
+
# @return (Array) HTTP response tuple [status, header, body]
|
24
|
+
def format_response
|
25
|
+
[@status, @header, @body]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/helmet/templates.rb
CHANGED
@@ -6,7 +6,7 @@ module Helmet
|
|
6
6
|
@@template_cache = Tilt::Cache.new
|
7
7
|
|
8
8
|
def erb(template, options = {}, locals = {})
|
9
|
-
render
|
9
|
+
render(:erb, template, options, locals)
|
10
10
|
end
|
11
11
|
|
12
12
|
def render(engine, data, options = {}, locals = {}, &block)
|
@@ -15,8 +15,8 @@ module Helmet
|
|
15
15
|
@@template_cache.clear unless Goliath.env == :production
|
16
16
|
compiled_template = @@template_cache.fetch(data, options) do
|
17
17
|
template = Tilt.new(find_template(engine, data), nil, options)
|
18
|
-
end
|
19
|
-
output = compiled_template.render
|
18
|
+
end
|
19
|
+
output = compiled_template.render(self, locals, &block)
|
20
20
|
if layout
|
21
21
|
return render(engine, layout, options, locals) {output}
|
22
22
|
end
|
@@ -27,7 +27,7 @@ module Helmet
|
|
27
27
|
|
28
28
|
def find_template(engine, template)
|
29
29
|
filename = "#{template.to_s}.#{engine.to_s}"
|
30
|
-
File.join(views_folder, filename)
|
30
|
+
File.join(@klass.config(:views_folder), filename)
|
31
31
|
end
|
32
32
|
end
|
33
33
|
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: helmet
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0
|
5
|
+
version: 0.1.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Thiago Lewin
|
@@ -44,6 +44,8 @@ extra_rdoc_files: []
|
|
44
44
|
|
45
45
|
files:
|
46
46
|
- lib/helmet/api.rb
|
47
|
+
- lib/helmet/handler.rb
|
48
|
+
- lib/helmet/response.rb
|
47
49
|
- lib/helmet/templates.rb
|
48
50
|
- lib/helmet.rb
|
49
51
|
homepage: https://github.com/tlewin/helmet
|