mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Added user/password options for url_for to add http authentication in a URL [DHH]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@6302 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
parent
bda4009aee
commit
bf6d4cede7
4 changed files with 38 additions and 16 deletions
|
@ -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]
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
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
|
||||
|
||||
# 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
|
||||
end
|
||||
|
||||
def rewrite_authentication(options)
|
||||
if options[:user] && options[:password]
|
||||
"#{options.delete(:user)}:#{options.delete(:password)}@"
|
||||
else
|
||||
""
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -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'
|
||||
|
|
Loading…
Reference in a new issue