diff options
Diffstat (limited to 'actionpack/lib/action_controller')
-rwxr-xr-x | actionpack/lib/action_controller/base.rb | 9 | ||||
-rw-r--r-- | actionpack/lib/action_controller/url_rewriter.rb | 36 |
2 files changed, 29 insertions, 16 deletions
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 |