Fix following of absolute redirect URL in Sinatra
What's going on when the app redirects to an absolute URL? * Sinatra relies on Rack::MockSession which sets SERVER_NAME to "example.org" [1] on request it makes. However, Webrat expects it to be "www.example.com" * In MyClassyApp, the redirect URL is made out of Rack::Request#url [2] which uses SERVER_NAME, which is set to "example.org" by Rack::MockSession. As a result, Webrat see it as an external redirect and don't follow it. NOTE: * SERVER_NAME is stricly equivalent to HTTP_HOST [3] * This could have been fixed in Webrat::Session too. I'am not sure that it won't affect other frameworks so I left it intact. def request_page(url, http_method, data) #:nodoc: h = headers h['HTTP_REFERER'] = @current_url if @current_url + h['HTTP_HOST'] = 'www.example.com' [1]5c00dd698e/lib/rack/mock.rb (L79)
[2]5c00dd698e/lib/rack/request.rb (L201)
[3]5c00dd698e/lib/rack/request.rb (L72)
This commit is contained in:
parent
7d7c32256d
commit
4e07f5b654
@ -30,6 +30,7 @@ module Webrat
|
||||
data[key] = Rack::Utils.unescape(value)
|
||||
data
|
||||
end
|
||||
headers["HTTP_HOST"] = "www.example.com"
|
||||
@browser.#{verb}(path, params, headers)
|
||||
end
|
||||
RUBY
|
||||
|
@ -5,4 +5,12 @@ class MyModularApp < Sinatra::Default
|
||||
get "/" do
|
||||
"Hello World"
|
||||
end
|
||||
|
||||
get "/redirect_absolute_url" do
|
||||
redirect URI.join(request.url, "foo").to_s
|
||||
end
|
||||
|
||||
get "/foo" do
|
||||
"spam"
|
||||
end
|
||||
end
|
||||
|
@ -13,4 +13,9 @@ class MyModularAppTest < Test::Unit::TestCase
|
||||
visit "/"
|
||||
assert_contain "Hello World"
|
||||
end
|
||||
|
||||
def test_redirects
|
||||
visit "/redirect_absolute_url"
|
||||
assert_equal "spam", response_body
|
||||
end
|
||||
end
|
||||
|
Loading…
Reference in New Issue
Block a user