1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
require 'timeout'
require 'cucumber/wire/protocol'
require 'cucumber/wire/exception'
require 'cucumber/wire/data_packet'
module Cucumber
module Wire
class Connection
class ConnectionError < StandardError; end
include Wire::Protocol
def initialize(config)
@config = config
end
def call_remote(request_handler, message, params)
packet = DataPacket.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)
Wire::Exception.new(params, @config)
end
private
def send_data_to_socket(data)
Timeout.timeout(@config.timeout('connect')) { socket.puts(data) }
end
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?
DataPacket.parse(raw_response)
end
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
end
end
end
|