123456789_123456789_123456789_123456789_123456789_

Class: Mongo::Srv::Resolver Private

Do not use. This class is for internal use only.
Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Instance Chain:
Inherits: Object
Defined in: lib/mongo/srv/resolver.rb

Overview

Encapsulates the necessary behavior for querying SRV records as required by the driver.

Constant Summary

::Mongo::Loggable - Included

PREFIX

Class Method Summary

Instance Attribute Summary

Instance Method Summary

::Mongo::Loggable - Included

#log_debug

Convenience method to log debug messages with the standard prefix.

#log_error

Convenience method to log error messages with the standard prefix.

#log_fatal

Convenience method to log fatal messages with the standard prefix.

#log_info

Convenience method to log info messages with the standard prefix.

#log_warn

Convenience method to log warn messages with the standard prefix.

#logger

Get the logger instance.

#_mongo_log_prefix, #format_message

Instance Attribute Details

#optionsHash (readonly)

Returns:

  • (Hash)

    Resolver options.

[ GitHub ]

  
# File 'lib/mongo/srv/resolver.rb', line 58

attr_reader :options

#raise_on_invalid?Boolean (readonly, private)

Checks whether an error should be raised due to either a record with a mismatched domain being found or no records being found.

Returns:

  • (Boolean)

    Whether an error should be raised.

[ GitHub ]

  
# File 'lib/mongo/srv/resolver.rb', line 153

def raise_on_invalid?
  @raise_on_invalid ||= @options[:raise_on_invalid] || true
end

Instance Method Details

#get_records(hostname, srv_service_name = nil, srv_max_hosts = nil) ⇒ Mongo::Srv::Result

Obtains all of the SRV records for a given hostname. If a srv_max_hosts is specified and it is greater than 0, return maximum srv_max_hosts records.

In the event that a record with a mismatched domain is found or no records are found, if the :raise_on_invalid option is true, an exception will be raised, otherwise a warning will be logged.

Parameters:

  • hostname (String)

    The hostname whose records should be obtained.

  • srv_service_name (String | nil) (defaults to: nil)

    The SRV service name for the DNS query. If nil, ‘mongodb’ is used.

  • srv_max_hosts (Integer | nil) (defaults to: nil)

    The maximum number of records to return. If this value is nil, return all of the records.

Returns:

Raises:

[ GitHub ]

  
# File 'lib/mongo/srv/resolver.rb', line 84

def get_records(hostname, srv_service_name=nil, srv_max_hosts=nil)
  query_name = record_prefix(srv_service_name) + hostname
  resources = @resolver.getresources(query_name, Resolv::DNS::Resource::IN::SRV)

  # Collect all of the records into a Result object, raising an error
  # or logging a warning if a record with a mismatched domain is found.
  # Note that in the case a warning is raised, the record is _not_
  # added to the Result object.
  result = Srv::Result.new(hostname)
  resources.each do |record|
    begin
      result.add_record(record)
    rescue Error::MismatchedDomain => e
      if raise_on_invalid?
        raise
      else
        log_warn(e.message)
      end
    end
  end

  # If no records are found, either raise an error or log a warning
  # based on the Resolver's :raise_on_invalid option.
  if result.empty?
    if raise_on_invalid?
      raise Error::NoSRVRecords.new(URI::SRVProtocol::NO_SRV_RECORDS % hostname)
    else
      log_warn(URI::SRVProtocol::NO_SRV_RECORDS % hostname)
    end
  end

  # if srv_max_hosts is in [1, #addresses)
  if (1...result.address_strs.length).include? srv_max_hosts
    sampled_records = resources.shuffle.first(srv_max_hosts)
    result = Srv::Result.new(hostname)
    sampled_records.each { |record| result.add_record(record) }
  end
  result
end

#get_txt_options_string(hostname) ⇒ nil | String

Obtains the TXT records of a host.

Parameters:

  • hostname (String)

    The host whose TXT records should be obtained.

Returns:

  • (nil | String)

    ::Mongo::URI options string from TXT record associated with the hostname, or nil if there is no such record.

Raises:

[ GitHub ]

  
# File 'lib/mongo/srv/resolver.rb', line 132

def get_txt_options_string(hostname)
  records = @resolver.getresources(hostname, Resolv::DNS::Resource::IN::TXT)
  if records.empty?
    return nil
  end

  if records.length > 1
    msg = "Only one TXT record is allowed: querying hostname #{hostname} returned #{records.length} records"

    raise Error::InvalidTXTRecord, msg
  end

  records[0].strings.join
end

#record_prefix(srv_service_name = nil) ⇒ String

Generates the record prefix with a custom SRV service name if it is provided.

Parameters:

  • srv_service_name (Hash) (defaults to: nil)

    a customizable set of options

Options Hash (srv_service_name):

  • The (String | nil)

    SRV service name to use in the record prefix.

Returns:

  • (String)

    The generated record prefix.

[ GitHub ]

  
# File 'lib/mongo/srv/resolver.rb', line 38

def record_prefix(srv_service_name=nil)
  return srv_service_name ? "_#{srv_service_name}._tcp." : RECORD_PREFIX
end

#timeout

[ GitHub ]

  
# File 'lib/mongo/srv/resolver.rb', line 60

def timeout
  options[:timeout] || Monitor::DEFAULT_TIMEOUT
end