Class: Faye::RackAdapter
- Inherits:
-
Object
show all
- Includes:
- Logging
- Defined in:
- lib/faye/adapters/rack_adapter.rb
Defined Under Namespace
Classes: DeferredBody
Constant Summary
collapse
- ASYNC_RESPONSE =
Only supported under Thin
[-1, {}, []].freeze
- DEFAULT_ENDPOINT =
'/bayeux'
- SCRIPT_PATH =
File.join(ROOT, 'faye-browser-min.js')
- TYPE_JSON =
{'Content-Type' => 'application/json'}
- TYPE_SCRIPT =
{'Content-Type' => 'text/javascript'}
- TYPE_TEXT =
{'Content-Type' => 'text/plain'}
Constants included
from Logging
Logging::DEFAULT_LOG_LEVEL, Logging::LOG_LEVELS
Instance Attribute Summary
Attributes included from Logging
#log_level
Instance Method Summary
collapse
Methods included from Logging
#log
Constructor Details
#initialize(app = nil, options = nil) ⇒ RackAdapter
Returns a new instance of RackAdapter.
23
24
25
26
27
28
29
30
31
32
33
|
# File 'lib/faye/adapters/rack_adapter.rb', line 23
def initialize(app = nil, options = nil)
@app = app if app.respond_to?(:call)
@options = [app, options].grep(Hash).first || {}
@endpoint = @options[:mount] || DEFAULT_ENDPOINT
@endpoint_re = Regexp.new('^' + @endpoint + '(/[^/]*)*(\\.js)?$')
@server = Server.new(@options)
return unless extensions = @options[:extensions]
[*extensions].each { |extension| add_extension(extension) }
end
|
Instance Method Details
#add_extension(extension) ⇒ Object
35
36
37
|
# File 'lib/faye/adapters/rack_adapter.rb', line 35
def add_extension(extension)
@server.add_extension(extension)
end
|
#call(env) ⇒ Object
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
# File 'lib/faye/adapters/rack_adapter.rb', line 52
def call(env)
Faye.ensure_reactor_running!
request = Rack::Request.new(env)
unless request.path_info =~ @endpoint_re
return @app ? @app.call(env) :
[404, TYPE_TEXT, ["Sure you're not looking for #{@endpoint} ?"]]
end
if env['HTTP_UPGRADE'] == 'WebSocket'
return handle_upgrade(request)
end
if request.path_info =~ /\.js$/
return [200, TYPE_SCRIPT, File.new(SCRIPT_PATH)]
end
begin
json_msg = message_from_request(request)
message = JSON.parse(json_msg)
jsonp = request.params['jsonp'] || JSONP_CALLBACK
head = request.get? ? TYPE_SCRIPT.dup : TYPE_JSON.dup
origin = request.env['HTTP_ORIGIN']
callback = env['async.callback']
body = DeferredBody.new
debug 'Received ?: ?', env['REQUEST_METHOD'], json_msg
@server.flush_connection(message) if request.get?
head['Access-Control-Allow-Origin'] = origin if origin
callback.call [200, head, body]
@server.process(message, false) do |replies|
response = JSON.unparse(replies)
response = "#{ jsonp }(#{ response });" if request.get?
debug 'Returning ?', response
body.succeed(response)
end
ASYNC_RESPONSE
rescue
[400, TYPE_TEXT, ['Bad request']]
end
end
|
#get_client ⇒ Object
43
44
45
|
# File 'lib/faye/adapters/rack_adapter.rb', line 43
def get_client
@client ||= Client.new(@server)
end
|
#listen(port) ⇒ Object
47
48
49
50
|
# File 'lib/faye/adapters/rack_adapter.rb', line 47
def listen(port)
handler = Rack::Handler.get('thin')
handler.run(self, :Port => port)
end
|
#remove_extension(extension) ⇒ Object
39
40
41
|
# File 'lib/faye/adapters/rack_adapter.rb', line 39
def remove_extension(extension)
@server.remove_extension(extension)
end
|