diff --git a/actionpack/lib/action_controller/routing/generation/url_rewriter.rb b/actionpack/lib/action_controller/routing/generation/url_rewriter.rb index 16720b9..b8f656f 100644 --- a/actionpack/lib/action_controller/routing/generation/url_rewriter.rb +++ b/actionpack/lib/action_controller/routing/generation/url_rewriter.rb @@ -145,9 +145,29 @@ module ActionController def initialize(request, parameters) @request, @parameters = request, parameters end - + + # Given a path and options, returns a rewritten URL string def rewrite(options = {}) - rewrite_url(options) + rewritten_url = "" + + unless options[:only_path] + rewritten_url << (options[:protocol] || @request.protocol) + rewritten_url << "://" unless rewritten_url.match("://") + rewritten_url << rewrite_authentication(options) + rewritten_url << (options[:host] || @request.host) + port = options.delete(:port) || @request.port + if port != 80 + rewritten_url << ":#{port}" + end + rewritten_url + end + + path = rewrite_path(options) + rewritten_url << ActionController::Base.relative_url_root.to_s unless options[:skip_relative_url_root] + rewritten_url << (options[:trailing_slash] ? path.sub(/\?|\z/) { "/" + $& } : path) + rewritten_url << "##{options[:anchor]}" if options[:anchor] + + rewritten_url end def to_str @@ -157,26 +177,6 @@ module ActionController alias_method :to_s, :to_str private - # Given a path and options, returns a rewritten URL string - def rewrite_url(options) - rewritten_url = "" - - unless options[:only_path] - rewritten_url << (options[:protocol] || @request.protocol) - rewritten_url << "://" unless rewritten_url.match("://") - rewritten_url << rewrite_authentication(options) - rewritten_url << (options[:host] || @request.host_with_port) - rewritten_url << ":#{options.delete(:port)}" if options.key?(:port) - end - - path = rewrite_path(options) - rewritten_url << ActionController::Base.relative_url_root.to_s unless options[:skip_relative_url_root] - rewritten_url << (options[:trailing_slash] ? path.sub(/\?|\z/) { "/" + $& } : path) - rewritten_url << "##{options[:anchor]}" if options[:anchor] - - rewritten_url - end - # Given a Hash of options, generates a route def rewrite_path(options) options = options.symbolize_keys diff --git a/actionpack/test/controller/url_rewriter_test.rb b/actionpack/test/controller/url_rewriter_test.rb index 863f841..ea2e209 100644 --- a/actionpack/test/controller/url_rewriter_test.rb +++ b/actionpack/test/controller/url_rewriter_test.rb @@ -13,6 +13,13 @@ class UrlRewriterTests < ActionController::TestCase assert_equal('http://test.host:1271/c/a/i', @rewriter.rewrite(:controller => 'c', :action => 'a', :id => 'i', :port => 1271) ) + + request = ActionController::TestRequest.new('HTTP_HOST' => 'test.host:3000') + rewriter = ActionController::UrlRewriter.new(request, @params) + + assert_equal('http://test.host:1271/c/a/i', + rewriter.rewrite(:controller => 'c', :action => 'a', :id => 'i', :port => 1271) + ) end def test_protocol_with_and_without_separator