mirror of
https://github.com/teamcapybara/capybara.git
synced 2022-11-09 12:08:07 -05:00
Rack::Test now does not send a referer when calling visit
multiple times
This commit is contained in:
parent
6a450276b4
commit
21d0b25dba
3 changed files with 19 additions and 32 deletions
|
@ -18,30 +18,28 @@ class Capybara::RackTest::Browser
|
||||||
|
|
||||||
def visit(path, attributes = {})
|
def visit(path, attributes = {})
|
||||||
reset_host!
|
reset_host!
|
||||||
process(:get, path, attributes)
|
process_and_follow_redirects(:get, path, attributes)
|
||||||
follow_redirects!
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def submit(method, path, attributes)
|
def submit(method, path, attributes)
|
||||||
path = request_path if not path or path.empty?
|
path = request_path if not path or path.empty?
|
||||||
process(method, path, attributes)
|
process_and_follow_redirects(method, path, attributes, {'HTTP_REFERER' => current_url})
|
||||||
follow_redirects!
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def follow(method, path, attributes = {})
|
def follow(method, path, attributes = {})
|
||||||
return if path.gsub(/^#{request_path}/, '').start_with?('#')
|
return if path.gsub(/^#{request_path}/, '').start_with?('#')
|
||||||
process(method, path, attributes)
|
process_and_follow_redirects(method, path, attributes, {'HTTP_REFERER' => current_url})
|
||||||
follow_redirects!
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def follow_redirects!
|
def process_and_follow_redirects(method, path, attributes = {}, env = {})
|
||||||
|
process(method, path, attributes, env)
|
||||||
5.times do
|
5.times do
|
||||||
process(:get, last_response["Location"]) if last_response.redirect?
|
process(:get, last_response["Location"], {}, env) if last_response.redirect?
|
||||||
end
|
end
|
||||||
raise Capybara::InfiniteRedirectError, "redirected more than 5 times, check for infinite redirects." if last_response.redirect?
|
raise Capybara::InfiniteRedirectError, "redirected more than 5 times, check for infinite redirects." if last_response.redirect?
|
||||||
end
|
end
|
||||||
|
|
||||||
def process(method, path, attributes = {})
|
def process(method, path, attributes = {}, env = {})
|
||||||
new_uri = URI.parse(path)
|
new_uri = URI.parse(path)
|
||||||
method.downcase! unless method.is_a? Symbol
|
method.downcase! unless method.is_a? Symbol
|
||||||
|
|
||||||
|
@ -60,7 +58,7 @@ class Capybara::RackTest::Browser
|
||||||
end
|
end
|
||||||
|
|
||||||
reset_cache!
|
reset_cache!
|
||||||
send(method, path, attributes, env)
|
send(method, path, attributes, env.merge(options[:headers] || {}))
|
||||||
end
|
end
|
||||||
|
|
||||||
def current_url
|
def current_url
|
||||||
|
@ -107,20 +105,4 @@ protected
|
||||||
rescue Rack::Test::Error
|
rescue Rack::Test::Error
|
||||||
""
|
""
|
||||||
end
|
end
|
||||||
|
|
||||||
def env
|
|
||||||
env = {}
|
|
||||||
begin
|
|
||||||
if last_response.redirect?
|
|
||||||
env["HTTP_REFERER"] = last_request.env["HTTP_REFERER"]
|
|
||||||
else
|
|
||||||
env["HTTP_REFERER"] = last_request.url
|
|
||||||
end
|
|
||||||
rescue Rack::Test::Error
|
|
||||||
# no request yet
|
|
||||||
end
|
|
||||||
env.merge!(options[:headers]) if options[:headers]
|
|
||||||
env
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -307,9 +307,6 @@ shared_examples_for "driver with referer support" do
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should send no referer when visiting a second page" do
|
it "should send no referer when visiting a second page" do
|
||||||
if @driver.is_a? Capybara::RackTest::Driver
|
|
||||||
pending 'Rack::Test sends referer on subsequent visit'
|
|
||||||
end
|
|
||||||
@driver.visit '/get_referer'
|
@driver.visit '/get_referer'
|
||||||
@driver.visit '/get_referer'
|
@driver.visit '/get_referer'
|
||||||
@driver.body.should include 'No referer'
|
@driver.body.should include 'No referer'
|
||||||
|
@ -318,12 +315,18 @@ shared_examples_for "driver with referer support" do
|
||||||
it "should send a referer when following a link" do
|
it "should send a referer when following a link" do
|
||||||
@driver.visit '/referer_base'
|
@driver.visit '/referer_base'
|
||||||
@driver.find('//a[@href="/get_referer"]').first.click
|
@driver.find('//a[@href="/get_referer"]').first.click
|
||||||
@driver.body.should include '/referer_base'
|
@driver.body.should match %r{http://.*/referer_base}
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should preserve the original referer URL when following a redirect" do
|
it "should preserve the original referer URL when following a redirect" do
|
||||||
@driver.visit('/referer_base')
|
@driver.visit('/referer_base')
|
||||||
@driver.find('//a[@href="/redirect_to_get_referer"]').first.click
|
@driver.find('//a[@href="/redirect_to_get_referer"]').first.click
|
||||||
@driver.body.should include('/referer_base')
|
@driver.body.should match %r{http://.*/referer_base}
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should send a referer when submitting a form" do
|
||||||
|
@driver.visit '/referer_base'
|
||||||
|
@driver.find('//input').first.click
|
||||||
|
@driver.body.should match %r{http://.*/referer_base}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -25,7 +25,9 @@ class TestApp < Sinatra::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
get '/referer_base' do
|
get '/referer_base' do
|
||||||
'<a href="/get_referer">direct link</a>; <a href="/redirect_to_get_referer">link via redirect</a>'
|
'<a href="/get_referer">direct link</a>' +
|
||||||
|
'<a href="/redirect_to_get_referer">link via redirect</a>' +
|
||||||
|
'<form action="/get_referer" method="get"><input type="submit"></form>'
|
||||||
end
|
end
|
||||||
|
|
||||||
get '/redirect_to_get_referer' do
|
get '/redirect_to_get_referer' do
|
||||||
|
|
Loading…
Add table
Reference in a new issue