diff --git a/lib/http/redirector.rb b/lib/http/redirector.rb index b4fb9abf..34ced658 100644 --- a/lib/http/redirector.rb +++ b/lib/http/redirector.rb @@ -58,7 +58,8 @@ def perform(request, response) @response.flush - @request = redirect_to @response.headers[Headers::LOCATION] + # XXX(ixti): using `Array#inject` to return `nil` if no Location header. + @request = redirect_to(@response.headers.get(Headers::LOCATION).inject(:+)) @response = yield @request end diff --git a/spec/lib/http/redirector_spec.rb b/spec/lib/http/redirector_spec.rb index e30b1ff9..bed418f8 100644 --- a/spec/lib/http/redirector_spec.rb +++ b/spec/lib/http/redirector_spec.rb @@ -76,6 +76,19 @@ def redirect_response(status, location) expect(res.to_s).to eq "foo" end + it "concatenates multiple Location headers" do + req = HTTP::Request.new :verb => :head, :uri => "http://example.com" + headers = HTTP::Headers.new + + %w[http://example.com /123].each { |loc| headers.add("Location", loc) } + + res = redirector.perform(req, simple_response(301, "", headers)) do |redirect| + simple_response(200, redirect.uri.to_s) + end + + expect(res.to_s).to eq "http://example.com/123" + end + context "following 300 redirect" do context "with strict mode" do let(:options) { {:strict => true} }