class SystemBrowser::Server

Attributes

session[RW]

@return [SystemBrowser::Session]

Public Class Methods

new(port = 9696) click to toggle source
# File lib/system_browser/server.rb, line 7
def initialize(port = 9696)
  self.create_tcpserver(port)
end

Public Instance Methods

shutdown() click to toggle source
# File lib/system_browser/server.rb, line 26
def shutdown
  SLogger.debug("[server] shutting down the TCP server...")

  @tcpserver.close
end
start() click to toggle source

Starts the TCP server.

@note This method blocks the thread.

# File lib/system_browser/server.rb, line 15
def start
  Socket.accept_loop(@tcpserver) do |connection|
    SLogger.debug("[server] accepted a new connection (#{connection})")

    self.session.connection = connection
    self.handle_connection(connection)
  end
rescue IOError
  Thread.exit
end

Protected Instance Methods

create_tcpserver(port) click to toggle source

Creates a new TCP server and tries to find a free port. @return [void]

# File lib/system_browser/server.rb, line 37
def create_tcpserver(port)
  @tcpserver = TCPServer.new(port)
rescue Errno::EADDRINUSE
  SLogger.debug("[server] port #{port} is occupied. Trying port #{port + 1}")

  port += 1
  retry
end
handle_connection(connection) click to toggle source

Handles incoming connections.

@param connection [TCPSocket] @return [void]

# File lib/system_browser/server.rb, line 51
def handle_connection(connection)
  loop do
    unless readval = connection.gets
      SLogger.debug("[server] connection #{connection} interrupted")

      shutdown
      break
    end

    if readval == Request::FIN
      SLogger.debug("[server] received the FIN request")

      self.session.destroy
      break
    else
      SLogger.debug("[server] received a request")

      self.process_request(Request.new(readval))
    end
  end
end
process_request(request) click to toggle source

@param request [SystemBrowser::Request] @return [void]

# File lib/system_browser/server.rb, line 76
def process_request(request)
  RequestProcessor.new(request: request, session: self.session).process
rescue => e
  SLogger.log_error(e)
end