def start
@started = true
@server = ::TCPServer.new('127.0.0.1', port)
@port = @server.addr[1]
@thread = Thread.new do
while @started
debug('enter client loop')
@client = begin
@server.accept
rescue => e
debug("error on accept: #{e}")
nil
end
next unless @client
respond_with('220 Can has FTP?')
@connection = Thread.new(@client) do |socket|
debug('enter request thread')
while @started && !socket.nil? && !socket.closed?
input = begin
socket.gets
rescue
debug("error on socket.gets: #{e}")
nil
end
if input
debug("server client raw: <- #{input.inspect}")
respond_with(handle_request(input))
end
end
unless @client.nil?
@client.close unless @client.closed?
@client = nil
end
debug('leave request thread')
end
debug('leave client loop')
end
unless @server.nil?
@server.close unless @server.closed?
@server = nil
end
end
return unless passive_port
@data_server = ::TCPServer.new('127.0.0.1', passive_port)
@passive_port = @data_server.addr[1]
end