Move dev host rewriting into middleware
This makes matching against routes later much more reliable and less complicated
This commit is contained in:
parent
b9a09b228b
commit
90c05547f6
@ -1,7 +1,8 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative "boot"
|
||||
require_relative "../lib/custom_static_middleware"
|
||||
require_relative "../lib/middleware/custom_static_middleware"
|
||||
require_relative "../lib/middleware/dev_host_middleware"
|
||||
|
||||
require "rails/all"
|
||||
|
||||
@ -35,6 +36,7 @@ module Websites
|
||||
config.action_controller.action_on_unpermitted_parameters = :raise
|
||||
config.action_dispatch.default_headers.clear
|
||||
|
||||
config.middleware.insert_before(0, DevHostMiddleware) if Rails.env.development?
|
||||
config.middleware.insert_before(ActionDispatch::Static, CustomStaticMiddleware, {
|
||||
/^i\.furry\.cool/ => "/furry.cool/images",
|
||||
/^i\.maidboye\.cafe/ => "/maidboye.cafe/images",
|
||||
|
@ -135,6 +135,8 @@ module Websites
|
||||
end
|
||||
|
||||
def common_headers(domain)
|
||||
# We don't want to set headers like HSTS in development
|
||||
return {} if Rails.env.development?
|
||||
{
|
||||
"Report-To": {
|
||||
group: "default",
|
||||
|
@ -3,47 +3,25 @@
|
||||
class DomainConstraint
|
||||
attr_reader :domain, :subdomain
|
||||
|
||||
DEFAULT_DOMAIN = nil # "yiff.rest".freeze
|
||||
USE_DEV_HOST = Rails.env.development?
|
||||
|
||||
def dev_host
|
||||
"#{domain.tr('.', '-')}.websites.containers.local"
|
||||
end
|
||||
DEFAULT_DOMAIN = nil # "yiff.rest"
|
||||
|
||||
def initialize(domain, subdomain = nil)
|
||||
@domain = domain
|
||||
@subdomain = subdomain
|
||||
end
|
||||
|
||||
def resolve_domains(current_host, level = 1)
|
||||
current_subdomains = nil
|
||||
if current_host.scan(".").length > level
|
||||
parts = current_host.split(".")
|
||||
current_host = parts.pop(level + 1).join(".")
|
||||
current_subdomains = parts.join(".") if parts.length >= 1
|
||||
end
|
||||
|
||||
[current_host, current_subdomains]
|
||||
def matches?(request)
|
||||
Rails.logger.info("Domain: #{@domain}; Subdomain: #{@subdomain}; Current Host: #{request.domain}; Current Subdomains: #{request.subdomain}; Matches (Domain): #{domain_matches?(request)}; Matches (Subdomain): #{subdomain_matches?(request)}") if Rails.env.development?
|
||||
subdomain_matches?(request) && domain_matches?(request)
|
||||
end
|
||||
|
||||
def matches?(request)
|
||||
host = domain
|
||||
parse = request.domain
|
||||
parse = "#{request.subdomains.join('.')}.#{request.domain}" unless request.subdomains.empty?
|
||||
current_host, current_subdomains = resolve_domains(parse)
|
||||
if Rails.env.development? && USE_DEV_HOST
|
||||
if DEFAULT_DOMAIN.present?
|
||||
current_host, current_subdomains = resolve_domains(DEFAULT_DOMAIN)
|
||||
elsif request.query_parameters[:domain].present?
|
||||
current_host, current_subdomains = resolve_domains(request.query_parameters[:domain])
|
||||
elsif current_host.scan(".").length > 3
|
||||
current_host, current_subdomains = resolve_domains(current_host, 3)
|
||||
end
|
||||
private
|
||||
|
||||
current_host = dev_host if current_host == domain
|
||||
host = dev_host
|
||||
end
|
||||
Rails.logger.info("Host: #{host}; Subdomain: #{subdomain}; Current Host: #{current_host}; Current Subdomain: #{current_subdomains}; Matches (Domain): #{current_host == host}; Matches (Subdomain): #{current_subdomains == subdomain || subdomain&.to_sym == :any}") if Rails.env.development?
|
||||
current_host == host && (current_subdomains == subdomain || subdomain&.to_sym == :any)
|
||||
def domain_matches?(request)
|
||||
@domain.nil? || request.domain == @domain
|
||||
end
|
||||
|
||||
def subdomain_matches?(request)
|
||||
@subdomain.nil? || request.subdomain == @subdomain
|
||||
end
|
||||
end
|
||||
|
14
lib/middleware/dev_host_middleware.rb
Normal file
14
lib/middleware/dev_host_middleware.rb
Normal file
@ -0,0 +1,14 @@
|
||||
class DevHostMiddleware
|
||||
def initialize(app)
|
||||
@app = app
|
||||
end
|
||||
|
||||
def call(env)
|
||||
request = Rack::Request.new(env)
|
||||
domain = request.params["domain"]
|
||||
|
||||
env["HTTP_HOST"] = domain if Rails.env.development? && domain
|
||||
|
||||
@app.call(env)
|
||||
end
|
||||
end
|
Loading…
Reference in New Issue
Block a user