rocketio 0.1.0 → 0.2.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 +4 -4
- data/lib/rocketio.rb +6 -3
- data/lib/rocketio/application.rb +3 -7
- data/lib/rocketio/controller.rb +62 -90
- data/lib/rocketio/controller/authentication.rb +38 -44
- data/lib/rocketio/controller/authorization.rb +8 -4
- data/lib/rocketio/controller/error_handlers.rb +12 -8
- data/lib/rocketio/controller/filters.rb +14 -19
- data/lib/rocketio/controller/helpers.rb +1 -1
- data/lib/rocketio/controller/middleware.rb +1 -1
- data/lib/rocketio/controller/render/engine.rb +3 -3
- data/lib/rocketio/controller/render/layout.rb +1 -1
- data/lib/rocketio/controller/render/layouts.rb +6 -6
- data/lib/rocketio/controller/render/template_vars.rb +3 -3
- data/lib/rocketio/controller/render/templates.rb +6 -6
- data/lib/rocketio/controller/sessions.rb +1 -1
- data/lib/rocketio/error_templates/409.html +11 -7
- data/lib/rocketio/error_templates/501.html +4 -4
- data/lib/rocketio/router.rb +35 -21
- data/lib/rocketio/version.rb +1 -1
- data/rocketio.gemspec +2 -0
- data/test/aliases_test.rb +2 -2
- data/test/api_test.rb +24 -117
- data/test/authentication_test.rb +96 -60
- data/test/authorization_test.rb +28 -17
- data/test/cache_control_test.rb +12 -12
- data/test/content_type_test.rb +7 -7
- data/test/cookies_test.rb +4 -4
- data/test/error_handlers_test.rb +14 -12
- data/test/etag_test.rb +32 -32
- data/test/filters_test.rb +96 -79
- data/test/halt_test.rb +1 -1
- data/test/helpers_test.rb +6 -6
- data/test/middleware_test.rb +4 -4
- data/test/redirect_test.rb +6 -7
- data/test/render/{post.erb → b.erb} +0 -0
- data/test/render/{put.erb → c.erb} +0 -0
- data/test/render/engine_test.rb +5 -5
- data/test/render/{get.erb → index.erb} +0 -0
- data/test/render/layout_test.rb +21 -17
- data/test/render/layouts_test.rb +14 -14
- data/test/render/render_test.rb +17 -14
- data/test/render/template_vars_test.rb +9 -9
- data/test/render/templates_test.rb +16 -16
- data/test/response_test.rb +4 -4
- data/test/routes_test.rb +21 -42
- data/test/sendfile_test.rb +8 -8
- data/test/sessions_test.rb +27 -27
- data/test/setup.rb +2 -0
- metadata +34 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c81e2dd778eb2ae80019ccfdbd0a07da71685609
|
4
|
+
data.tar.gz: 18fb36dc539e788db0c8ca0a4143fbf8867eab23
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b5d4954032b4b5fedfa2d43cfff1b923f8a43fabab4eb41bf3e3fa5592ad7459fc836859553b2e37d84ec65812f04a4371ab7a276ddcbdde09892c2aa88c9ba4
|
7
|
+
data.tar.gz: 5d19a34c16c3f4aaf635940796a6f1d435d11d4a12de9c6e55b5dc543c830ad79d83a2db26b9e47e206cbf4db3a23b61a14999e285aa2dce8388b44955f09f24
|
data/lib/rocketio.rb
CHANGED
@@ -47,13 +47,16 @@ module RocketIO
|
|
47
47
|
HEAD => :head
|
48
48
|
}.freeze
|
49
49
|
|
50
|
+
INDEX_METHOD = :index
|
51
|
+
|
50
52
|
EMPTY_STRING = ''.freeze
|
51
53
|
EMPTY_STRING_PROC = proc {RocketIO::EMPTY_STRING}
|
52
54
|
EMPTY_ARRAY = [].freeze
|
53
55
|
EMPTY_HASH = {}.freeze
|
54
56
|
|
55
|
-
SLASH
|
56
|
-
QUERY_PREFIX
|
57
|
+
SLASH = '/'.freeze
|
58
|
+
QUERY_PREFIX = '?'.freeze
|
59
|
+
PATH_SPLITTER = /[^\/]+/.freeze
|
57
60
|
|
58
61
|
CONTENT_TYPE = 'Content-Type'.freeze
|
59
62
|
DEFAULT_CONTENT_TYPE = 'text/html'.freeze
|
@@ -72,7 +75,7 @@ module RocketIO
|
|
72
75
|
HTTP_AUTHORIZATION_KEYS = ['HTTP_AUTHORIZATION', 'X-HTTP_AUTHORIZATION', 'X_HTTP_AUTHORIZATION'].map(&:freeze).freeze
|
73
76
|
HTTP_AUTHORIZATION_MOCKS = {
|
74
77
|
basic: 'Basic Og=='.freeze,
|
75
|
-
digest: 'Digest opaque="", qop="auth", uri="
|
78
|
+
digest: 'Digest opaque="", qop="auth", uri="%s"'.freeze
|
76
79
|
}.freeze
|
77
80
|
HTTP_UPGRADE = 'HTTP_UPGRADE'.freeze
|
78
81
|
UPGRADE = 'upgrade'.freeze
|
data/lib/rocketio/application.rb
CHANGED
@@ -11,15 +11,11 @@ module RocketIO
|
|
11
11
|
|
12
12
|
def call env
|
13
13
|
catch :__response__ do # catch 404 errors and potential `halt` calls from middleware
|
14
|
-
controller, path_params = @router.resolve_path(env[PATH_INFO])
|
14
|
+
controller, method, path_params = @router.resolve_path(env[PATH_INFO])
|
15
15
|
|
16
|
-
|
17
|
-
controller = RocketIO::Controller.initialize_controller
|
18
|
-
controller.env = env
|
19
|
-
controller.error(404)
|
20
|
-
end
|
16
|
+
controller || Controller.new(INDEX_METHOD, EMPTY_ARRAY, env).error(404)
|
21
17
|
|
22
|
-
controller = controller.
|
18
|
+
controller = controller.new(method, path_params)
|
23
19
|
chain = controller.middleware.reverse.inject(controller) {|app,ware| ware.call(app)}
|
24
20
|
if controller.sessions
|
25
21
|
chain = controller.sessions[0].new(chain, controller.sessions[1])
|
data/lib/rocketio/controller.rb
CHANGED
@@ -2,35 +2,36 @@ module RocketIO
|
|
2
2
|
class Controller
|
3
3
|
extend Forwardable
|
4
4
|
|
5
|
-
def_delegators 'self.class', :url, :dirname, :parameters_policy
|
5
|
+
def_delegators :'self.class', :url, :api, :dirname, :parameters_policy
|
6
6
|
def_delegators :request, :session, :request_method
|
7
|
-
def_delegators RocketIO, :
|
7
|
+
def_delegators RocketIO, :environment
|
8
|
+
def_delegators RocketIO, :indifferent_params, :indifferent_hash, :mime_type
|
9
|
+
def_delegators RocketIO, :engine_const, :engine_class
|
8
10
|
def_delegators CGI, :escape_html
|
9
11
|
|
10
|
-
|
12
|
+
# defining instance helpers for querying current environment like
|
13
|
+
# development? production? etc.
|
11
14
|
RocketIO::ENVIRONMENTS.each_key do |env|
|
12
15
|
def_delegators RocketIO, :"#{env}?"
|
13
16
|
end
|
14
17
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
# override the methods you need to be handled by controller.
|
20
|
-
#
|
21
|
-
RocketIO::REQUEST_METHODS.each_value do |verb|
|
22
|
-
define_method(verb) {|*| error(501)}
|
18
|
+
def initialize requested_method = RocketIO::INDEX_METHOD, path_params = RocketIO::EMPTY_ARRAY, env = nil
|
19
|
+
@__requested_method__ = requested_method
|
20
|
+
@__path_params_array__ = path_params.freeze
|
21
|
+
@__env__ = env if env
|
23
22
|
end
|
24
|
-
def head(*); end
|
25
23
|
|
26
|
-
# call requested method
|
27
|
-
# also call #before, #around and #after filters.
|
24
|
+
# call requested method
|
28
25
|
#
|
29
26
|
# @param [Hash] env
|
30
27
|
# @return [Rack::Response]
|
31
28
|
#
|
32
29
|
def call env
|
30
|
+
@__env__ = env
|
33
31
|
catch :__response__ do
|
32
|
+
|
33
|
+
api[requested_method] || error(501)
|
34
|
+
|
34
35
|
if error_handlers[500]
|
35
36
|
begin
|
36
37
|
__call__(env)
|
@@ -43,8 +44,9 @@ module RocketIO
|
|
43
44
|
end
|
44
45
|
end
|
45
46
|
|
46
|
-
private
|
47
|
-
|
47
|
+
private
|
48
|
+
def __call__ env
|
49
|
+
|
48
50
|
validate_or_request_authentication_if_needed
|
49
51
|
validate_or_request_authorization_if_needed
|
50
52
|
validate_parameters
|
@@ -57,53 +59,51 @@ module RocketIO
|
|
57
59
|
invoke_after_filter
|
58
60
|
}
|
59
61
|
|
60
|
-
|
61
|
-
|
62
|
+
if head? # dropping body on HEAD requests
|
63
|
+
response.body = RocketIO::EMPTY_ARRAY
|
64
|
+
else
|
65
|
+
response.body ||= RocketIO::EMPTY_ARRAY
|
66
|
+
end
|
67
|
+
|
62
68
|
response.finish
|
63
69
|
end
|
64
70
|
|
65
|
-
|
71
|
+
def __run__ app
|
66
72
|
app.call
|
67
73
|
end
|
68
74
|
|
69
|
-
def env= env
|
70
|
-
@__env__ = env
|
71
|
-
end
|
72
|
-
|
73
75
|
def env
|
74
76
|
@__env__
|
75
77
|
end
|
76
78
|
|
77
79
|
def validate_parameters
|
78
|
-
# enforce policy only if a method defined for current request method
|
79
|
-
# cause stock REST methods accepting any number of arguments
|
80
|
-
return unless policy = parameters_policy[requested_method]
|
81
80
|
|
82
|
-
if path_params_array.size >=
|
83
|
-
return if
|
81
|
+
if path_params_array.size >= api[requested_method][:parameters_policy][:min]
|
82
|
+
return if api[requested_method][:parameters_policy][:max] == :* ||
|
83
|
+
path_params_array.size <= api[requested_method][:parameters_policy][:max]
|
84
84
|
end
|
85
85
|
|
86
86
|
error(409)
|
87
87
|
end
|
88
88
|
|
89
|
-
def
|
90
|
-
@
|
91
|
-
rangemap = self.class.path_params[requested_method] ||
|
92
|
-
raise(StandardError, 'No path_params map found for %s method' % requested_method)
|
93
|
-
indifferent_params(rangemap.each_with_object({}) {|(m,r),o|
|
94
|
-
o[m] = if r.min && r.max
|
95
|
-
r.min == r.max ? path_params_array[r.min] : path_params_array[r]
|
96
|
-
else
|
97
|
-
path_params_array[r]
|
98
|
-
end
|
99
|
-
}).freeze
|
100
|
-
end
|
89
|
+
def requested_method
|
90
|
+
@__requested_method__
|
101
91
|
end
|
102
92
|
|
103
93
|
def path_params_array
|
104
94
|
@__path_params_array__
|
105
95
|
end
|
106
96
|
|
97
|
+
def path_params
|
98
|
+
@__path_params__ ||= api[requested_method][:path_params].each_with_object({}) {|(m,r),o|
|
99
|
+
o[m] = if r.min && r.max
|
100
|
+
r.min == r.max ? path_params_array[r.min] : path_params_array[r]
|
101
|
+
else
|
102
|
+
path_params_array[r]
|
103
|
+
end
|
104
|
+
}.freeze
|
105
|
+
end
|
106
|
+
|
107
107
|
def params
|
108
108
|
@__params__ ||= indifferent_params(request.params)
|
109
109
|
end
|
@@ -115,30 +115,12 @@ module RocketIO
|
|
115
115
|
def response
|
116
116
|
@__response__ ||= RocketIO::Response.new
|
117
117
|
end
|
118
|
-
|
119
|
-
def requested_method
|
120
|
-
@__requested_method__ ||= RocketIO::REQUEST_METHODS[request_method]
|
121
|
-
end
|
122
118
|
end
|
123
119
|
|
124
120
|
class << Controller
|
125
121
|
|
126
|
-
# only public non-inherited methods are included in public API directly.
|
127
122
|
def api
|
128
|
-
|
129
|
-
public_instance_methods(false).concat(inherited_api) - private_api
|
130
|
-
end
|
131
|
-
|
132
|
-
# inherited methods are excluded from public API
|
133
|
-
# but we still need a way to know what API methods was inherited
|
134
|
-
def inherited_api
|
135
|
-
@__inherited_api__
|
136
|
-
end
|
137
|
-
|
138
|
-
# used internally to keep a list of public methods
|
139
|
-
# that should be excluded from public API
|
140
|
-
def private_api
|
141
|
-
@__private_api__
|
123
|
+
@__api__
|
142
124
|
end
|
143
125
|
|
144
126
|
# import some config from some controller
|
@@ -147,11 +129,10 @@ module RocketIO
|
|
147
129
|
end
|
148
130
|
|
149
131
|
def inherited base
|
150
|
-
# registering new controller
|
132
|
+
# registering a new controller
|
151
133
|
RocketIO.controllers.push(base)
|
152
134
|
|
153
|
-
base.instance_variable_set(:@
|
154
|
-
base.instance_variable_set(:@__inherited_api__, self.api.freeze)
|
135
|
+
base.instance_variable_set(:@__api__, self.api.dup)
|
155
136
|
|
156
137
|
# new controller inherits all setups from superclass
|
157
138
|
base.import :before, from: self
|
@@ -250,10 +231,11 @@ module RocketIO
|
|
250
231
|
@__aliases__ ||= []
|
251
232
|
end
|
252
233
|
|
253
|
-
# build a URL from given chunks prefixing them with
|
234
|
+
# build a URL from given chunks prefixing them with controller's baseurl
|
254
235
|
#
|
255
236
|
# @param *args [Array]
|
256
237
|
# @return [String]
|
238
|
+
#
|
257
239
|
def url *args
|
258
240
|
return @__url__ if args.empty?
|
259
241
|
query = if args.last.is_a?(Hash)
|
@@ -265,45 +247,35 @@ module RocketIO
|
|
265
247
|
end
|
266
248
|
|
267
249
|
def method_added meth
|
268
|
-
|
269
|
-
|
270
|
-
if requested_method = RocketIO::REQUEST_METHODS.values.find {|verb| verb == meth}
|
271
|
-
# REST methods should be called with a predetermined set of parameters.
|
272
|
-
# setting an appropriate policy for just defined method based on its parameters.
|
273
|
-
parameters_policy[requested_method] = RocketIO.parameters_policy(parameters).freeze
|
274
|
-
end
|
275
|
-
end
|
250
|
+
return if self == RocketIO::Controller
|
251
|
+
return unless public_instance_methods(false).include?(meth)
|
276
252
|
|
277
|
-
|
278
|
-
#
|
279
|
-
# @param path_params [Array]
|
280
|
-
# @return a RocketIO::Route instance
|
281
|
-
def initialize_controller requested_method = nil, path_params_array = nil
|
282
|
-
controller = allocate
|
283
|
-
controller.instance_variable_set(:@__requested_method__, requested_method.to_sym) if requested_method
|
284
|
-
controller.instance_variable_set(:@__path_params_array__, (path_params_array || []).freeze)
|
285
|
-
controller
|
286
|
-
end
|
287
|
-
|
288
|
-
def parameters_policy
|
289
|
-
@__parameters_policy__ ||= {}
|
290
|
-
end
|
253
|
+
parameters = instance_method(meth).parameters
|
291
254
|
|
292
|
-
|
293
|
-
|
255
|
+
api[meth] = {
|
256
|
+
# api methods should be called with a predetermined set of parameters
|
257
|
+
# so setting an appropriate policy for just defined method based on its parameters.
|
258
|
+
path_params: RocketIO.path_params(parameters).freeze,
|
259
|
+
parameters_policy: RocketIO.parameters_policy(parameters).freeze
|
260
|
+
}
|
294
261
|
end
|
295
262
|
|
296
263
|
def dirname *args
|
297
264
|
::File.join(@__dirname__, args.map!(&:to_s))
|
298
265
|
end
|
299
266
|
|
300
|
-
# making controller to act as a Rack application
|
301
267
|
def call env
|
302
|
-
|
268
|
+
path_params = env[RocketIO::PATH_INFO].sub(url, RocketIO::EMPTY_STRING).scan(RocketIO::PATH_SPLITTER)
|
269
|
+
method = if path_params.any? && api[path_params[0].to_sym]
|
270
|
+
path_params.slice!(0).to_sym
|
271
|
+
else
|
272
|
+
RocketIO::INDEX_METHOD
|
273
|
+
end
|
274
|
+
new(method, path_params).call(env)
|
303
275
|
end
|
304
276
|
end
|
305
277
|
|
306
|
-
Controller.instance_variable_set(:@
|
278
|
+
Controller.instance_variable_set(:@__api__, {})
|
307
279
|
end
|
308
280
|
|
309
281
|
require 'rocketio/controller/authentication'
|
@@ -3,37 +3,34 @@ module RocketIO
|
|
3
3
|
|
4
4
|
# easily restrict access to controller using basic auth
|
5
5
|
#
|
6
|
-
# @example protect all request methods
|
6
|
+
# @example protect all methods on any request methods
|
7
7
|
# basic_auth do |user,pass|
|
8
8
|
# user == 'admin' && pass == 'super secret password'
|
9
9
|
# end
|
10
10
|
#
|
11
|
-
# @example protect only POST, PUT and DELETE request methods
|
12
|
-
# basic_auth
|
13
|
-
#
|
11
|
+
# @example protect all methods only on POST, PUT and DELETE request methods
|
12
|
+
# basic_auth do |user,pass|
|
13
|
+
# post? || put? || delete? ?
|
14
|
+
# user == 'admin' && pass == 'super secret password' :
|
15
|
+
# true
|
14
16
|
# end
|
15
17
|
#
|
16
|
-
# @example
|
17
|
-
# basic_auth :
|
18
|
+
# @example protect only :edit
|
19
|
+
# basic_auth :edit do |user,pass|
|
18
20
|
# user == 'reader' && pass == 'readPass'
|
19
21
|
# end
|
20
22
|
#
|
21
|
-
#
|
22
|
-
#
|
23
|
-
#
|
24
|
-
#
|
25
|
-
# @note authorization is composable, that's it, if superclass is protecting :get method
|
26
|
-
# and current controller protects :post method,
|
27
|
-
# both :get and :post will be protected in current controller
|
23
|
+
# @note authorization is composable, that's it, if superclass is protecting :a
|
24
|
+
# and current controller is protecting :b method,
|
25
|
+
# both :a and :b will be protected in current controller
|
28
26
|
#
|
29
27
|
# @params *args [Array]
|
30
28
|
# @param block [Proc]
|
31
29
|
#
|
32
30
|
def self.basic_auth *args, &block
|
33
31
|
opts = args.last.is_a?(Hash) ? args.pop : {}
|
34
|
-
|
35
|
-
|
36
|
-
(@__basic_auth__ ||= {})[rm] = {
|
32
|
+
(args.any? ? args.map(&:to_sym) : [:*]).each do |method|
|
33
|
+
(@__basic_auth__ ||= {})[method] = {
|
37
34
|
class: Rack::Auth::Basic,
|
38
35
|
arguments: [opts[:realm] || RocketIO::DEFAULT_AUTH_REALM].freeze,
|
39
36
|
block: block,
|
@@ -44,20 +41,20 @@ module RocketIO
|
|
44
41
|
end
|
45
42
|
|
46
43
|
def self.define_basic_auth_methods source = self
|
47
|
-
prompts = (source.instance_variable_get(:@__basic_auth__) || {}).each_with_object(allocate.basic_auth.dup) do |(
|
48
|
-
method = :"__basic_auth__#{
|
49
|
-
|
50
|
-
o[
|
44
|
+
prompts = (source.instance_variable_get(:@__basic_auth__) || {}).each_with_object(allocate.basic_auth.dup) do |(m,p),o|
|
45
|
+
method = :"__basic_auth__#{m}__"
|
46
|
+
api.delete define_method(method, &p[:block])
|
47
|
+
o[m] = p.merge(method: method).freeze
|
51
48
|
end.freeze
|
52
49
|
return if prompts.empty?
|
53
|
-
|
50
|
+
api.delete define_method(:basic_auth) {prompts}
|
54
51
|
end
|
55
52
|
|
56
53
|
def basic_auth; RocketIO::EMPTY_HASH end
|
57
54
|
|
58
55
|
# easily restrict access to controller using digest auth
|
59
56
|
#
|
60
|
-
# @example protect all
|
57
|
+
# @example protect all methods using hashed passwords
|
61
58
|
# # hash the password somewhere in irb:
|
62
59
|
# # ::Digest::MD5.hexdigest 'admin:AccessRestricted:somePassword'
|
63
60
|
# # username ^ realm ^ password ^
|
@@ -68,25 +65,16 @@ module RocketIO
|
|
68
65
|
# {'admin' => '9d77d54decc22cdcfb670b7b79ee0ef0'}[user]
|
69
66
|
# end
|
70
67
|
#
|
71
|
-
# @example protect all
|
68
|
+
# @example protect all methods using plain passwords
|
72
69
|
# digest_auth do |user|
|
73
70
|
# {'admin' => 'password'}[user]
|
74
71
|
# end
|
75
72
|
#
|
76
|
-
# @example protect only
|
77
|
-
# digest_auth :
|
73
|
+
# @example protect only :create and :edit methods
|
74
|
+
# digest_auth :create, :edit do |user|
|
78
75
|
# {'admin' => 'password'}[user]
|
79
76
|
# end
|
80
77
|
#
|
81
|
-
# @example use different credentials for GET and POST
|
82
|
-
# digest_auth :get do |user|
|
83
|
-
# {'user' => 'readPass'}[user]
|
84
|
-
# end
|
85
|
-
#
|
86
|
-
# digest_auth :post do |user|
|
87
|
-
# {'poster' => 'writePass'}[user]
|
88
|
-
# end
|
89
|
-
#
|
90
78
|
# @params *args [Array]
|
91
79
|
# @param block [Proc]
|
92
80
|
#
|
@@ -94,9 +82,8 @@ module RocketIO
|
|
94
82
|
opts = args.last.is_a?(Hash) ? args.pop : {}
|
95
83
|
opts[:realm] ||= RocketIO::DEFAULT_AUTH_REALM
|
96
84
|
opts[:opaque] ||= opts[:realm]
|
97
|
-
|
98
|
-
|
99
|
-
(@__digest_auth__ ||= {})[rm] = {
|
85
|
+
(args.any? ? args.map(&:to_sym) : [:*]).each do |method|
|
86
|
+
(@__digest_auth__ ||= {})[method] = {
|
100
87
|
class: Rack::Auth::Digest::MD5,
|
101
88
|
arguments: [opts].freeze,
|
102
89
|
block: block,
|
@@ -107,13 +94,13 @@ module RocketIO
|
|
107
94
|
end
|
108
95
|
|
109
96
|
def self.define_digest_auth_methods source = self
|
110
|
-
prompts = (source.instance_variable_get(:@__digest_auth__) || {}).each_with_object(allocate.digest_auth.dup) do |(
|
111
|
-
method = :"__digest_auth__#{
|
112
|
-
|
113
|
-
o[
|
97
|
+
prompts = (source.instance_variable_get(:@__digest_auth__) || {}).each_with_object(allocate.digest_auth.dup) do |(m,p),o|
|
98
|
+
method = :"__digest_auth__#{m}__"
|
99
|
+
api.delete define_method(method, &p[:block])
|
100
|
+
o[m] = p.merge(method: method).freeze
|
114
101
|
end.freeze
|
115
102
|
return if prompts.empty?
|
116
|
-
|
103
|
+
api.delete define_method(:digest_auth) {prompts}
|
117
104
|
end
|
118
105
|
|
119
106
|
def digest_auth; RocketIO::EMPTY_HASH end
|
@@ -123,17 +110,24 @@ module RocketIO
|
|
123
110
|
# checks whether authentication is required and
|
124
111
|
# send an authorization request if credentials not present or invalid
|
125
112
|
def validate_or_request_authentication_if_needed
|
126
|
-
return unless auth =
|
113
|
+
return unless auth = authentication_required?
|
127
114
|
return unless prompt = auth[:class].new(proc {}, *auth[:arguments]) do |*a|
|
128
115
|
self.__send__(auth[:method], *a)
|
129
116
|
end.call(
|
130
117
|
if RocketIO::HTTP_AUTHORIZATION_KEYS.detect {|key| env.has_key?(key)}
|
131
118
|
env
|
132
119
|
else
|
133
|
-
env.merge(RocketIO::HTTP_AUTHORIZATION_KEYS.first => auth[:mock])
|
120
|
+
env.merge(RocketIO::HTTP_AUTHORIZATION_KEYS.first => auth[:mock] % env[RocketIO::PATH_INFO])
|
134
121
|
end
|
135
122
|
)
|
136
123
|
throw(:__response__, prompt)
|
137
124
|
end
|
125
|
+
|
126
|
+
def authentication_required?
|
127
|
+
digest_auth[requested_method] ||
|
128
|
+
basic_auth[requested_method] ||
|
129
|
+
digest_auth[:*] ||
|
130
|
+
basic_auth[:*]
|
131
|
+
end
|
138
132
|
end
|
139
133
|
end
|