class Url

Constants

SCHEME_DEFAULT_PORTS
SECURE_SCHEMES
SECURE_SCHEME_MAPPING

Attributes

fragment[RW]
params[RW]
path[RW]
port[RW]
scheme[RW]
server[RW]

Public Class Methods

build(base, params = {}, fragment = nil) click to toggle source

Construct a full URL from pieces

# File lib/iron/web/url.rb, line 58
def self.build(base, params = {}, fragment = nil)
  url = base + to_param_string(params)
  url += '#' + fragment unless fragment.blank?
  url
end
default_port() click to toggle source
# File lib/iron/web/url.rb, line 41
def self.default_port
  @default_port
end
default_port=(port) click to toggle source
# File lib/iron/web/url.rb, line 45
def self.default_port=(port)
  @default_port = port
end
default_scheme() click to toggle source
# File lib/iron/web/url.rb, line 49
def self.default_scheme
  @default_scheme || 'http'
end
default_scheme=(scheme) click to toggle source
# File lib/iron/web/url.rb, line 53
def self.default_scheme=(scheme)
  @default_scheme = scheme
end
default_server() click to toggle source

Return default domain for urls, used to convert relative urls to absolute

# File lib/iron/web/url.rb, line 33
def self.default_server
  @default_server
end
default_server=(server) click to toggle source
# File lib/iron/web/url.rb, line 37
def self.default_server=(server)
  @default_server = server
end
new(str = nil) click to toggle source
# File lib/iron/web/url.rb, line 91
def initialize(str = nil)
  @scheme = @port = @server = nil
  set(str)
end
parse(str) click to toggle source

Returns a new Url from the given string

# File lib/iron/web/url.rb, line 27
def self.parse(str)
  Url.new(str)
end
to_param_string(params) click to toggle source

Construct a param string from key/value pairs

# File lib/iron/web/url.rb, line 65
def self.to_param_string(params)
  str = ''
  # Remove blank/nil keys
  params.delete_if {|k,v| v.to_s.blank? || k.to_s.blank?}
  # Convert to param string
  unless params.empty?
    str += '?'
    str += params.collect do |k,v|
      k = k.to_s
      if v.is_a?(Array)
        k = k.gsub('[]','')
        v.collect do |vs|
          val = vs.respond_to?(:to_param) ? vs.to_param : vs
          val = val.to_s
          CGI::escape(k) + '[]=' + CGI::escape(val)
        end
      else
        val = v.respond_to?(:to_param) ? v.to_param : v
        val = val.to_s
        CGI::escape(k) + '=' + CGI::escape(val)
      end
    end.flatten.join('&')
  end
  str
end

Public Instance Methods

+(str) click to toggle source
# File lib/iron/web/url.rb, line 165
def +(str)
  append_path(str)
  self
end
absolute?() click to toggle source
# File lib/iron/web/url.rb, line 226
def absolute?
  !relative?
end
add_param(k, v) click to toggle source

Add a param value (can be called multiply for the same param key)

# File lib/iron/web/url.rb, line 182
def add_param(k, v)
  k = k.to_s
  oldval = @params[k]
  if oldval
    @params[k] = oldval.is_a?(Array) ? oldval + [v] :  [oldval, v]
    @params[k].flatten!
  else
    @params[k] = v
  end
end
append_path(str, escape = false) click to toggle source
# File lib/iron/web/url.rb, line 159
def append_path(str, escape = false)
  str = str.to_s
  @path ||= ''
  @path += escape ? CGI::escape(str).gsub('+', '%20') : str
end
base() click to toggle source

Returns the full start of the url, minus params and fragment

# File lib/iron/web/url.rb, line 148
def base
  val = ''
  unless @server.blank?
    val = (@scheme || Url::default_scheme) + '://' + @server
    val += ':' + @port.to_s unless @port.to_s.blank?
  end
  p = (@path || '')
  p = '/' + p unless p.blank? || p.starts_with?('/')
  val + p 
end
blank?() click to toggle source
# File lib/iron/web/url.rb, line 143
def blank?
  self.base.blank?
