mirror of
https://github.com/faye/websocket-driver-ruby.git
synced 2025-11-01 13:59:38 +00:00
81 lines
1.8 KiB
Ruby
81 lines
1.8 KiB
Ruby
module WebSocket
|
|
class Driver
|
|
|
|
class Server < Driver
|
|
EVENTS = %w[open message error close ping pong]
|
|
|
|
def initialize(socket, options = {})
|
|
super
|
|
@http = HTTP::Request.new
|
|
@delegate = nil
|
|
end
|
|
|
|
def env
|
|
@http.complete? ? @http.env : nil
|
|
end
|
|
|
|
def url
|
|
return nil unless e = env
|
|
|
|
url = "ws://#{ e['HTTP_HOST'] }"
|
|
url << e['PATH_INFO']
|
|
url << "?#{ e['QUERY_STRING'] }" unless e['QUERY_STRING'] == ''
|
|
url
|
|
end
|
|
|
|
%w[add_extension set_header start frame text binary ping close].each do |method|
|
|
define_method(method) do |*args, &block|
|
|
if @delegate
|
|
@delegate.__send__(method, *args, &block)
|
|
else
|
|
@queue << [method, args, block]
|
|
true
|
|
end
|
|
end
|
|
end
|
|
|
|
%w[protocol version].each do |method|
|
|
define_method(method) do
|
|
@delegate && @delegate.__send__(method)
|
|
end
|
|
end
|
|
|
|
def parse(chunk)
|
|
return @delegate.parse(chunk) if @delegate
|
|
|
|
@http.parse(chunk)
|
|
return fail_request('Invalid HTTP request') if @http.error?
|
|
return unless @http.complete?
|
|
|
|
@delegate = Driver.rack(self, @options)
|
|
open
|
|
|
|
EVENTS.each do |event|
|
|
@delegate.on(event) { |e| emit(event, e) }
|
|
end
|
|
|
|
emit(:connect, ConnectEvent.new)
|
|
end
|
|
|
|
def write(buffer)
|
|
@socket.write(buffer)
|
|
end
|
|
|
|
private
|
|
|
|
def fail_request(message)
|
|
emit(:error, ProtocolError.new(message))
|
|
emit(:close, CloseEvent.new(Hybi::ERRORS[:protocol_error], message))
|
|
end
|
|
|
|
def open
|
|
@queue.each do |method, args, block|
|
|
@delegate.__send__(method, *args, &block)
|
|
end
|
|
@queue = []
|
|
end
|
|
end
|
|
|
|
end
|
|
end
|