Merge branch 'redirects'
This commit is contained in:
commit
01963a8057
29
spec/redirect_spec.cr
Normal file
29
spec/redirect_spec.cr
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
require "./spec_helper"
|
||||||
|
|
||||||
|
WebMock.stub(:get, "http://example.com/redirect").to_return(body: "success")
|
||||||
|
|
||||||
|
WebMock.stub(:post, "http://example.com/post")
|
||||||
|
.with(body: "email=foobar", headers: {"Content-Type" => "application/x-www-form-urlencoded"})
|
||||||
|
.to_return(status: 302, body: "redirect", headers: {"Location" => "http://example.com/redirect"})
|
||||||
|
|
||||||
|
WebMock.stub(:post, "http://example.com/post2")
|
||||||
|
.with(body: "email=foobar", headers: {"Content-Type" => "application/x-www-form-urlencoded"})
|
||||||
|
.to_return(status: 302, body: "redirect", headers: {"Location" => "/redirect"})
|
||||||
|
|
||||||
|
describe "Mechanize redirect test" do
|
||||||
|
it "redirect" do
|
||||||
|
agent = Mechanize.new
|
||||||
|
query = {"email" => "foobar"}
|
||||||
|
page = agent.post("http://example.com/post", query: query)
|
||||||
|
page.body.should eq("success")
|
||||||
|
page.code.should eq(200)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "redirect with relative path" do
|
||||||
|
agent = Mechanize.new
|
||||||
|
query = {"email" => "foobar"}
|
||||||
|
page = agent.post("http://example.com/post2", query: query)
|
||||||
|
page.body.should eq("success")
|
||||||
|
page.code.should eq(200)
|
||||||
|
end
|
||||||
|
end
|
@ -30,9 +30,26 @@ module MechanizeCr
|
|||||||
page = response_parse(response, body, uri)
|
page = response_parse(response, body, uri)
|
||||||
# save cookies
|
# save cookies
|
||||||
save_response_cookies(response, uri, page)
|
save_response_cookies(response, uri, page)
|
||||||
|
|
||||||
|
if response && response.status.redirection?
|
||||||
|
return follow_redirect(response, headers, page)
|
||||||
|
end
|
||||||
|
|
||||||
page
|
page
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private def follow_redirect(response, headers, referer)
|
||||||
|
redirect_url = response.headers["location"]
|
||||||
|
uri = resolve_url(redirect_url, referer)
|
||||||
|
|
||||||
|
# Make sure we are not copying over the POST headers from the original request
|
||||||
|
headers.delete("Content-MD5")
|
||||||
|
headers.delete("Content-Type")
|
||||||
|
headers.delete("Content-Length")
|
||||||
|
|
||||||
|
@context.not_nil!.get(uri)
|
||||||
|
end
|
||||||
|
|
||||||
def http_request(uri, method, params)
|
def http_request(uri, method, params)
|
||||||
case uri.scheme.not_nil!.downcase
|
case uri.scheme.not_nil!.downcase
|
||||||
when "http", "https" then
|
when "http", "https" then
|
||||||
|
Loading…
Reference in New Issue
Block a user