class NoSE::Proxy::ProxyBase

A proxy server to interpret our query language and implement query plans

Attributes

logger[R]

Public Class Methods

new(config, result, backend) click to toggle source
# File lib/nose/proxy.rb, line 9
def initialize(config, result, backend)
  @logger = Logging.logger['nose::proxy']

  @result = result
  @backend = backend
  @config = config

  @continue = true
end

Public Instance Methods

handle_connection(_socket) click to toggle source

@abstract Subclasses should process a new connection

on the given socket

:nocov: @return [void]

# File lib/nose/proxy.rb, line 38
def handle_connection(_socket)
  fail NotImplementedError
end
remove_connection(_socket) click to toggle source

@abstract Subclasses should dispose of state associated with the socket :nocov: @return [void]

# File lib/nose/proxy.rb, line 46
def remove_connection(_socket)
  fail NotImplementedError
end
start() click to toggle source

Start the proxy server @return [void]

# File lib/nose/proxy.rb, line 21
def start
  @logger.info "Starting server on port #{@config[:port]}"

  server_socket = TCPServer.new('127.0.0.1', @config[:port])
  server_socket.listen(100)

  @read_sockets = [server_socket]
  @write_sockets = []
  loop do
    break unless @continue && select_connection(server_socket)
  end
end
stop() click to toggle source

Stop accepting connections @return [void]

# File lib/nose/proxy.rb, line 53
def stop
  @continue = false
end

Private Instance Methods

accept_connection(server_socket) click to toggle source

Accept the new connection @return [void]

# File lib/nose/proxy.rb, line 86
def accept_connection(server_socket)
  client_socket, = server_socket.accept
  @read_sockets << client_socket
  @write_sockets << client_socket
end
process_connections(sockets) click to toggle source

Process all pending connections @return [void]

# File lib/nose/proxy.rb, line 94
def process_connections(sockets)
  sockets.each do |socket|
    @write_sockets.delete socket
    @read_sockets.delete socket unless handle_connection socket
  end
end
select_connection(server_socket) click to toggle source

Select sockets which are available to be processed @return [void]

# File lib/nose/proxy.rb, line 61
def select_connection(server_socket)
  read, write, error = IO.select @read_sockets, @write_sockets,
                                 @read_sockets + @write_sockets, 5
  return true if read.nil?

  # Check if we have a new incoming connection
  if read.include? server_socket
    accept_connection server_socket
    read.delete server_socket
  elsif error.include? server_socket
    @logger.error 'Server socket died'
    return false
  end

  # Remove all sockets which have errors
  error.each { |socket| remove_connection socket }
  @read_sockets -= error
  @write_sockets -= error

  # Handle connections on each available socket
  process_connections read + write
end