ManageIQ/manageiq-automation_engine

View on GitHub
lib/miq_automation_engine/engine/miq_ae_engine/miq_ae_uri.rb

Summary

Maintainability
A
0 mins
Test Coverage
B
89%
module MiqAeEngine
  class MiqAeUri
    def self.hash2query(hash)
      return nil if hash.blank?

      query = []
      hash.keys.sort_by(&:to_s).each do |k|
        v = hash[k]
        next if v.nil?

        value = v.kind_of?(ActiveRecord::Base) ? v.id : v
        query.push([ERB::Util.url_encode(k), ERB::Util.url_encode(value.to_s)].join('='))
      end
      query.join('&')
    end

    def self.query2hash(query)
      hash = {}
      query&.split('&')&.each do |a|
          k, v = a.split('=')
          hash[CGI.unescape(k)] = CGI.unescape(v.to_s)
        end
      hash
    end

    def self.split(uri, default_scheme = 'miqaews')
      uri.gsub!(%r{/+}, '/')
      scheme, userinfo, host, port, registry, path, opaque, query, fragment = URI.split(uri.strip)
      scheme = default_scheme if scheme.nil?
      scheme = 'miqaews' if scheme.downcase == 'miqae'
      scheme.downcase!
      return scheme, userinfo, host, port, registry, path, opaque, query, fragment
    rescue URI::Error => err
      raise MiqAeException::InvalidPathFormat, err.message
    end

    def self.scheme_supported?(scheme)
      ['miqae', 'miqaedb', 'miqaews', 'miqaemethod', 'method', 'miqpeca'].include?(scheme.downcase)
    end

    def self.replace(uri, options = {})
      original = {}
      original[:scheme], original[:userinfo], original[:host], original[:port], original[:registry], original[:path], original[:opaque], original[:query], original[:fragment] = URI.split(uri)
      original.merge!(options)
      URI::HTTP.new(original[:scheme], original[:userinfo], original[:host], original[:port], original[:registry], original[:path], original[:opaque], original[:query], original[:fragment]).to_s
    end

    def self.join(scheme, userinfo, host, port, registry, path, opaque, query, fragment)
      query = hash2query(query) if query.kind_of?(Hash)
      URI::HTTP.new(scheme, userinfo, host, port, registry, path, opaque, query, fragment).to_s
    end

    def self.path(uri, default_scheme = 'miqaews')
      _, _, _, _, _, path, = split(uri, default_scheme)
      path
    end
  end
end