module ActionDispatch::Http::URL - actionpack-4.2.4 Documentation

# module ActionDispatch::Http::URL

### Constants

HOST_REGEXP
IP_HOST_REGEXP
PROTOCOL_REGEXP

### Public Class Methods

extract_domain(host, tld_length) click to toggle source

    # File lib/action_dispatch/http/url.rb, line 15
    def extract_domain(host, tld_length)
      extract_domain_from(host, tld_length) if named_host?(host)
    end

extract_subdomain(host, tld_length) click to toggle source

    # File lib/action_dispatch/http/url.rb, line 27
    def extract_subdomain(host, tld_length)
      extract_subdomains(host, tld_length).join('.')
    end

extract_subdomains(host, tld_length) click to toggle source

    # File lib/action_dispatch/http/url.rb, line 19
    def extract_subdomains(host, tld_length)
      if named_host?(host)
        extract_subdomains_from(host, tld_length)
      else
        []
      end
    end

full_url_for(options) click to toggle source

    # File lib/action_dispatch/http/url.rb, line 39
    def full_url_for(options)
      host     = options[:host]
      protocol = options[:protocol]
      port     = options[:port]

      unless host
        raise ArgumentError, 'Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true'
      end

      build_host_url(host, port, protocol, options, path_for(options))
    end

new(env) click to toggle source
Calls superclass method

    # File lib/action_dispatch/http/url.rb, line 169
    def initialize(env)
      super
      @protocol = nil
      @port     = nil
    end

path_for(options) click to toggle source

    # File lib/action_dispatch/http/url.rb, line 51
    def path_for(options)
      path  = options[:script_name].to_s.chomp("/")
      path << options[:path] if options.key?(:path)

      add_trailing_slash(path) if options[:trailing_slash]
      add_params(path, options[:params]) if options.key?(:params)
      add_anchor(path, options[:anchor]) if options.key?(:anchor)

      path
    end

url_for(options) click to toggle source

    # File lib/action_dispatch/http/url.rb, line 31
    def url_for(options)
      if options[:only_path]
        path_for options
      else
        full_url_for options
      end
    end

### Private Class Methods

add_anchor(path, anchor) click to toggle source

    # File lib/action_dispatch/http/url.rb, line 70
    def add_anchor(path, anchor)
      if anchor
        path << "##{Journey::Router::Utils.escape_fragment(anchor.to_param)}"
      end
    end

add_params(path, params) click to toggle source

    # File lib/action_dispatch/http/url.rb, line 64
    def add_params(path, params)
      params = { params: params } unless params.is_a?(Hash)
      params.reject! { |_,v| v.to_param.nil? }
      path << "?#{params.to_query}" unless params.empty?
    end

add_trailing_slash(path) click to toggle source

    # File lib/action_dispatch/http/url.rb, line 85
    def add_trailing_slash(path)
      # includes querysting
      if path.include?('?')
        path.sub!(/\?/, '/\&')
      # does not have a .format
      elsif !path.include?(".")
        path.sub!(/[^\/]\z|\A\z/, '\&/')
      end
    end

build_host_url(host, port, protocol, options, path) click to toggle source

    # File lib/action_dispatch/http/url.rb, line 95
    def build_host_url(host, port, protocol, options, path)
      if match = host.match(HOST_REGEXP)
        protocol ||= match[1] unless protocol == false
        host       = match[2]
        port       = match[3] unless options.key? :port
      end

      protocol = normalize_protocol protocol
      host     = normalize_host(host, options)

      result = protocol.dup

      if options[:user] && options[:password]
        result << "#{Rack::Utils.escape(options[:user])}:#{Rack::Utils.escape(options[:password])}@"
      end

      result << host
      normalize_port(port, protocol) { |normalized_port|
        result << ":#{normalized_port}"
      }

      result.concat path
    end

extract_domain_from(host, tld_length) click to toggle source

    # File lib/action_dispatch/http/url.rb, line 76
    def extract_domain_from(host, tld_length)
      host.split('.').last(1 + tld_length).join('.')
    end

extract_subdomains_from(host, tld_length) click to toggle source

    # File lib/action_dispatch/http/url.rb, line 80
    def extract_subdomains_from(host, tld_length)
      parts = host.split('.')
      parts[0..-(tld_length + 2)]
    end

named_host?(host) click to toggle source

    # File lib/action_dispatch/http/url.rb, line 119
    def named_host?(host)
      IP_HOST_REGEXP !~ host
    end

normalize_host(_host, options) click to toggle source

    # File lib/action_dispatch/http/url.rb, line 136
    def normalize_host(_host, options)
      return _host unless named_host?(_host)

      tld_length = options[:tld_length] || @@tld_length
      subdomain  = options.fetch :subdomain, true
      domain     = options[:domain]

      host = ""
      if subdomain == true
        return _host if domain.nil?

        host << extract_subdomains_from(_host, tld_length).join('.')
      elsif subdomain
        host << subdomain.to_param
      end
      host << "." unless host.empty?
      host << (domain || extract_domain_from(_host, tld_length))
      host
    end

