Websocketd: correctly removes the client.

master
Philippe PITTOLI 2019-08-03 09:50:03 +02:00
parent 15db08db0b
commit 16daa80d5d
1 changed files with 24 additions and 27 deletions

View File

@ -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
websocket_client_connection client, context
puts "#{CBLUE}new client:#{CRESET} #{client.fd}"
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