Sha256: a5dde445867c0fcc518777c0d930e44d5cd5002d03452f8278de30ab27232513

Contents?: true

Size: 1.04 KB

Versions: 1

Compression:

Stored size: 1.04 KB

Contents

# frozen_string_literal: true

require 'async/dns'

module DoHClient
  class Server < Async::DNS::Server
    attr_reader :client
    def initialize(resolver)
      super
      @client = resolver == "cloudflare" ? DoHClient::Client::Cloudflare : DoHClient::Client::Google
    end

    def process(name, resource_class, transaction)
      type = resource_class.to_s.split('::').last

      begin
        response = client.resolve(name, type: type)
      rescue ResponseError => _
        return transaction.fail!(:NXDomain) unless answers
      end

      answers = response["Answer"]
      return transaction.fail!(:NXDomain) unless answers

      transaction.append_question!
      answers.each do |answer|
        next unless klass = Resolv::DNS::Resource.get_class(answer["type"], resource_class::ClassValue)
        resource = klass < Resolv::DNS::Resource::DomainName ? klass.new(Resolv::DNS::Name.create(answer["data"])) : klass.new(answer["data"])
        transaction.response.add_answer(answer["name"], answer["TTL"], resource)
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
doh_client-0.2.0 lib/doh_client/server.rb