class Cucumber::WireSupport::Connection

def call_remote(request_handler, message, params)

def call_remote(request_handler, message, params)
  packet = WirePacket.new(message, params)
  begin
    send_data_to_socket(packet.to_json)
    response = fetch_data_from_socket(@config.timeout(message))
    response.handle_with(request_handler)
  rescue Timeout::Error => e
    backtrace = e.backtrace ; backtrace.shift # because Timeout puts some wierd stuff in there
    raise Timeout::Error, "Timed out calling wire server with message '#{message}'", backtrace
  end
end

def exception(params)

def exception(params)
  WireException.new(params, @config)
end

def fetch_data_from_socket(timeout)

def fetch_data_from_socket(timeout)
  raw_response =
    if timeout == :never
      socket.gets
    else
      Timeout.timeout(timeout) { socket.gets }
    end
  raise exception({'message' => "Remote Socket with #{@config.host}:#{@config.port} closed."}) if raw_response.nil?
  WirePacket.parse(raw_response)
end

def initialize(config)

def initialize(config)
  @config = config
end

def send_data_to_socket(data)

def send_data_to_socket(data)
  Timeout.timeout(@config.timeout('connect')) { socket.puts(data) }
end

def socket

def socket
  return @socket if @socket
  if @config.unix
    @socket = UNIXSocket.new(@config.unix)
  else
    @socket = TCPSocket.new(@config.host, @config.port)
  end
rescue Errno::ECONNREFUSED => exception
  raise(ConnectionError, "Unable to contact the wire server at #{@config}. Is it up?")
end