class BWA::Proxy

Public Class Methods

new(host, port: 4257, listen_port: 4257) click to toggle source
# File lib/bwa/proxy.rb, line 6
def initialize(host, port: 4257, listen_port: 4257)
  @host, @port = host, port
  @listen_socket = TCPServer.open(port)
end

Public Instance Methods

run() click to toggle source
# File lib/bwa/proxy.rb, line 11
def run
  loop do
    client_socket = @listen_socket.accept
    server_socket = TCPSocket.new(@host, @port)
    t1 = Thread.new do
      shuffle_messages(client_socket, server_socket, "Client")
    end
    t2 = Thread.new do
      shuffle_messages(server_socket, client_socket, "Server")
    end
    t1.join
    t2.join
    break
  end
end
shuffle_messages(socket1, socket2, tag) click to toggle source
# File lib/bwa/proxy.rb, line 27
def shuffle_messages(socket1, socket2, tag)
  leftover_data = "".force_encoding(Encoding::ASCII_8BIT)
  loop do
    if leftover_data.length < 2 || leftover_data.length < leftover_data[1].ord + 2
      begin
        leftover_data += socket1.recv(128)
      rescue Errno::EBADF
        # we closed it on ourselves
        break
      end
    end
    if leftover_data.empty?
      socket2.close
      break
    end
    data_length = leftover_data[1].ord
    data = leftover_data[0...(data_length + 2)]
    leftover_data = leftover_data[(data_length + 2)..-1] || ''
    begin
      message = Message.parse(data)
      puts "#{tag}: #{message.inspect}"
    rescue InvalidMessage => e
      puts "#{tag}: #{e}"
    end
    socket2.send(data, 0)
  end
end