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:
Simon Rozet 2009-02-22 07:04:30 +01:00
parent 7d7c32256d
commit 4e07f5b654
3 changed files with 14 additions and 0 deletions

View File

@ -30,6 +30,7 @@ module Webrat
data[key] = Rack::Utils.unescape(value) data[key] = Rack::Utils.unescape(value)
data data
end end
headers["HTTP_HOST"] = "www.example.com"
@browser.#{verb}(path, params, headers) @browser.#{verb}(path, params, headers)
end end
RUBY RUBY

View File

@ -5,4 +5,12 @@ class MyModularApp < Sinatra::Default
get "/" do get "/" do
"Hello World" "Hello World"
end end
get "/redirect_absolute_url" do
redirect URI.join(request.url, "foo").to_s
end
get "/foo" do
"spam"
end
end end

View File

@ -13,4 +13,9 @@ class MyModularAppTest < Test::Unit::TestCase
visit "/" visit "/"
assert_contain "Hello World" assert_contain "Hello World"
end end
def test_redirects
visit "/redirect_absolute_url"
assert_equal "spam", response_body
end
end end