lib/kjess/connection.rb in kjess-1.1.0 vs lib/kjess/connection.rb in kjess-1.2.0

- old
+ new

@@ -5,20 +5,43 @@ require 'kjess/socket' module KJess # Connection class Connection - class Error < KJess::Error; end + class Error < KJess::NetworkError; end + # Public: Set a socket factory + # + # factory - an object that responds to #call(options) where options is + # a Hash. + # + # returns nothing + def self.socket_factory=(factory) + @socket_factory = factory + end + + # Public: Return the socket factory + # + def self.socket_factory + @socket_factory ||= nil + @socket_factory.respond_to?(:call) ? @socket_factory : default_socket_factory + end + + # Internal: Returns the default socket factory + # + def self.default_socket_factory + lambda { |options| KJess::Socket.connect(options) } + end + # Public: The hostname/ip address to connect to. def host - socket.host + @options[:host] end # Public: The port number to connect to. Default 22133 def port - socket.port + @options[:port] end # Public: The timeout for connecting in seconds. Defaults to 2 def connect_timeout socket.connect_timeout @@ -93,14 +116,16 @@ # # Returns a KJess::Socket def socket close if @pid && @pid != Process.pid return @socket if @socket and not @socket.closed? - @socket = Socket.connect( @options ) + @socket = self.class.socket_factory.call(@options) @pid = Process.pid @read_buffer = '' return @socket + rescue => e + raise Error, "Could not connect to #{host}:#{port}: #{e.class}: #{e.message}", e.backtrace end # Internal: close the socket if it is not already closed # # Returns nothing @@ -125,13 +150,16 @@ # # Returns nothing def write( msg ) $stderr.puts "--> #{msg}" if $DEBUG socket.write( msg ) - rescue KJess::Error + rescue KJess::NetworkError close raise + rescue => e + close + raise Error, "Could not write to #{host}:#{port}: #{e.class}: #{e.message}", e.backtrace end # Internal: read a single line from the socket # # eom - the End Of Mesasge delimiter (default: "\r\n") @@ -146,11 +174,11 @@ line = @read_buffer.slice!(0, idx + eom.length) $stderr.puts "<-- #{line}" if $DEBUG break unless line.strip.length == 0 end return line - rescue KJess::Error + rescue KJess::NetworkError close raise rescue EOFError close return "EOF" @@ -171,11 +199,14 @@ result = @read_buffer.slice!(0, nbytes) $stderr.puts "<-- #{result}" if $DEBUG return result - rescue KJess::Error + rescue KJess::NetworkError close raise + rescue => e + close + raise Error, "Could not read from #{host}:#{port}: #{e.class}: #{e.message}", e.backtrace end end end