normalize_port(port, protocol) { |port| ... } click to toggle source

    # File lib/action_dispatch/http/url.rb, line 156
    def normalize_port(port, protocol)
      return unless port

      case protocol
      when "//" then yield port
      when "https://"
        yield port unless port.to_i == 443
      else
        yield port unless port.to_i == 80
      end
    end

normalize_protocol(protocol) click to toggle source

    # File lib/action_dispatch/http/url.rb, line 123
    def normalize_protocol(protocol)
      case protocol
      when nil
        "http://"
      when false, "//"
        "//"
      when PROTOCOL_REGEXP
        "#{$1}://"
      else
        raise ArgumentError, "Invalid :protocol option: #{protocol.inspect}"
      end
    end

### Public Instance Methods

domain(tld_length = @@tld_length) click to toggle source

Returns the domain part of a host, such as “rubyonrails.org” in “www.rubyonrails.org”. You can specify a different `tld_length`, such as 2 to catch rubyonrails.co.uk in “www.rubyonrails.co.uk”.

    # File lib/action_dispatch/http/url.rb, line 247
    def domain(tld_length = @@tld_length)
      ActionDispatch::Http::URL.extract_domain(host, tld_length)
    end

host() click to toggle source

Returns the host for this request, such as example.com.

    # File lib/action_dispatch/http/url.rb, line 195
    def host
      raw_host_with_port.sub(/:\d+$/, '')
    end

host_with_port() click to toggle source

Returns a host:port string for this request, such as “example.com” or “example.com:8080”.

    # File lib/action_dispatch/http/url.rb, line 201
    def host_with_port
      "#{host}#{port_string}"
    end

optional_port() click to toggle source

Returns a number port suffix like 8080 if the port number of this request is not the default HTTP port 80 or HTTPS port 443.

    # File lib/action_dispatch/http/url.rb, line 231
    def optional_port
      standard_port? ? nil : port
    end

port() click to toggle source

Returns the port number of this request as an integer.

    # File lib/action_dispatch/http/url.rb, line 206
    def port
      @port ||= begin
        if raw_host_with_port =~ /:(\d+)$/
          $1.to_i
        else
          standard_port
        end
      end
    end

port_string() click to toggle source

Returns a string port suffix, including colon, like “:8080” if the port number of this request is not the default HTTP port 80 or HTTPS port 443.

    # File lib/action_dispatch/http/url.rb, line 237
    def port_string
      standard_port? ? '' : ":#{port}"
    end

protocol() click to toggle source

Returns 'https://' if this is an SSL request and 'http://' otherwise.

    # File lib/action_dispatch/http/url.rb, line 181
    def protocol
      @protocol ||= ssl? ? 'https://' : 'http://'
    end

raw_host_with_port() click to toggle source

Returns the host for this request, such as “example.com”.

    # File lib/action_dispatch/http/url.rb, line 186
    def raw_host_with_port
      if forwarded = env["HTTP_X_FORWARDED_HOST"].presence
        forwarded.split(/,\s?/).last
      else
        env['HTTP_HOST'] || "#{env['SERVER_NAME'] || env['SERVER_ADDR']}:#{env['SERVER_PORT']}"
      end
    end

server_port() click to toggle source

    # File lib/action_dispatch/http/url.rb, line 241
    def server_port
      @env['SERVER_PORT'].to_i
    end

standard_port() click to toggle source

Returns the standard port number for this request's protocol.

    # File lib/action_dispatch/http/url.rb, line 217
    def standard_port
      case protocol
        when 'https://' then 443
        else 80
      end
    end

standard_port?() click to toggle source

Returns whether this request is using the standard port

    # File lib/action_dispatch/http/url.rb, line 225
    def standard_port?
      port == standard_port
    end

subdomain(tld_length = @@tld_length) click to toggle source

Returns all the subdomains as a string, so `"dev.www"` would be returned for “dev.www.rubyonrails.org”. You can specify a different `tld_length`, such as 2 to catch `"www"` instead of `"www.rubyonrails"` in “www.rubyonrails.co.uk”.

    # File lib/action_dispatch/http/url.rb, line 263
    def subdomain(tld_length = @@tld_length)
      ActionDispatch::Http::URL.extract_subdomain(host, tld_length)
    end

subdomains(tld_length = @@tld_length) click to toggle source

Returns all the subdomains as an array, so `["dev", "www"]` would be returned for “dev.www.rubyonrails.org”. You can specify a different `tld_length`, such as 2 to catch `["www"]` instead of `["www", "rubyonrails"]` in “www.rubyonrails.co.uk”.

    # File lib/action_dispatch/http/url.rb, line 255
    def subdomains(tld_length = @@tld_length)
      ActionDispatch::Http::URL.extract_subdomains(host, tld_length)
    end

url() click to toggle source

Returns the complete URL used for this request.

    # File lib/action_dispatch/http/url.rb, line 176
    def url
      protocol + host_with_port + fullpath
    end