Sha256: 55af11f2763579f798e2c6f56e12cb55db752c8276bba2a3c1d2dd6bd374fc19

Contents?: true

Size: 1.55 KB

Versions: 1

Compression:

Stored size: 1.55 KB

Contents

# frozen_string_literal: true

module GitHubPages
  module HealthCheck
    class Resolver
      DEFAULT_RESOLVER_OPTIONS = {
        :retry_times => 2,
        :query_timeout => 5,
        :dnssec => true
      }.freeze

      PREFERS_AUTHORITATIVE_ANSWER = [
        Dnsruby::Types::A,
        Dnsruby::Types::CAA,
        Dnsruby::Types::MX
      ].freeze

      class << self
        def default_resolver
          @default_resolver ||= Dnsruby::Resolver.new(DEFAULT_RESOLVER_OPTIONS)
        end
      end

      attr_reader :domain

      def initialize(domain)
        @domain = domain
      end

      # rubocop:disable Metrics/AbcSize
      def query(type)
        if PREFERS_AUTHORITATIVE_ANSWER.include?(type)
          answer = authoritative_resolver.query(domain, type).answer
          return answer unless answer.empty?
        end

        self.class.default_resolver.query(domain, type).answer
      rescue Dnsruby::ResolvTimeout, Dnsruby::ResolvError
        self.class.default_resolver.query(domain, type).answer
      end
      # rubocop:enable Metrics/AbcSize

      private

      def authoritative_resolver
        return self.class.default_resolver if nameservers.nil? || nameservers.empty?

        Dnsruby::Resolver.new(DEFAULT_RESOLVER_OPTIONS.merge(:nameservers => nameservers))
      end

      def nameservers
        @nameservers ||= begin
          self.class.default_resolver.query(domain, Dnsruby::Types::NS).answer.map do |rr|
            next rr.nsdname.to_s if rr.type == Dnsruby::Types::NS
          end.compact
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
github-pages-health-check-1.8.0 lib/github-pages-health-check/resolver.rb