Skip to content
Find file
Fetching contributors…
Cannot retrieve contributors at this time
74 lines (60 sloc) 1.76 KB
require "rubygems"
require "eventmachine"
require "request"
require "headers"
module ServerMethods
def post_init
puts "Received a new connection"
@request = Request.new
@msg_buffer = BufferedTokenizer.new("\377")
@state = :handshake
end
def receive_data(data)
process if @request.parse(data)
# puts @request.env.inspect
# puts @request.body
rescue InvalidRequest => e
log "!! Invalid request"
log_error e
close_connection
end
def process
case @state
when :handshake
send_handshake
@state = :message
when :message
#assign a single thread to process of the messages of the given user
EventMachine.defer(method(:process_message), method(:post_process))
end
end
def send_handshake
headers = Headers.new
headers['Upgrade'] = "WebSocket"
headers['Connection'] = "Upgrade"
headers['WebSocket-Origin'] = @request.env["HTTP_ORIGIN"]
headers['WebSocket-Location'] = "ws://#{@request.env["HTTP_HOST"]}/"
result = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n#{headers.to_s}\r\n"
puts "sending handshake..."
send_data(result)
end
def process_message
puts "processing messages"
output = []
#this will go thru all messages in stack
@msg_buffer.extract(@request.messages).each do |msg|
puts "received #{msg}"
output << msg
end
output
end
def post_process(result)
puts "sending #{result.join}"
result.each {|msg| send_data("\000#{msg}\377") }
#clears the body after processing messages
@request.messages = ""
end
end
EventMachine::run {
EventMachine::start_server "localhost", 2200, ServerMethods
}
Something went wrong with that request. Please try again.