class Mongo::Address

Represents an address to a server, either with an IP address or socket path.

@since 2.0.0

Constants

FAMILY_MAP

Mapping from socket family to resolver class.

@since 2.0.0

LOCALHOST

The localhost constant.

@since 2.1.0

Attributes

host[R]

@return [ String ] host The original host name.

port[R]

@return [ Integer ] port The port.

seed[R]

@return [ String ] seed The seed address.

Public Class Methods

new(seed, options = {}) click to toggle source

Initialize the address.

@example Initialize the address with a DNS entry and port.

Mongo::Address.new("app.example.com:27017")

@example Initialize the address with a DNS entry and no port.

Mongo::Address.new("app.example.com")

@example Initialize the address with an IPV4 address and port.

Mongo::Address.new("127.0.0.1:27017")

@example Initialize the address with an IPV4 address and no port.

Mongo::Address.new("127.0.0.1")

@example Initialize the address with an IPV6 address and port.

Mongo::Address.new("[::1]:27017")

@example Initialize the address with an IPV6 address and no port.

Mongo::Address.new("[::1]")

@example Initialize the address with a unix socket.

Mongo::Address.new("/path/to/socket.sock")

@param [ String ] seed The provided address. @param [ Hash ] options The address options.

@since 2.0.0

# File lib/mongo/address.rb, line 119
def initialize(seed, options = {})
  @seed = seed
  @host, @port = parse_host_port
  @options = options
end

Public Instance Methods

==(other) click to toggle source

Check equality of the address to another.

@example Check address equality.

address == other

@param [ Object ] other The other object.

@return [ true, false ] If the objects are equal.

@since 2.0.0

# File lib/mongo/address.rb, line 61
def ==(other)
  return false unless other.is_a?(Address)
  host == other.host && port == other.port
end
connect_socket!(socket) click to toggle source

Connect a socket.

@example Connect a socket.

address.connect_socket!(socket)

@since 2.4.3

# File lib/mongo/address.rb, line 171
def connect_socket!(socket)
  socket.connect!(connect_timeout)
end
eql?(other) click to toggle source

Check equality for hashing.

@example Check hashing equality.

address.eql?(other)

@param [ Object ] other The other object.

@return [ true, false ] If the objects are equal.

@since 2.2.0

# File lib/mongo/address.rb, line 76
def eql?(other)
  self == other
end
hash() click to toggle source

Calculate the hash value for the address.

@example Calculate the hash value.

address.hash

@return [ Integer ] The hash value.

@since 2.0.0

# File lib/mongo/address.rb, line 88
def hash
  [ host, port ].hash
end
inspect() click to toggle source

Get a pretty printed address inspection.

@example Get the address inspection.

address.inspect

@return [ String ] The nice inspection string.

@since 2.0.0

# File lib/mongo/address.rb, line 133
def inspect
  "#<Mongo::Address:0x#{object_id} address=#{to_s}>"
end
socket(socket_timeout, ssl_options = {}) click to toggle source

Get a socket for the provided address, given the options.

@example Get a socket.

address.socket(5, :ssl => true)

@param [ Float ] socket_timeout The socket timeout. @param [ Hash ] ssl_options SSL options.

@return [ Pool::Socket::SSL, Pool::Socket::TCP, Pool::Socket::Unix ] The socket.

@since 2.0.0

# File lib/mongo/address.rb, line 148
def socket(socket_timeout, ssl_options = {})
  @resolver ||= initialize_resolver!(ssl_options)
  @resolver.socket(socket_timeout, ssl_options)
end
to_s() click to toggle source

Get the address as a string.

@example Get the address as a string.

address.to_s

@return [ String ] The nice string.

@since 2.0.0

# File lib/mongo/address.rb, line 161
def to_s
  port ? "#{host}:#{port}" : host
end

Private Instance Methods

connect_timeout() click to toggle source
# File lib/mongo/address.rb, line 177
def connect_timeout
  @connect_timeout ||= @options[:connect_timeout] || Server::CONNECT_TIMEOUT
end
initialize_resolver!(ssl_options) click to toggle source
# File lib/mongo/address.rb, line 181
def initialize_resolver!(ssl_options)
  return Unix.new(seed.downcase) if seed.downcase =~ Unix::MATCH

  family = (host == LOCALHOST) ? ::Socket::AF_INET : ::Socket::AF_UNSPEC
  error = nil
  ::Socket.getaddrinfo(host, nil, family, ::Socket::SOCK_STREAM).each do |info|
    begin
      res = FAMILY_MAP[info[4]].new(info[3], port, host)
      res.socket(connect_timeout, ssl_options).connect!(connect_timeout).close
      return res
    rescue IOError, SystemCallError, Error::SocketTimeoutError, Error::SocketError => e
      error = e
    end
  end
  raise error
end
parse_host_port() click to toggle source
# File lib/mongo/address.rb, line 198
def parse_host_port
  address = seed.downcase
  case address
    when Unix::MATCH then Unix.parse(address)
    when IPv6::MATCH then IPv6.parse(address)
    else IPv4.parse(address)
  end
end