diff --git a/lib/rack/mock.rb b/lib/rack/mock.rb index 5b2512ca0..3f2a7136e 100644 --- a/lib/rack/mock.rb +++ b/lib/rack/mock.rb @@ -231,9 +231,11 @@ def cookie(name) def parse_cookies_from_header cookies = Hash.new - if original_headers.has_key? 'Set-Cookie' - set_cookie_header = original_headers.fetch('Set-Cookie') - set_cookie_header.split("\n").each do |cookie| + hashed_headers = Rack::Utils::HeaderHash[original_headers] + if hashed_headers.has_key?("Set-Cookie") + values = (v = hashed_headers["Set-Cookie"]).respond_to?(:to_ary) ? v.to_ary : v.split("\n") + + values.each do |cookie| cookie_name, cookie_filling = cookie.split('=', 2) cookie_attributes = identify_cookie_attributes cookie_filling parsed_cookie = CGI::Cookie.new( diff --git a/test/spec_mock.rb b/test/spec_mock.rb index d2311f5a2..f2763c1a7 100644 --- a/test/spec_mock.rb +++ b/test/spec_mock.rb @@ -324,6 +324,21 @@ res.cookie("i_dont_exist").must_be_nil end + it "parses cookie headers provided as an array" do + res = Rack::MockRequest.new(->(env) { [200, [["set-cookie", "array=awesome"]], [""]] }).get("") + array_cookie = res.cookie("array") + array_cookie.value[0].must_equal "awesome" + end + + it "parses multiple set-cookie headers provided as an array" do + cookie_headers = [["set-cookie", ["array=awesome", "multiple=times"]]] + res = Rack::MockRequest.new(->(env) { [200, cookie_headers, [""]] }).get("") + array_cookie = res.cookie("array") + array_cookie.value[0].must_equal "awesome" + second_cookie = res.cookie("multiple") + second_cookie.value[0].must_equal "times" + end + it "provide access to the HTTP body" do res = Rack::MockRequest.new(app).get("") res.body.must_match(/rack/)