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