class URLSignature::URL

Constants

SEQUENCIAL_PARAMS

Attributes

fragment[R]
host[R]
params[R]
password[R]
path[R]
scheme[R]
uri[R]
user[R]

Public Class Methods

new(url) click to toggle source
# File lib/url_signature/url.rb, line 11
def initialize(url)
  @uri = parse_url(url)
  @scheme = uri.scheme
  @host = uri.host
  @user = uri.user
  @password = uri.password
  @path = uri.path.empty? ? "/" : uri.path
  @params = parse_query(uri.query)
  @fragment = uri.fragment
end

Public Instance Methods

add_query(key, value, replace: true) click to toggle source
# File lib/url_signature/url.rb, line 29
def add_query(key, value, replace: true)
  params[key] ||= []
  params[key] = [] if replace
  params[key] += [value].flatten.map(&:to_s)
end
clear_query!() click to toggle source
# File lib/url_signature/url.rb, line 55
def clear_query!
  @params = {}
end
port() click to toggle source
# File lib/url_signature/url.rb, line 22
def port
  return if uri.port == 80 && @scheme == "http"
  return if uri.port == 443 && @scheme == "https"

  uri.port
end
query() click to toggle source
# File lib/url_signature/url.rb, line 39
def query
  return if params.empty?

  query = params.each_with_object([]) do |(param, value), buffer|
    param = param.to_s

    if param.include?("[")
      value.each {|v| buffer << "#{encode(param)}=#{encode(v)}" }
    else
      buffer << "#{encode(param)}=#{encode(value.last)}"
    end
  end

  query.sort.join("&")
end
remove_query(key) click to toggle source
# File lib/url_signature/url.rb, line 35
def remove_query(key)
  params.delete(key) || []
end
to_s() click to toggle source
# File lib/url_signature/url.rb, line 59
def to_s
  [
    "#{scheme}://#{host}",
    port ? ":#{port}" : nil,
    path,
    query ? "?#{query}" : nil,
    fragment ? "##{fragment}" : nil
  ].compact.join
end

Private Instance Methods

encode(value) click to toggle source
# File lib/url_signature/url.rb, line 69
        def encode(value)
  CGI.escape(value).gsub("+", "%20")
end
parse_query(query) click to toggle source
# File lib/url_signature/url.rb, line 73
        def parse_query(query)
  Hash[CGI.parse(query.to_s).to_a]
end
parse_url(url) click to toggle source
# File lib/url_signature/url.rb, line 77
        def parse_url(url)
  uri = URI(url)

  unless %w[URI::HTTPS URI::HTTP].include?(uri.class.name)
    raise_invalid_url_error(url)
  end

  uri
rescue ::URI::InvalidURIError
  raise_invalid_url_error(url)
end
raise_invalid_url_error(url) click to toggle source
# File lib/url_signature/url.rb, line 89
        def raise_invalid_url_error(url)
  raise InvalidURL, "#{url} must be a fully qualified URL (http/https)"
end