class 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