diff --git a/lib/httparty/request.rb b/lib/httparty/request.rb index 4440cdba..81d63ac1 100644 --- a/lib/httparty/request.rb +++ b/lib/httparty/request.rb @@ -103,7 +103,7 @@ def perform(&block) end handle_deflation - handle_response(chunked_body) + handle_response(chunked_body, &block) end private @@ -172,14 +172,14 @@ def query_string(uri) query_string_parts.size > 0 ? query_string_parts.join('&') : nil end - def handle_response(body) + def handle_response(body, &block) if response_redirects? options[:limit] -= 1 self.path = last_response['location'] self.redirect = true self.http_method = Net::HTTP::Get unless options[:maintain_method_across_redirects] capture_cookies(last_response) - perform + perform(&block) else body = body || last_response.body Response.new(self, last_response, lambda { parse_response(body) }, :body => body) diff --git a/lib/httparty/response.rb b/lib/httparty/response.rb index abc05aea..755e75e5 100644 --- a/lib/httparty/response.rb +++ b/lib/httparty/response.rb @@ -9,7 +9,7 @@ def self.underscore(string) def initialize(request, response, parsed_block, options={}) @request = request @response = response - @body = response.body || options[:body] + @body = options[:body] || response.body @parsed_block = parsed_block @headers = Headers.new(response.to_hash) end diff --git a/spec/httparty/request_spec.rb b/spec/httparty/request_spec.rb index f944ab24..b5f0cdc7 100644 --- a/spec/httparty/request_spec.rb +++ b/spec/httparty/request_spec.rb @@ -262,6 +262,15 @@ response.should == {"hash" => {"foo" => "bar"}} end + it "calls block given to perform with each redirect" do + @request = HTTParty::Request.new(Net::HTTP::Get, 'http://test.com/redirect', :format => :xml) + FakeWeb.register_uri(:get, "http://test.com/redirect", :status => [300, "REDIRECT"], :location => "http://api.foo.com/v2") + FakeWeb.register_uri(:get, "http://api.foo.com/v2", :body => "bar") + body = "" + response = @request.perform { |chunk| body += chunk } + body.length.should == 27 + end + it "redirects if a 300 contains a relative location header" do redirect = stub_response '', 300 redirect['location'] = '/foo/bar'