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 -