lib/subdomain-fu.rb in pboling-subdomain-fu-0.2.1 vs lib/subdomain-fu.rb in pboling-subdomain-fu-0.3.0
- old
+ new
@@ -8,62 +8,66 @@
#
# To set a tld size for a given environment, just call SubdomainFu.tld_sizes[:environment] = value
DEFAULT_TLD_SIZES = {:development => 0, :test => 0, :production => 1}
mattr_accessor :tld_sizes
@@tld_sizes = DEFAULT_TLD_SIZES.dup
-
+
# Subdomains that are equivalent to going to the website with no subdomain at all.
# Defaults to "www" as the only member.
DEFAULT_MIRRORS = %w(www)
mattr_accessor :mirrors
@@mirrors = DEFAULT_MIRRORS.dup
-
+
mattr_accessor :preferred_mirror
@@preferred_mirror = nil
mattr_accessor :override_only_path
@@override_only_path = false
-
+
# Returns the TLD Size of the current environment.
def self.tld_size
tld_sizes[RAILS_ENV.to_sym]
end
-
+
# Sets the TLD Size of the current environment
def self.tld_size=(value)
tld_sizes[RAILS_ENV.to_sym] = value
end
-
- # Is the current subdomain either nil or a mirror?
+
+ # Is the current subdomain either nil or not a mirror?
def self.has_subdomain?(subdomain)
subdomain != false && !subdomain.blank? && !SubdomainFu.mirrors.include?(subdomain)
end
+ def self.is_mirror?(subdomain)
+ subdomain != false && !subdomain.blank? && SubdomainFu.mirrors.include?(subdomain)
+ end
+
# Is the subdomain a preferred mirror
def self.preferred_mirror?(subdomain)
subdomain == SubdomainFu.preferred_mirror || SubdomainFu.preferred_mirror.nil?
end
-
+
# Gets the subdomain from the host based on the TLD size
def self.subdomain_from(host)
return nil if host.nil? || /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.match(host)
parts = host.split('.')
sub = parts[0..-(SubdomainFu.tld_size+2)].join(".")
sub.blank? ? nil : sub
end
-
+
# Gets only non-mirror subdomains from the host based on the TLD size
def self.non_mirror_subdomain_from(host)
- sub = subdomain_from(host)
- has_subdomain?(sub) ? sub : nil
+ sub = subdomain_from(host)
+ has_subdomain?(sub) ? sub : nil
end
def self.host_without_subdomain(host)
parts = host.split('.')
parts[-(SubdomainFu.tld_size+1)..-1].join(".")
end
-
+
# Rewrites the subdomain of the host unless they are equivalent (i.e. mirrors of each other)
def self.rewrite_host_for_subdomains(subdomain, host)
if needs_rewrite?(subdomain, host)
change_subdomain_of_host(subdomain || SubdomainFu.preferred_mirror, host)
else
@@ -73,45 +77,72 @@
else
change_subdomain_of_host(SubdomainFu.preferred_mirror, host)
end
end
end
-
+
# Changes the subdomain of the host to whatever is passed in.
def self.change_subdomain_of_host(subdomain, host)
host = SubdomainFu.host_without_subdomain(host)
host = "#{subdomain}.#{host}" if subdomain
host
end
-
+
# Is this subdomain equivalent to the subdomain found in this host string?
def self.same_subdomain?(subdomain, host)
subdomain = nil unless subdomain
(subdomain == subdomain_from(host)) ||
(!has_subdomain?(subdomain) && !has_subdomain?(subdomain_from(host)))
end
-
+
+ def self.override_only_path?
+ self.override_only_path
+ end
+
def self.needs_rewrite?(subdomain, host)
- return false if subdomain.nil?
+ case subdomain
+ when nil
+ #rewrite when there is a preferred mirror set and there is no subdomain on the host
+ return true if self.preferred_mirror && subdomain_from(host).nil?
+ return false
+ when false
+ h = subdomain_from(host)
+ #if the host has a subdomain
+ if !h.nil?
+ #rewrite when there is a subdomain in the host, and it is not a preferred mirror
+ return true if !preferred_mirror?(h)
+ #rewrite when there is a preferred mirror set and the subdomain of the host is not a mirror
+ return true if self.preferred_mirror && !is_mirror?(h)
+ #no rewrite if host already has mirror subdomain
+ #it { SubdomainFu.needs_rewrite?(false,"www.localhost").should be_false }
+ return false if is_mirror?(h)
+ end
+ return self.crazy_rewrite_rule(subdomain, host)
+ else
+ return self.crazy_rewrite_rule(subdomain, host)
+ end
+ end
- (!has_subdomain?(subdomain) && preferred_mirror?(subdomain) && !preferred_mirror?(subdomain_from(host))) ||
+ #This is a black box of crazy! So I split some of the simpler logic out into the case statement above to make my brain happy!
+ def self.crazy_rewrite_rule(subdomain, host)
+ (!has_subdomain?(subdomain) && preferred_mirror?(subdomain) && !preferred_mirror?(subdomain_from(host))) ||
!same_subdomain?(subdomain, host)
end
-
+
def self.current_subdomain(request)
subdomain = request.subdomains(SubdomainFu.tld_size).join(".")
if has_subdomain?(subdomain)
subdomain
else
nil
end
end
-
+
module Controller
def self.included(controller)
controller.helper_method(:current_subdomain)
end
-
+
protected
def current_subdomain
SubdomainFu.current_subdomain(request)
end
end