aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_controller/url_rewriter.rb
diff options
context:
space:
mode:
Diffstat (limited to 'actionpack/lib/action_controller/url_rewriter.rb')
-rw-r--r--actionpack/lib/action_controller/url_rewriter.rb36
1 files changed, 23 insertions, 13 deletions
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