rocketio 0.0.0.pre.alpha → 0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +5 -2
- data/LICENSE.txt +22 -0
- data/README.md +5 -22
- data/Rakefile +1 -7
- data/lib/rocketio.rb +3 -131
- data/lib/rocketio/version.rb +2 -2
- data/rocketio.gemspec +17 -21
- metadata +11 -146
- data/.travis.yml +0 -3
- data/bin/console +0 -14
- data/bin/setup +0 -7
- data/lib/rocketio/application.rb +0 -31
- data/lib/rocketio/controller.rb +0 -288
- data/lib/rocketio/controller/authentication.rb +0 -141
- data/lib/rocketio/controller/authorization.rb +0 -53
- data/lib/rocketio/controller/cookies.rb +0 -59
- data/lib/rocketio/controller/error_handlers.rb +0 -89
- data/lib/rocketio/controller/filters.rb +0 -119
- data/lib/rocketio/controller/flash.rb +0 -21
- data/lib/rocketio/controller/helpers.rb +0 -438
- data/lib/rocketio/controller/middleware.rb +0 -32
- data/lib/rocketio/controller/render.rb +0 -148
- data/lib/rocketio/controller/render/engine.rb +0 -76
- data/lib/rocketio/controller/render/layout.rb +0 -27
- data/lib/rocketio/controller/render/layouts.rb +0 -85
- data/lib/rocketio/controller/render/templates.rb +0 -83
- data/lib/rocketio/controller/request.rb +0 -115
- data/lib/rocketio/controller/response.rb +0 -84
- data/lib/rocketio/controller/sessions.rb +0 -64
- data/lib/rocketio/controller/token_auth.rb +0 -118
- data/lib/rocketio/controller/websocket.rb +0 -21
- data/lib/rocketio/error_templates/404.html +0 -3
- data/lib/rocketio/error_templates/409.html +0 -7
- data/lib/rocketio/error_templates/500.html +0 -3
- data/lib/rocketio/error_templates/501.html +0 -6
- data/lib/rocketio/error_templates/layout.html +0 -1
- data/lib/rocketio/exceptions.rb +0 -4
- data/lib/rocketio/router.rb +0 -65
- data/lib/rocketio/util.rb +0 -122
- data/test/aliases_test.rb +0 -54
- data/test/authentication_test.rb +0 -307
- data/test/authorization_test.rb +0 -91
- data/test/cache_control_test.rb +0 -268
- data/test/content_type_test.rb +0 -124
- data/test/cookies_test.rb +0 -49
- data/test/error_handlers_test.rb +0 -125
- data/test/etag_test.rb +0 -445
- data/test/filters_test.rb +0 -177
- data/test/halt_test.rb +0 -73
- data/test/helpers_test.rb +0 -171
- data/test/middleware_test.rb +0 -57
- data/test/redirect_test.rb +0 -135
- data/test/render/engine_test.rb +0 -71
- data/test/render/get.erb +0 -1
- data/test/render/items.erb +0 -1
- data/test/render/layout.erb +0 -1
- data/test/render/layout_test.rb +0 -104
- data/test/render/layouts/master.erb +0 -1
- data/test/render/layouts_test.rb +0 -145
- data/test/render/master.erb +0 -1
- data/test/render/post.erb +0 -1
- data/test/render/put.erb +0 -1
- data/test/render/render_test.rb +0 -101
- data/test/render/setup.rb +0 -14
- data/test/render/templates/a/get.erb +0 -1
- data/test/render/templates/master.erb +0 -1
- data/test/render/templates_test.rb +0 -146
- data/test/request_test.rb +0 -105
- data/test/response_test.rb +0 -119
- data/test/routes_test.rb +0 -70
- data/test/sendfile_test.rb +0 -209
- data/test/sessions_test.rb +0 -176
- data/test/setup.rb +0 -59
data/.travis.yml
DELETED
data/bin/console
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require "bundler/setup"
|
4
|
-
require "rocketio"
|
5
|
-
|
6
|
-
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
-
# with your gem easier. You can also use a different console, if you like.
|
8
|
-
|
9
|
-
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
# require "pry"
|
11
|
-
# Pry.start
|
12
|
-
|
13
|
-
require "irb"
|
14
|
-
IRB.start
|
data/bin/setup
DELETED
data/lib/rocketio/application.rb
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
module RocketIO
|
2
|
-
class Application
|
3
|
-
|
4
|
-
def initialize *args, &block
|
5
|
-
controllers = args.empty? ? RocketIO.controllers : args.flatten
|
6
|
-
if block
|
7
|
-
controllers.each {|c| c.class_exec {define_method(:call!, block)}}
|
8
|
-
end
|
9
|
-
@router = Router.new(*controllers)
|
10
|
-
end
|
11
|
-
|
12
|
-
def call env
|
13
|
-
catch :__response__ do # catch 404 errors and potential `halt` calls from middleware
|
14
|
-
controller, path_params = @router.resolve_path(env[PATH_INFO])
|
15
|
-
|
16
|
-
unless controller
|
17
|
-
controller = RocketIO::Controller.initialize_controller
|
18
|
-
controller.env = env
|
19
|
-
controller.error(404)
|
20
|
-
end
|
21
|
-
|
22
|
-
controller = controller.initialize_controller(REQUEST_METHODS[env[REQUEST_METHOD]], path_params)
|
23
|
-
chain = controller.middleware.reverse.inject(controller) {|app,ware| ware.call(app)}
|
24
|
-
if controller.sessions
|
25
|
-
chain = controller.sessions[0].new(chain, controller.sessions[1])
|
26
|
-
end
|
27
|
-
chain.call(env)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
data/lib/rocketio/controller.rb
DELETED
@@ -1,288 +0,0 @@
|
|
1
|
-
module RocketIO
|
2
|
-
class Controller
|
3
|
-
extend Forwardable
|
4
|
-
|
5
|
-
def_delegators 'self.class', :url, :dirname, :parameters_policy
|
6
|
-
def_delegators :request, :session, :request_method
|
7
|
-
def_delegators RocketIO, :indifferent_params, :indifferent_hash, :mime_type, :engine_const, :engine_class
|
8
|
-
def_delegators CGI, :escape_html
|
9
|
-
|
10
|
-
# defining get, post etc. methods that will be called
|
11
|
-
# when a request matches current controller and appropriate request method used.
|
12
|
-
#
|
13
|
-
# by default all requests, except HEAD, will return a NotImplementedError.
|
14
|
-
# override the methods you need to be handled by controller.
|
15
|
-
#
|
16
|
-
RocketIO::REQUEST_METHODS.each_value do |verb|
|
17
|
-
define_method(verb) {|*| error(501)}
|
18
|
-
end
|
19
|
-
def head(*); end
|
20
|
-
|
21
|
-
# call requested method.
|
22
|
-
# also call #before, #around and #after filters.
|
23
|
-
#
|
24
|
-
# @param [Hash] env
|
25
|
-
# @return [Rack::Response]
|
26
|
-
#
|
27
|
-
def call env
|
28
|
-
catch :__response__ do
|
29
|
-
begin
|
30
|
-
self.env = env
|
31
|
-
validate_or_request_authentication_if_needed
|
32
|
-
validate_or_request_authorization_if_needed
|
33
|
-
validate_parameters
|
34
|
-
|
35
|
-
call! proc {
|
36
|
-
invoke_before_filter
|
37
|
-
invoke_around_filter proc {
|
38
|
-
response.body = public_send(requested_method, *path_params_array)
|
39
|
-
}
|
40
|
-
invoke_after_filter
|
41
|
-
}
|
42
|
-
response.body ||= RocketIO::EMPTY_ARRAY
|
43
|
-
response.body = [] if head? # dropping body on HEAD requests
|
44
|
-
response.finish
|
45
|
-
rescue Exception => e
|
46
|
-
if RocketIO.development?
|
47
|
-
puts "\e[0;31m%s\e[0m" % e.inspect
|
48
|
-
e.backtrace.each {|l| puts " \e[0;36m%s\e[0m" % l}
|
49
|
-
end
|
50
|
-
error(500, e)
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def call! app
|
56
|
-
app.call
|
57
|
-
end
|
58
|
-
|
59
|
-
def env= env
|
60
|
-
@__env__ = env
|
61
|
-
end
|
62
|
-
|
63
|
-
def env
|
64
|
-
@__env__
|
65
|
-
end
|
66
|
-
|
67
|
-
def validate_parameters
|
68
|
-
# enforce policy only if a method defined for current request method
|
69
|
-
# cause stock REST methods accepting any number of arguments
|
70
|
-
return unless policy = parameters_policy[requested_method]
|
71
|
-
|
72
|
-
if path_params_array.size >= policy[:min]
|
73
|
-
return if policy[:max] == :* || path_params_array.size <= policy[:max]
|
74
|
-
end
|
75
|
-
|
76
|
-
error(409)
|
77
|
-
end
|
78
|
-
|
79
|
-
def path_params
|
80
|
-
@__path_params__ ||= begin
|
81
|
-
rangemap = self.class.path_params[requested_method] ||
|
82
|
-
raise(StandardError, 'No path_params map found for %s method' % requested_method)
|
83
|
-
indifferent_params(rangemap.each_with_object({}) {|(m,r),o|
|
84
|
-
o[m] = r.min == r.max ? path_params_array[r.min] : path_params_array[r]
|
85
|
-
}).freeze
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
def path_params_array
|
90
|
-
@__path_params_array__
|
91
|
-
end
|
92
|
-
|
93
|
-
def params
|
94
|
-
@__params__ ||= indifferent_params(request.params)
|
95
|
-
end
|
96
|
-
|
97
|
-
def request
|
98
|
-
@__request__ ||= RocketIO::Request.new(env)
|
99
|
-
end
|
100
|
-
|
101
|
-
def response
|
102
|
-
@__response__ ||= RocketIO::Response.new
|
103
|
-
end
|
104
|
-
|
105
|
-
def requested_method
|
106
|
-
@__requested_method__ ||= RocketIO::REQUEST_METHODS[request_method]
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
class << Controller
|
111
|
-
|
112
|
-
def inherit setup, opts = {}
|
113
|
-
opts[:from] || raise(ArgumentError, ':from option is required')
|
114
|
-
__send__(:"define_#{setup}_methods", opts[:from])
|
115
|
-
end
|
116
|
-
|
117
|
-
def inherited base
|
118
|
-
# registering new controller
|
119
|
-
RocketIO.controllers.push(base)
|
120
|
-
|
121
|
-
# new controller inherits all setups from superclass
|
122
|
-
base.inherit :before, from: self
|
123
|
-
base.inherit :around, from: self
|
124
|
-
base.inherit :after, from: self
|
125
|
-
|
126
|
-
base.inherit :basic_auth, from: self
|
127
|
-
base.inherit :digest_auth, from: self
|
128
|
-
base.inherit :token_auth, from: self
|
129
|
-
|
130
|
-
base.inherit :error_handlers, from: self
|
131
|
-
base.inherit :middleware, from: self
|
132
|
-
base.inherit :sessions, from: self
|
133
|
-
|
134
|
-
base.inherit :engine, from: self
|
135
|
-
base.inherit :layout, from: self
|
136
|
-
base.inherit :layouts, from: self
|
137
|
-
base.inherit :templates, from: self
|
138
|
-
|
139
|
-
# removing superclass name from new controller name
|
140
|
-
path = RocketIO.underscore(base.name.to_s.sub(self.name.to_s + '::', '').gsub('::', '/'))
|
141
|
-
|
142
|
-
# new controller uses for URL its underscored name prefixed by superclass URL
|
143
|
-
base.map RocketIO.rootify_path(url, path)
|
144
|
-
|
145
|
-
# setting dirname for new controller
|
146
|
-
base.instance_variable_set(:@__dirname__, RocketIO.caller_to_dirname(caller).freeze)
|
147
|
-
end
|
148
|
-
|
149
|
-
# by default controllers will use underscored name for base URL.
|
150
|
-
# this method allow to set a custom base URL.
|
151
|
-
#
|
152
|
-
# @example Users::Register will listen on /users/register by default
|
153
|
-
# class Users
|
154
|
-
# class Register < RocketIO
|
155
|
-
#
|
156
|
-
# end
|
157
|
-
# end
|
158
|
-
#
|
159
|
-
# @note
|
160
|
-
#
|
161
|
-
# @example make Users::Register to listen on /users/join rather than /users/register
|
162
|
-
#
|
163
|
-
# class Users
|
164
|
-
# class Register < RocketIO
|
165
|
-
# map :join
|
166
|
-
#
|
167
|
-
# end
|
168
|
-
# end
|
169
|
-
#
|
170
|
-
# @note if given URL starts with a slash it will ignore class name and set URL as is
|
171
|
-
#
|
172
|
-
# @example make Users::Register to listen on /members/join
|
173
|
-
#
|
174
|
-
# class Users < RocketIO
|
175
|
-
# class Register < self
|
176
|
-
# map '/members/join'
|
177
|
-
#
|
178
|
-
# end
|
179
|
-
# end
|
180
|
-
#
|
181
|
-
# @param path [String || Symbol]
|
182
|
-
#
|
183
|
-
def map path
|
184
|
-
path = path.to_s
|
185
|
-
@__url__ = if path =~ /\A\//
|
186
|
-
path
|
187
|
-
else
|
188
|
-
if superclass == Object
|
189
|
-
RocketIO.rootify_path(path)
|
190
|
-
else
|
191
|
-
RocketIO.rootify_path(superclass.url, path)
|
192
|
-
end
|
193
|
-
end.freeze
|
194
|
-
end
|
195
|
-
|
196
|
-
# allow controllers to serve multiple URLs
|
197
|
-
#
|
198
|
-
# @param path [String || Symbol]
|
199
|
-
#
|
200
|
-
def alias_url path
|
201
|
-
path = path.to_s
|
202
|
-
path = if path =~ /\A\//
|
203
|
-
path
|
204
|
-
else
|
205
|
-
if superclass == Object
|
206
|
-
RocketIO.rootify_path(path)
|
207
|
-
else
|
208
|
-
RocketIO.rootify_path(superclass.url, path)
|
209
|
-
end
|
210
|
-
end.freeze
|
211
|
-
aliases.push(path)
|
212
|
-
end
|
213
|
-
|
214
|
-
def aliases
|
215
|
-
@__aliases__ ||= []
|
216
|
-
end
|
217
|
-
|
218
|
-
# build a URL from given chunks prefixing them with actual path
|
219
|
-
#
|
220
|
-
# @param *args [Array]
|
221
|
-
# @return [String]
|
222
|
-
def url *args
|
223
|
-
return @__url__ if args.empty?
|
224
|
-
query = if args.last.is_a?(Hash)
|
225
|
-
RocketIO::QUERY_PREFIX + ::Rack::Utils.build_nested_query(args.pop)
|
226
|
-
else
|
227
|
-
RocketIO::EMPTY_STRING
|
228
|
-
end
|
229
|
-
::File.join(@__url__, args.map!(&:to_s)) + query
|
230
|
-
end
|
231
|
-
|
232
|
-
def method_added meth
|
233
|
-
parameters = instance_method(meth).parameters
|
234
|
-
path_params[meth] = RocketIO.path_params(parameters).freeze
|
235
|
-
if requested_method = RocketIO::REQUEST_METHODS.values.find {|verb| verb == meth}
|
236
|
-
# REST methods should be called with a predetermined set of parameters.
|
237
|
-
# setting an appropriate policy for just defined method based on its parameters.
|
238
|
-
parameters_policy[requested_method] = RocketIO.parameters_policy(parameters).freeze
|
239
|
-
end
|
240
|
-
end
|
241
|
-
|
242
|
-
# initializing the controller to process a HTTP request
|
243
|
-
#
|
244
|
-
# @param path_params [Array]
|
245
|
-
# @return a RocketIO::Route instance
|
246
|
-
def initialize_controller requested_method = nil, path_params_array = nil
|
247
|
-
controller = allocate
|
248
|
-
controller.instance_variable_set(:@__requested_method__, requested_method.to_sym) if requested_method
|
249
|
-
controller.instance_variable_set(:@__path_params_array__, (path_params_array || []).freeze)
|
250
|
-
controller
|
251
|
-
end
|
252
|
-
|
253
|
-
def parameters_policy
|
254
|
-
@__parameters_policy__ ||= {}
|
255
|
-
end
|
256
|
-
|
257
|
-
def path_params
|
258
|
-
@__path_params__ ||= {}
|
259
|
-
end
|
260
|
-
|
261
|
-
def dirname *args
|
262
|
-
::File.join(@__dirname__, args.map!(&:to_s))
|
263
|
-
end
|
264
|
-
|
265
|
-
# making controller to act as a Rack application
|
266
|
-
def call env
|
267
|
-
initialize_controller.call(env)
|
268
|
-
end
|
269
|
-
|
270
|
-
def api
|
271
|
-
public_instance_methods(false)
|
272
|
-
end
|
273
|
-
end
|
274
|
-
end
|
275
|
-
|
276
|
-
require 'rocketio/controller/authentication'
|
277
|
-
require 'rocketio/controller/authorization'
|
278
|
-
require 'rocketio/controller/cookies'
|
279
|
-
require 'rocketio/controller/error_handlers'
|
280
|
-
require 'rocketio/controller/filters'
|
281
|
-
require 'rocketio/controller/flash'
|
282
|
-
require 'rocketio/controller/helpers'
|
283
|
-
require 'rocketio/controller/middleware'
|
284
|
-
require 'rocketio/controller/request'
|
285
|
-
require 'rocketio/controller/response'
|
286
|
-
require 'rocketio/controller/sessions'
|
287
|
-
require 'rocketio/controller/websocket'
|
288
|
-
require 'rocketio/controller/render'
|
@@ -1,141 +0,0 @@
|
|
1
|
-
module RocketIO
|
2
|
-
class Controller
|
3
|
-
|
4
|
-
# easily restrict access to controller using basic auth
|
5
|
-
#
|
6
|
-
# @example protect all request methods
|
7
|
-
# basic_auth do |user,pass|
|
8
|
-
# user == 'admin' && pass == 'super secret password'
|
9
|
-
# end
|
10
|
-
#
|
11
|
-
# @example protect only POST, PUT and DELETE request methods
|
12
|
-
# basic_auth :post, :put, :delete do |user,pass|
|
13
|
-
# user == 'admin' && pass == 'super secret password'
|
14
|
-
# end
|
15
|
-
#
|
16
|
-
# @example use different credentials for GET and POST
|
17
|
-
# basic_auth :get do |user,pass|
|
18
|
-
# user == 'reader' && pass == 'readPass'
|
19
|
-
# end
|
20
|
-
#
|
21
|
-
# basic_auth :post do |user,pass|
|
22
|
-
# user == 'poster' && pass == 'writePass'
|
23
|
-
# end
|
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
|
28
|
-
#
|
29
|
-
# @params *args [Array]
|
30
|
-
# @param block [Proc]
|
31
|
-
#
|
32
|
-
def self.basic_auth *args, &block
|
33
|
-
opts = args.last.is_a?(Hash) ? args.pop : {}
|
34
|
-
rqms = args.any? ? args.map!(&:to_sym) : RocketIO::REQUEST_METHODS.values
|
35
|
-
rqms.each do |rm|
|
36
|
-
(@__basic_auth__ ||= {})[rm] = {
|
37
|
-
class: Rack::Auth::Basic,
|
38
|
-
arguments: [opts[:realm] || RocketIO::DEFAULT_AUTH_REALM].freeze,
|
39
|
-
block: block,
|
40
|
-
mock: RocketIO::HTTP_AUTHORIZATION_MOCKS[:basic]
|
41
|
-
}.freeze
|
42
|
-
end
|
43
|
-
define_basic_auth_methods
|
44
|
-
end
|
45
|
-
|
46
|
-
def self.define_basic_auth_methods source = self
|
47
|
-
prompts = (source.instance_variable_get(:@__basic_auth__) || {}).each_with_object(allocate.basic_auth.dup) do |(rm,p),o|
|
48
|
-
method = :"__basic_auth__#{rm}__"
|
49
|
-
define_method(method, &p[:block])
|
50
|
-
o[rm] = p.merge(method: method).freeze
|
51
|
-
end.freeze
|
52
|
-
return if prompts.empty?
|
53
|
-
define_method(:basic_auth) {prompts}
|
54
|
-
end
|
55
|
-
|
56
|
-
def basic_auth; RocketIO::EMPTY_HASH end
|
57
|
-
|
58
|
-
# easily restrict access to controller using digest auth
|
59
|
-
#
|
60
|
-
# @example protect all request methods using hashed passwords
|
61
|
-
# # hash the password somewhere in irb:
|
62
|
-
# # ::Digest::MD5.hexdigest 'admin:AccessRestricted:somePassword'
|
63
|
-
# # username ^ realm ^ password ^
|
64
|
-
#
|
65
|
-
# #=> 9d77d54decc22cdcfb670b7b79ee0ef0
|
66
|
-
#
|
67
|
-
# digest_auth :passwords_hashed => true, :realm => 'AccessRestricted' do |user|
|
68
|
-
# {'admin' => '9d77d54decc22cdcfb670b7b79ee0ef0'}[user]
|
69
|
-
# end
|
70
|
-
#
|
71
|
-
# @example protect all request methods using plain passwords
|
72
|
-
# digest_auth do |user|
|
73
|
-
# {'admin' => 'password'}[user]
|
74
|
-
# end
|
75
|
-
#
|
76
|
-
# @example protect only POST, PUT and DELETE request methods
|
77
|
-
# digest_auth :post, :put, :delete do |user|
|
78
|
-
# {'admin' => 'password'}[user]
|
79
|
-
# end
|
80
|
-
#
|
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
|
-
# @params *args [Array]
|
91
|
-
# @param block [Proc]
|
92
|
-
#
|
93
|
-
def self.digest_auth *args, &block
|
94
|
-
opts = args.last.is_a?(Hash) ? args.pop : {}
|
95
|
-
opts[:realm] ||= RocketIO::DEFAULT_AUTH_REALM
|
96
|
-
opts[:opaque] ||= opts[:realm]
|
97
|
-
rqms = args.any? ? args.map!(&:to_sym) : RocketIO::REQUEST_METHODS.values
|
98
|
-
rqms.each do |rm|
|
99
|
-
(@__digest_auth__ ||= {})[rm] = {
|
100
|
-
class: Rack::Auth::Digest::MD5,
|
101
|
-
arguments: [opts].freeze,
|
102
|
-
block: block,
|
103
|
-
mock: RocketIO::HTTP_AUTHORIZATION_MOCKS[:digest]
|
104
|
-
}.freeze
|
105
|
-
end
|
106
|
-
define_digest_auth_methods
|
107
|
-
end
|
108
|
-
|
109
|
-
def self.define_digest_auth_methods source = self
|
110
|
-
prompts = (source.instance_variable_get(:@__digest_auth__) || {}).each_with_object(allocate.digest_auth.dup) do |(rm,p),o|
|
111
|
-
method = :"__digest_auth__#{rm}__"
|
112
|
-
define_method(method, &p[:block])
|
113
|
-
o[rm] = p.merge(method: method).freeze
|
114
|
-
end.freeze
|
115
|
-
return if prompts.empty?
|
116
|
-
define_method(:digest_auth) {prompts}
|
117
|
-
end
|
118
|
-
|
119
|
-
def digest_auth; RocketIO::EMPTY_HASH end
|
120
|
-
|
121
|
-
def user?
|
122
|
-
env[RocketIO::REMOTE_USER]
|
123
|
-
end
|
124
|
-
|
125
|
-
# checks whether authentication is required and
|
126
|
-
# send an authorization request if credentials not present or invalid
|
127
|
-
def validate_or_request_authentication_if_needed
|
128
|
-
return unless auth = digest_auth[requested_method] || basic_auth[requested_method]
|
129
|
-
return unless prompt = auth[:class].new(proc {}, *auth[:arguments]) do |*a|
|
130
|
-
self.__send__(auth[:method], *a)
|
131
|
-
end.call(
|
132
|
-
if RocketIO::HTTP_AUTHORIZATION_KEYS.detect {|key| env.has_key?(key)}
|
133
|
-
env
|
134
|
-
else
|
135
|
-
env.merge(RocketIO::HTTP_AUTHORIZATION_KEYS.first => auth[:mock])
|
136
|
-
end
|
137
|
-
)
|
138
|
-
throw(:__response__, prompt)
|
139
|
-
end
|
140
|
-
end
|
141
|
-
end
|