class Rack::WWW

Rack::WWW

Public Class Methods

new(app, options = {}) click to toggle source
# File lib/rack/www.rb, line 8
def initialize(app, options = {})
  @options = { subdomain: 'www' }.merge(options)
  @app = app

  @redirect = !@options[:www].nil? ? @options[:www] : true
  @message = @options[:message]
  @subdomain = @options[:subdomain]
  @host_regex = @options[:host_regex] || /.+/i
  @predicate = @options[:predicate]
end

Public Instance Methods

call(env) click to toggle source
# File lib/rack/www.rb, line 19
def call(env)
  if redirect?(env)
    redirect(env)
  else
    @app.call(env)
  end
end

Private Instance Methods

already_subdomain?(env) click to toggle source
# File lib/rack/www.rb, line 67
def already_subdomain?(env)
  env['HTTP_HOST'].to_s.downcase =~ /^(#{@subdomain}\.)/
end
change_subdomain?(env) click to toggle source
# File lib/rack/www.rb, line 54
def change_subdomain?(env)
  @redirect && !already_subdomain?(env) ||
    !@redirect && already_subdomain?(env)
end
extract_host(env) click to toggle source
# File lib/rack/www.rb, line 88
def extract_host(env)
  [env['SERVER_NAME'].to_s.gsub(/^(#{@subdomain}\.|www\.)/, ''),
   %w(80 443).include?(env['SERVER_PORT']) ? '' : ":#{env['SERVER_PORT']}",
   env['PATH_INFO'],
   env['QUERY_STRING'].empty? ? '' : '?' + env['QUERY_STRING'].to_s]
end
ip_request?(env) click to toggle source
# File lib/rack/www.rb, line 59
def ip_request?(env)
  IPAddr.new(env['SERVER_NAME'].to_s
    .gsub(/^(#{@subdomain}\.)/, '')
    .gsub(/^(www\.)/, ''))
rescue IPAddr::InvalidAddressError
  false
end
matches_host?(env) click to toggle source
# File lib/rack/www.rb, line 71
def matches_host?(env)
  env['HTTP_HOST'].to_s.downcase =~ @host_regex
end
predicate?(env) click to toggle source
# File lib/rack/www.rb, line 46
def predicate?(env)
  if @predicate
    @predicate.call env
  else
    true
  end
end
prepare_url(env) click to toggle source
# File lib/rack/www.rb, line 75
def prepare_url(env)
  scheme = env['rack.url_scheme']
  host, port, path, query_string = extract_host(env)

  if @redirect == true
    host = "://#{@subdomain}." + host
  else
    host = '://' + host
  end

  "#{scheme}#{host}#{port}#{path}#{query_string}"
end
redirect(env) click to toggle source
# File lib/rack/www.rb, line 29
def redirect(env)
  url = prepare_url(env)
  headers = { 'Content-Type' => 'text/html', 'location' => url }

  if @message.respond_to?(:each)
    message = @message
  else
    message = [@message || '']
  end
  [301, headers, message]
end
redirect?(env) click to toggle source
# File lib/rack/www.rb, line 41
def redirect?(env)
  predicate?(env) && change_subdomain?(env) && !ip_request?(env) &&
    matches_host?(env)
end