Sha256: c689eab29025bcc0498a8b6b2718f425883c8f0edf119348897d69d394c9ec96

Contents?: true

Size: 1.02 KB

Versions: 1

Compression:

Stored size: 1.02 KB

Contents

# frozen_string_literal: true

require "addressable/uri"
require "ipaddr"
require "public_suffix"
require "resolv"

module Apullo
  class Target
    attr_reader :id

    def initialize(id)
      @id = id
    end

    def ipv4
      @ipv4 ||= resolve
    end

    def host
      @host ||= uri&.host
    end

    def scheme
      @scheme ||= uri&.scheme
    end

    def url
      @url ||= uri&.to_s
    end

    def uri
      @uri ||= Addressable::URI.parse(_url)
    rescue Addressable::URI::InvalidURIError => _e
      nil
    end

    def valid?
      uri && (ip? | domain?)
    end

    def ip?
      IPAddr.new host
      true
    rescue IPAddr::InvalidAddressError => _e
      false
    end

    def domain?
      return false if host.match? /[0-9]\z/

      PublicSuffix.valid?(host, default_rule: nil)
    end

    private

    def _url
      @_url ||= id.start_with?("http://", "https://") ? id : "http://#{id}"
    end

    def resolve
      Resolv.getaddress uri&.host
    rescue Resolv::ResolvError => _e
      nil
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
apullo-0.2.0 lib/apullo/target.rb