From 7fae0aa4ac116bcbf522a9a4f19972c653d366fa Mon Sep 17 00:00:00 2001 From: Simon Jefford Date: Tue, 27 Jul 2010 15:39:28 +0100 Subject: [PATCH] Add configuration option for tld length --- actionpack/lib/action_dispatch/http/url.rb | 10 ++++++---- actionpack/lib/action_dispatch/railtie.rb | 10 ++++++++++ actionpack/test/dispatch/request_test.rb | 5 +++++ .../test/application/initializers/frameworks_test.rb | 7 +++++++ 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/actionpack/lib/action_dispatch/http/url.rb b/actionpack/lib/action_dispatch/http/url.rb index 38f46fa120ab8..2e39d0dbc2e1c 100644 --- a/actionpack/lib/action_dispatch/http/url.rb +++ b/actionpack/lib/action_dispatch/http/url.rb @@ -1,7 +1,9 @@ module ActionDispatch module Http module URL - # Returns the complete \URL used for this request. + mattr_accessor :tld_length + + # Returns the complete URL used for this request. def url protocol + host_with_port + fullpath end @@ -85,13 +87,13 @@ def domain(tld_length = 1) # 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". - def subdomains(tld_length = 1) + def subdomains(tld_length = @@tld_length) return [] unless named_host?(host) parts = host.split('.') parts[0..-(tld_length+2)] end - def subdomain(tld_length = 1) + def subdomain(tld_length = @@tld_length) subdomains(tld_length).join('.') end @@ -102,4 +104,4 @@ def named_host?(host) end end end -end +end \ No newline at end of file diff --git a/actionpack/lib/action_dispatch/railtie.rb b/actionpack/lib/action_dispatch/railtie.rb index ed066ad75ebcb..c202fee990f93 100644 --- a/actionpack/lib/action_dispatch/railtie.rb +++ b/actionpack/lib/action_dispatch/railtie.rb @@ -8,5 +8,15 @@ class Railtie < Rails::Railtie config.action_dispatch.ip_spoofing_check = true config.action_dispatch.show_exceptions = true config.action_dispatch.best_standards_support = true + config.action_dispatch.tld_length = 1 + + # Prepare dispatcher callbacks and run 'prepare' callbacks + initializer "action_dispatch.prepare_dispatcher" do |app| + ActionDispatch::Callbacks.to_prepare { app.routes_reloader.execute_if_updated } + end + + initializer "action_dispatch.configure" do |app| + ActionDispatch::Http::URL.tld_length = app.config.action_dispatch.tld_length + end end end diff --git a/actionpack/test/dispatch/request_test.rb b/actionpack/test/dispatch/request_test.rb index 546c4cb253b4b..a8b8f9377bcd2 100644 --- a/actionpack/test/dispatch/request_test.rb +++ b/actionpack/test/dispatch/request_test.rb @@ -116,6 +116,9 @@ class RequestTest < ActiveSupport::TestCase request = stub_request 'HTTP_HOST' => "dev.www.rubyonrails.co.uk" assert_equal %w( dev www ), request.subdomains(2) + request = stub_request 'HTTP_HOST' => "dev.www.rubyonrails.co.uk", :tld_length => 2 + assert_equal %w( dev www ), request.subdomains + request = stub_request 'HTTP_HOST' => "foobar.foobar.com" assert_equal %w( foobar ), request.subdomains @@ -472,7 +475,9 @@ class RequestTest < ActiveSupport::TestCase def stub_request(env = {}) ip_spoofing_check = env.key?(:ip_spoofing_check) ? env.delete(:ip_spoofing_check) : true ip_app = ActionDispatch::RemoteIp.new(Proc.new { }, ip_spoofing_check, @trusted_proxies) + tld_length = env.key?(:tld_length) ? env.delete(:tld_length) : 1 ip_app.call(env) + ActionDispatch::Http::URL.tld_length = tld_length ActionDispatch::Request.new(env) end diff --git a/railties/test/application/initializers/frameworks_test.rb b/railties/test/application/initializers/frameworks_test.rb index 6e9ceb6ef75cd..61340e82c3b40 100644 --- a/railties/test/application/initializers/frameworks_test.rb +++ b/railties/test/application/initializers/frameworks_test.rb @@ -65,6 +65,13 @@ def notify assert_equal ["notify"], Foo.action_methods end + # AD + test "action_dispatch extensions are applied to ActionDispatch" do + add_to_config "config.action_dispatch.tld_length = 2" + require "#{app_path}/config/environment" + assert_equal 2, ActionDispatch::Http::URL.tld_length + end + # AS test "if there's no config.active_support.bare, all of ActiveSupport is required" do use_frameworks []