Websocketd: correctly removes the client.
parent
15db08db0b
commit
16daa80d5d
|
@ -72,39 +72,33 @@ class InstanceStorage
|
|||
|
||||
def remove_fd (fdclient : Int32)
|
||||
# 1. closing both the client and the service
|
||||
fdservice = @switchtable[fdclient]
|
||||
# puts "1. fds to close: #{fdclient} and #{fdservice}"
|
||||
fdservice = @switchtable[fdclient]?
|
||||
tcpfdc = @socklist[fdclient]
|
||||
service = @connectionlist[fdservice]
|
||||
|
||||
# 2. closing the TCP connections
|
||||
# puts "2.1 closing fd #{fdclient}"
|
||||
tcpfdc.close unless tcpfdc.closed?
|
||||
# puts "2.2 closing fd #{fdservice}"
|
||||
service.close
|
||||
|
||||
# 3. removing the client and the service fds from the loop check
|
||||
# puts "3.1. removing #{fdclient} from @service"
|
||||
@service.remove_fd (fdclient)
|
||||
# puts "3.2. removing #{fdservice} from @service"
|
||||
@service.remove_fd (fdservice)
|
||||
|
||||
# 4. removing the service IPC::Connection from connectionlist
|
||||
# puts "4. removing fdservice from @connectionlist"
|
||||
@connectionlist.select do |k, v|
|
||||
k != fdservice
|
||||
end
|
||||
|
||||
# 5. removing both the client and the service from the switchtable
|
||||
# puts "5. removing both fd from @switchable"
|
||||
@switchtable.select do |fdc, fds|
|
||||
@switchtable = @switchtable.select do |fdc, fds|
|
||||
fdc != fdclient && fds != fdclient
|
||||
end
|
||||
|
||||
# 6. removing the client and the service from fdlist
|
||||
# puts "6. removing both fd from fdlist"
|
||||
@fdlist.select do |fd,v| fd != fdclient end
|
||||
@fdlist.select do |fd,v| fd != fdservice end
|
||||
@fdlist = @fdlist.select do |fd,v| fd != fdclient end
|
||||
|
||||
unless fdservice.nil?
|
||||
service = @connectionlist[fdservice]
|
||||
service.close
|
||||
@service.remove_fd (fdservice)
|
||||
@connectionlist = @connectionlist.select do |k, v|
|
||||
k != fdservice
|
||||
end
|
||||
|
||||
@fdlist = @fdlist.select do |fd,v| fd != fdservice end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -120,13 +114,11 @@ def websocket_client_connection(client, context : InstanceStorage)
|
|||
# pp! request
|
||||
|
||||
if request.nil?
|
||||
puts "#{CRED}eEQUEST IS NIL#{CRESET}"
|
||||
return
|
||||
raise "#REQUEST IS NIL"
|
||||
end
|
||||
|
||||
if request.is_a? HTTP::Request::BadRequest
|
||||
puts "#{CRED}BAD REQUEST DAZE~#{CRESET}"
|
||||
return
|
||||
raise "BAD REQUEST DAZE~"
|
||||
end
|
||||
|
||||
# FIXME: check they actually wanted to upgrade to websocket
|
||||
|
@ -280,8 +272,13 @@ service.loop do |event|
|
|||
# 1. accept new websocket clients
|
||||
if server.fd == event.connection.fd
|
||||
client = server.accept
|
||||
begin
|
||||
websocket_client_connection client, context
|
||||
puts "#{CBLUE}new client:#{CRESET} #{client.fd}"
|
||||
rescue e
|
||||
puts "Exception: #{CRED}#{e}#{CRESET}"
|
||||
client.close
|
||||
end
|
||||
next
|
||||
end
|
||||
|
||||
|
@ -296,7 +293,7 @@ service.loop do |event|
|
|||
message = wsclient.read
|
||||
|
||||
if message.nil?
|
||||
puts "#{CBLUE}disconnection of client #{event.connection.fd}#{CRESET}"
|
||||
puts "#{CBLUE}disconnection of client#{CRESET} #{event.connection.fd}"
|
||||
closing_client activefd, context
|
||||
next
|
||||
end
|
||||
|
|
Reference in New Issue