end
clear_params() click to toggle source

Reset params

# File lib/iron/web/url.rb, line 209
def clear_params
  @params = {}
end
empty?() click to toggle source
# File lib/iron/web/url.rb, line 139
def empty?
  blank?
end
get_param(k) click to toggle source
# File lib/iron/web/url.rb, line 204
def get_param(k)
  @params[k.to_s]
end
has_params?() click to toggle source
# File lib/iron/web/url.rb, line 214
def has_params?
  @params && !@params.empty?
end
inspect() click to toggle source
# File lib/iron/web/url.rb, line 135
def inspect
  to_s
end
make_absolute(secure = false, server = :default, port = :default) click to toggle source

Ensure url contains a server + scheme section, eg converts '/foo' into 'example.com/foo'.

# File lib/iron/web/url.rb, line 231
def make_absolute(secure = false, server = :default, port = :default)
  unless absolute? && secure? == secure
    raise 'No default server set for Url#make_absolute' unless server != :default || @server || Url.default_server
    @server ||= server == :default ? Url.default_server : server
    unless @scheme
      @scheme = Url.default_scheme 
      @port = port == :default ? Url.default_port : port
    end
    if secure
      raise "No secure scheme for scheme #{@scheme} in Url#make_absolute" unless SECURE_SCHEME_MAPPING[@scheme]
      @scheme = SECURE_SCHEME_MAPPING[@scheme]
    end
  end
  to_s
end
make_relative() click to toggle source
# File lib/iron/web/url.rb, line 247
def make_relative
  unless relative?
    @server = nil
    @scheme = nil
    @port = nil
  end
  to_s
end
relative?() click to toggle source
# File lib/iron/web/url.rb, line 222
def relative?
  @server.blank?
end
remove_param(key_or_regex) click to toggle source

Wipe out keyed value by string match or regex match

# File lib/iron/web/url.rb, line 194
def remove_param(key_or_regex)
  @params.delete_if do |k, v|
    if key_or_regex.is_a?(Regexp)
      k.match(key_or_regex)
    else
      k == key_or_regex.to_s
    end
  end
end
reset_params() click to toggle source
# File lib/iron/web/url.rb, line 212
def reset_params ; clear_params ; end
secure?() click to toggle source
# File lib/iron/web/url.rb, line 218
def secure?
  SECURE_SCHEMES.include?(scheme)
end
set(url) click to toggle source

Parse and set internals from given url

# File lib/iron/web/url.rb, line 97
def set(url)
  # Decompose into major components
  url = (url || '').strip
  base, params, @fragment = url.extract(/^([^\?#]*)\??([^#]*)#?(.*)$/)
  
  # Parse out base
  base ||= ''
  if base.match(/^[a-z\+]*:\/\//)
    @scheme, @server, ignore, @port, @path = base.extract(/^([a-z]*):\/\/([a-z0-9\-_\.]+)(:([0-9]+))?(\/.*)?/i)
    @path ||= ''
    @port = @port.blank? ? nil : @port.to_i
  else
    @path = base
  end
  
  # Parse out params
  @params = {}
  params.split('&').each do |p|
    k, v = p.split('=')
    if k && v
      if k.ends_with?('[]')
        add_param(CGI::unescape(k.gsub('[]','')), [CGI::unescape(v)])
      else
        add_param(CGI::unescape(k), CGI::unescape(v))
      end
    end
  end
end
set_param(k, v) click to toggle source

Override current param val or set if none

# File lib/iron/web/url.rb, line 171
def set_param(k, v)
  @params[k.to_s] = v
end
set_params(hash) click to toggle source
# File lib/iron/web/url.rb, line 175
def set_params(hash)
  hash.each_pair {|k,v|
    set_param(k, v)
  }
end
to_html() click to toggle source
# File lib/iron/web/url.rb, line 131
def to_html
  to_s
end
to_s() click to toggle source

Makee the url

# File lib/iron/web/url.rb, line 127
def to_s
  Url::build(base, @params, @fragment)
end