diff options
-rw-r--r-- | actionpack/CHANGELOG | 2 | ||||
-rwxr-xr-x | actionpack/lib/action_controller/base.rb | 9 | ||||
-rw-r--r-- | actionpack/lib/action_controller/url_rewriter.rb | 36 | ||||
-rw-r--r-- | actionpack/test/controller/url_rewriter_test.rb | 7 |
4 files changed, 38 insertions, 16 deletions
diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG index 65ccc16a2f..cb2587b235 100644 --- a/actionpack/CHANGELOG +++ b/actionpack/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Added user/password options for url_for to add http authentication in a URL [DHH] + * Fixed that FormTagHelper#text_area_tag should disregard :size option if it's not a string [Brendon Davidson] * Set the original button value in an attribute of the button when using the :disable_with key with submit_tag, so that the original can be restored later. [Jamis Buck] diff --git a/actionpack/lib/action_controller/base.rb b/actionpack/lib/action_controller/base.rb index a7b702cd3e..c0c14e55e0 100755 --- a/actionpack/lib/action_controller/base.rb +++ b/actionpack/lib/action_controller/base.rb @@ -495,6 +495,8 @@ module ActionController #:nodoc: # is currently not recommended since it breaks caching. # * <tt>:host</tt> -- overrides the default (current) host if provided # * <tt>:protocol</tt> -- overrides the default (current) protocol if provided + # * <tt>:user</tt> -- Inline HTTP authentication (only plucked out if :password is also present) + # * <tt>:password</tt> -- Inline HTTP authentication (only plucked out if :user is also present) # # The URL is generated from the remaining keys in the hash. A URL contains two key parts: the <base> and a query string. # Routes composes a query string as the key/value pairs not included in the <base>. @@ -502,9 +504,10 @@ module ActionController #:nodoc: # The default Routes setup supports a typical Rails path of "controller/action/id" where action and id are optional, with # action defaulting to 'index' when not given. Here are some typical url_for statements and their corresponding URLs: # - # url_for :controller => 'posts', :action => 'recent' # => 'proto://host.com/posts/recent' - # url_for :controller => 'posts', :action => 'index' # => 'proto://host.com/posts' - # url_for :controller => 'posts', :action => 'show', :id => 10 # => 'proto://host.com/posts/show/10' + # url_for :controller => 'posts', :action => 'recent' # => 'proto://host.com/posts/recent' + # url_for :controller => 'posts', :action => 'index' # => 'proto://host.com/posts' + # url_for :controller => 'posts', :action => 'show', :id => 10 # => 'proto://host.com/posts/show/10' + # url_for :controller => 'posts', :user => 'd', :password => '123' # => 'proto://d:123@host.com/posts' # # When generating a new URL, missing values may be filled in from the current request's parameters. For example, # <tt>url_for :action => 'some_action'</tt> will retain the current controller, as expected. This behavior extends to diff --git a/actionpack/lib/action_controller/url_rewriter.rb b/actionpack/lib/action_controller/url_rewriter.rb index 0d13f2721f..d2b324da96 100644 --- a/actionpack/lib/action_controller/url_rewriter.rb +++ b/actionpack/lib/action_controller/url_rewriter.rb @@ -1,5 +1,4 @@ -module ActionController - +module ActionController # Write URLs from arbitrary places in your codebase, such as your mailers. # # Example: @@ -15,9 +14,7 @@ module ActionController # # In addition to providing +url_for+, named routes are also accessible after # including UrlWriter. - # module UrlWriter - # The default options for urls written by this writer. Typically a :host pair # is provided. mattr_accessor :default_url_options @@ -36,26 +33,28 @@ module ActionController # must be provided either explicitly, or via default_url_options. # * :protocol The protocol to connect to. Defaults to 'http' # * :port Optionally specify the port to connect to. - # def url_for(options) options = self.class.default_url_options.merge(options) url = '' + unless options.delete :only_path url << (options.delete(:protocol) || 'http') url << '://' unless url.match("://") #dont add separator if its already been specified in :protocol raise "Missing host to link to! Please provide :host parameter or set default_url_options[:host]" unless options[:host] + url << options.delete(:host) url << ":#{options.delete(:port)}" if options.key?(:port) else # Delete the unused options to prevent their appearance in the query string [:protocol, :host, :port].each { |k| options.delete k } end + url << Routing::Routes.generate(options, {}) + return url - end - + end end # Rewrites URLs for Base.redirect_to and Base.url_for in the controller. @@ -66,7 +65,7 @@ module ActionController end def rewrite(options = {}) - rewrite_url(rewrite_path(options), options) + rewrite_url(options) end def to_str @@ -76,17 +75,19 @@ module ActionController alias_method :to_s, :to_str private - def rewrite_url(path, options) + 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 rewritten_url << @request.relative_url_root.to_s unless options[:skip_relative_url_root] - rewritten_url << path + rewritten_url << rewrite_path(options) rewritten_url << '/' if options[:trailing_slash] rewritten_url << "##{options[:anchor]}" if options[:anchor] @@ -96,15 +97,24 @@ module ActionController def rewrite_path(options) options = options.symbolize_keys options.update(options[:params].symbolize_keys) if options[:params] + if (overwrite = options.delete(:overwrite_params)) options.update(@parameters.symbolize_keys) options.update(overwrite.symbolize_keys) end - RESERVED_OPTIONS.each {|k| options.delete k} + + RESERVED_OPTIONS.each { |k| options.delete(k) } # Generates the query string, too Routing::Routes.generate(options, @request.symbolized_path_parameters) end + + def rewrite_authentication(options) + if options[:user] && options[:password] + "#{options.delete(:user)}:#{options.delete(:password)}@" + else + "" + end + end end - -end +end
\ No newline at end of file diff --git a/actionpack/test/controller/url_rewriter_test.rb b/actionpack/test/controller/url_rewriter_test.rb index f24e5c9c37..178f44f15f 100644 --- a/actionpack/test/controller/url_rewriter_test.rb +++ b/actionpack/test/controller/url_rewriter_test.rb @@ -23,6 +23,13 @@ class UrlRewriterTests < Test::Unit::TestCase ) end + def test_user_name_and_password + assert_equal( + 'http://david:secret@test.host/c/a/i', + @rewriter.rewrite(:user => "david", :password => "secret", :controller => 'c', :action => 'a', :id => 'i') + ) + end + def test_overwrite_params @params[:controller] = 'hi' @params[:action] = 'bye' |