136 lines
3.4 KiB
Ruby
136 lines
3.4 KiB
Ruby
#****************************************************************************
|
|
# Copyright (c) quickfixengine.org All rights reserved.
|
|
#
|
|
# This file is part of the QuickFIX FIX Engine
|
|
#
|
|
# This file may be distributed under the terms of the quickfixengine.org
|
|
# license as defined by quickfixengine.org and appearing in the file
|
|
# LICENSE included in the packaging of this file.
|
|
#
|
|
# This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
|
# WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
|
#
|
|
# See http://www.quickfixengine.org/LICENSE for licensing information.
|
|
#
|
|
# Contact ask@quickfixengine.org if any conditions of this licensing are
|
|
# not clear to you.
|
|
#****************************************************************************
|
|
|
|
require 'Reflector'
|
|
require 'FixParser'
|
|
require "socket"
|
|
require 'uri'
|
|
require 'net/http'
|
|
|
|
class ReflectorClient
|
|
|
|
def initialize(messages, address, port)
|
|
@reflector = Reflector.new
|
|
@messages = messages
|
|
@sockets = Hash.new(nil)
|
|
@parsers = Hash.new(nil)
|
|
|
|
def @reflector.address=(a)
|
|
@address = a
|
|
end
|
|
|
|
def @reflector.port=(p)
|
|
@port = p
|
|
end
|
|
|
|
def @reflector.client=(c)
|
|
@client = c
|
|
end
|
|
|
|
def @reflector.sockets=(s)
|
|
@sockets = s
|
|
end
|
|
|
|
def @reflector.parsers=(p)
|
|
@parsers = p
|
|
end
|
|
|
|
def @reflector.connectAction(cid)
|
|
socket = TCPSocket.open(@address, @port)
|
|
if socket == nil
|
|
raise IOError("failed to connect")
|
|
end
|
|
@sockets[cid] = socket
|
|
@parsers[cid] = FixParser.new(socket)
|
|
end
|
|
|
|
def @reflector.disconnectAction(cid)
|
|
@sockets[cid].close
|
|
@sockets.delete(cid)
|
|
@parsers.delete(cid)
|
|
end
|
|
|
|
def @reflector.setSeqnum(body)
|
|
left_array = body.split(" ")
|
|
uri = URI('http://localhost:8095/seqnum?SESSION='+left_array[1]+'&'+left_array[2])
|
|
Net::HTTP.get_response(uri)
|
|
end
|
|
|
|
def @reflector.waitConnectAction(cid)
|
|
end
|
|
|
|
def @reflector.waitDisconnectAction(cid)
|
|
begin
|
|
socket = @sockets[cid]
|
|
if IO.select([socket], nil, nil, 10) == nil then
|
|
raise "Connection hangs after ten seconds."
|
|
elsif !socket.eof? then
|
|
raise "Expected disconnection, got data"
|
|
end
|
|
rescue Errno::ECONNRESET
|
|
# Ignore, server has already disconnected the socket
|
|
end
|
|
end
|
|
|
|
def @reflector.initiateAction(msg, cid)
|
|
if( @sockets[cid] == nil )
|
|
raise "Unable to send message because connection was dropped"
|
|
end
|
|
@sockets[cid].write(msg)
|
|
@client.initiateAction(msg, cid)
|
|
end
|
|
|
|
def @reflector.expectedAction(msg, cid)
|
|
m = @parsers[cid].readFixMessage
|
|
@client.expectedAction(msg, cid)
|
|
@client.compareAction(msg, m)
|
|
end
|
|
|
|
def @reflector.errorAction(lineNum, line)
|
|
@client.errorAction(lineNum, line)
|
|
end
|
|
|
|
@reflector.client = self
|
|
@reflector.address = address
|
|
@reflector.port = port
|
|
@reflector.sockets = @sockets
|
|
@reflector.parsers = @parsers
|
|
end
|
|
|
|
def start()
|
|
@reflector.processFile(@messages)
|
|
end
|
|
|
|
def stop()
|
|
@sockets.each do
|
|
|cid, s|
|
|
begin
|
|
s.close
|
|
rescue
|
|
end
|
|
end
|
|
end
|
|
|
|
def initiateAction(msg, cid)
|
|
end
|
|
def expectedAction(msg, cid)
|
|
end
|
|
def responseAction(msg, cid)
|
|
end
|
|
end
|