lib/faye/adapters/rack_adapter.rb in faye-1.0.4 vs lib/faye/adapters/rack_adapter.rb in faye-1.1.0
- old
+ new
@@ -20,24 +20,34 @@
# This header is passed by Rack::Proxy during testing. Rack::Proxy seems to
# set content-length for you, and setting it in here really slows the tests
# down. Better suggestions welcome.
HTTP_X_NO_CONTENT_LENGTH = 'HTTP_X_NO_CONTENT_LENGTH'
- def initialize(app = nil, options = nil)
+ def initialize(app = nil, options = nil, &block)
@app = app if app.respond_to?(:call)
@options = [app, options].grep(Hash).first || {}
+ ::WebSocket::Driver.validate_options(@options, [:engine, :mount, :ping, :timeout, :extensions, :websocket_extensions])
+
@endpoint = @options[:mount] || DEFAULT_ENDPOINT
+ @extensions = []
@endpoint_re = Regexp.new('^' + @endpoint.gsub(/\/$/, '') + '(/[^/]*)*(\\.[^\\.]+)?$')
@server = Server.new(@options)
@static = StaticServer.new(ROOT, /\.(?:js|map)$/)
@static.map(File.basename(@endpoint) + '.js', SCRIPT_PATH)
@static.map('client.js', SCRIPT_PATH)
- return unless extensions = @options[:extensions]
- [*extensions].each { |extension| add_extension(extension) }
+ if extensions = @options[:extensions]
+ [*extensions].each { |extension| add_extension(extension) }
+ end
+
+ if websocket_extensions = @options[:websocket_extensions]
+ [*websocket_extensions].each { |ext| add_websocket_extension(ext) }
+ end
+
+ block.call(self) if block
end
def listen(*args)
raise 'The listen() method is deprecated - see https://github.com/faye/faye-websocket-ruby#running-your-socket-application for information on running your Faye server'
end
@@ -48,10 +58,14 @@
def remove_extension(extension)
@server.remove_extension(extension)
end
+ def add_websocket_extension(extension)
+ @extensions << extension
+ end
+
def close
@server.close
end
def get_client
@@ -87,12 +101,17 @@
unless json_msg = message_from_request(request)
error 'Received request with no message: ?', format_request(request)
return [400, TYPE_TEXT, ['Bad request']]
end
- debug "Received message via HTTP #{request.request_method}: ?", json_msg
+ unless json_msg.force_encoding('UTF-8').valid_encoding?
+ error 'Received request with invalid encoding: ?', format_request(request)
+ return [400, TYPE_TEXT, ['Bad request']]
+ end
+ debug("Received message via HTTP #{request.request_method}: ?", json_msg)
+
message = MultiJson.load(json_msg)
jsonp = request.params['jsonp'] || JSONP_CALLBACK
headers = request.get? ? TYPE_SCRIPT.dup : TYPE_JSON.dup
origin = request.env['HTTP_ORIGIN']
callback = request.env['async.callback']
@@ -118,11 +137,11 @@
headers['Content-Disposition'] = 'attachment; filename=f.txt'
end
headers['Content-Length'] = response.bytesize.to_s unless request.env[HTTP_X_NO_CONTENT_LENGTH]
headers['Connection'] = 'close'
- debug 'HTTP response: ?', response
+ debug('HTTP response: ?', response)
send_response([200, headers, [response]], hijack, callback)
end
end
ASYNC_RESPONSE
@@ -167,21 +186,22 @@
hijack.flush
hijack.close_write
end
def handle_websocket(request)
- ws = Faye::WebSocket.new(request.env, nil, :ping => @options[:ping])
+ options = {:extensions => @extensions, :ping => @options[:ping]}
+ ws = Faye::WebSocket.new(request.env, [], options)
client_id = nil
ws.onmessage = lambda do |event|
begin
- debug "Received message via WebSocket[#{ws.version}]: ?", event.data
+ debug("Received message via WebSocket[#{ws.version}]: ?", event.data)
message = MultiJson.load(event.data)
cid = Faye.client_id_from_messages(message)
- @server.close_socket(client_id) if client_id and cid and cid != client_id
+ @server.close_socket(client_id, false) if client_id and cid and cid != client_id
@server.open_socket(cid, ws, request)
client_id = cid
@server.process(message, request) do |replies|
ws.send(Faye.to_json(replies)) if ws
@@ -201,11 +221,11 @@
def handle_eventsource(request)
es = Faye::EventSource.new(request.env, :ping => @options[:ping])
client_id = es.url.split('/').pop
- debug 'Opened EventSource connection for ?', client_id
+ debug('Opened EventSource connection for ?', client_id)
@server.open_socket(client_id, es, request)
es.onclose = lambda do |event|
@server.close_socket(client_id)
es = nil
@@ -236,6 +256,5 @@
string
end
end
end
-