mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
All router redirect helper to accept a full URI [#3653 state:resolved]
This commit is contained in:
parent
8ff4faf66a
commit
b3900a29eb
2 changed files with 24 additions and 6 deletions
|
@ -200,13 +200,21 @@ module ActionDispatch
|
|||
path = args.shift || block
|
||||
path_proc = path.is_a?(Proc) ? path : proc { |params| path % params }
|
||||
status = options[:status] || 301
|
||||
body = 'Moved Permanently'
|
||||
|
||||
lambda do |env|
|
||||
req = Rack::Request.new(env)
|
||||
params = path_proc.call(env["action_dispatch.request.path_parameters"])
|
||||
url = req.scheme + '://' + req.host + params
|
||||
req = Request.new(env)
|
||||
|
||||
[ status, {'Location' => url, 'Content-Type' => 'text/html'}, ['Moved Permanently'] ]
|
||||
uri = URI.parse(path_proc.call(req.params))
|
||||
uri.scheme ||= req.scheme
|
||||
uri.host ||= req.host
|
||||
|
||||
headers = {
|
||||
'Location' => uri.to_s,
|
||||
'Content-Type' => 'text/html',
|
||||
'Content-Length' => body.length.to_s
|
||||
}
|
||||
[ status, headers, [body] ]
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -29,6 +29,7 @@ class TestRoutingMapper < ActionDispatch::IntegrationTest
|
|||
|
||||
match 'account/modulo/:name', :to => redirect("/%{name}s")
|
||||
match 'account/proc/:name', :to => redirect {|params| "/#{params[:name].pluralize}" }
|
||||
match 'account/google' => redirect('http://www.google.com/')
|
||||
|
||||
match 'openid/login', :via => [:get, :post], :to => "openid#login"
|
||||
|
||||
|
@ -472,7 +473,7 @@ class TestRoutingMapper < ActionDispatch::IntegrationTest
|
|||
assert_equal 'projects#index', @response.body
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def test_index
|
||||
with_test_routes do
|
||||
assert_equal '/info', info_path
|
||||
|
@ -488,7 +489,7 @@ class TestRoutingMapper < ActionDispatch::IntegrationTest
|
|||
assert_equal 'projects#info', @response.body
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def test_convention_match_with_no_scope
|
||||
with_test_routes do
|
||||
assert_equal '/account/overview', account_overview_path
|
||||
|
@ -497,6 +498,15 @@ class TestRoutingMapper < ActionDispatch::IntegrationTest
|
|||
end
|
||||
end
|
||||
|
||||
def test_redirect_with_complete_url
|
||||
with_test_routes do
|
||||
get '/account/google'
|
||||
assert_equal 301, @response.status
|
||||
assert_equal 'http://www.google.com/', @response.headers['Location']
|
||||
assert_equal 'Moved Permanently', @response.body
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
def with_test_routes
|
||||
real_routes, temp_routes = ActionController::Routing::Routes, Routes
|
||||
|
|
Loading…
Reference in a new issue