module DomainRdap
RDAP availability and registration details (IANA bootstrap via rdap.org).
Constants
- BASE_URL
Public Instance Methods
Source
# File lib/domain_rdap.rb, line 14 def build_url(domain) "#{BASE_URL}/#{CGI.escape(domain.to_s.downcase)}" end
Source
# File lib/domain_rdap.rb, line 18 def check(domain, http: method(:default_http)) result = http.call(method: :get, url: build_url(domain)) case result[:status].to_i when 200 parse_registered(result[:body], domain: domain) when 404 { available: true, domain: domain.to_s.downcase, source: "rdap" } else { available: nil, domain: domain.to_s.downcase, error: "RDAP HTTP #{result[:status]}" } end rescue StandardError => e { available: nil, domain: domain.to_s.downcase, error: e.message } end
Source
# File lib/domain_rdap.rb, line 77 def default_http(method:, url:, body: nil, headers: {}) raise ArgumentError, "RDAP lookup is GET-only" unless method == :get payload = RabbotHttp.fetch(url, headers: headers) { status: 200, body: payload } rescue OpenURI::HTTPError => e { status: e.io.status[0].to_i, body: safe_read_body(e.io) } end
Source
# File lib/domain_rdap.rb, line 56 def extract_expiry(data) Array(data["events"]).each do |event| next unless event["eventAction"].to_s == "expiration" date = event["eventDate"].to_s return date[0, 10] unless date.empty? end nil end
Source
# File lib/domain_rdap.rb, line 46 def extract_registrar(data) Array(data["entities"]).each do |entity| next unless Array(entity["roles"]).include?("registrar") name = vcard_fn(entity["vcardArray"]) return name unless name.to_s.strip.empty? end nil end
Source
# File lib/domain_rdap.rb, line 32 def parse_registered(body, domain:) data = JSON.parse(body.to_s) { available: false, domain: (data["ldhName"] || domain).to_s.downcase, registrar: extract_registrar(data), status: Array(data["status"]).join(", "), expires_on: extract_expiry(data), source: "rdap" } rescue JSON::ParserError => e { available: nil, domain: domain.to_s.downcase, error: e.message } end
Source
# File lib/domain_rdap.rb, line 86 def safe_read_body(io) io.read rescue StandardError "" end
Source
# File lib/domain_rdap.rb, line 66 def vcard_fn(vcard_array) return nil unless vcard_array.is_a?(Array) && vcard_array[1].is_a?(Array) vcard_array[1].each do |row| next unless row.is_a?(Array) && row[0].to_s == "fn" return row[3].to_s.strip end nil end