Skip to content

Commit

Permalink
Checks if cookies is empty before adding to header (#3150)
Browse files Browse the repository at this point in the history
* Checks if cookies is empty before adding to header

see greyblake/crystal-cossack#4

* Adds specs for cookies -> headers methods
TheLonelyGhost authored and jhass committed Aug 14, 2016
1 parent 2d9a84c commit 7ac9a53
Showing 2 changed files with 86 additions and 1 deletion.
85 changes: 85 additions & 0 deletions spec/std/http/cookie_spec.cr
Original file line number Diff line number Diff line change
@@ -195,6 +195,91 @@ module HTTP
cookies.has_key?("a").should be_true
end

describe "adding request headers" do
it "overwrites a pre-existing Cookie header" do
headers = Headers.new
headers["Cookie"] = "some_key=some_value"

cookies = Cookies.new
cookies << Cookie.new("a", "b")

headers["Cookie"].should eq "some_key=some_value"

cookies.add_request_headers(headers)

headers["Cookie"].should eq "a=b"
end

it "merges multiple cookies into one Cookie header" do
headers = Headers.new
cookies = Cookies.new
cookies << Cookie.new("a", "b")
cookies << Cookie.new("c", "d")

cookies.add_request_headers(headers)

headers["Cookie"].should eq "a=b; c=d"
end

describe "when no cookies are set" do
it "does not set a Cookie header" do
headers = Headers.new
headers["Cookie"] = "a=b"
cookies = Cookies.new

headers["Cookie"]?.should_not be_nil
cookies.add_request_headers(headers)
headers["Cookie"]?.should be_nil
end
end
end

describe "adding response headers" do
it "overwrites all pre-existing Set-Cookie headers" do
headers = Headers.new
headers.add("Set-Cookie", "a=b; path=/")
headers.add("Set-Cookie", "c=d; path=/")

cookies = Cookies.new
cookies << Cookie.new("x", "y")

headers.get("Set-Cookie").size.should eq 2
headers.get("Set-Cookie").includes?("a=b; path=/").should be_true
headers.get("Set-Cookie").includes?("c=d; path=/").should be_true

cookies.add_response_headers(headers)

headers.get("Set-Cookie").size.should eq 1
headers.get("Set-Cookie")[0].should eq "x=y; path=/"
end

it "sets one Set-Cookie header per cookie" do
headers = Headers.new
cookies = Cookies.new
cookies << Cookie.new("a", "b")
cookies << Cookie.new("c", "d")

headers.get?("Set-Cookie").should be_nil
cookies.add_response_headers(headers)
headers.get?("Set-Cookie").should_not be_nil

headers.get("Set-Cookie").includes?("a=b; path=/").should be_true
headers.get("Set-Cookie").includes?("c=d; path=/").should be_true
end

describe "when no cookies are set" do
it "does not set a Set-Cookie header" do
headers = Headers.new
headers.add("Set-Cookie", "a=b; path=/")
cookies = Cookies.new

headers.get?("Set-Cookie").should_not be_nil
cookies.add_response_headers(headers)
headers.get?("Set-Cookie").should be_nil
end
end
end

it "disallows adding inconsistent state" do
cookies = Cookies.new

2 changes: 1 addition & 1 deletion src/http/cookie.cr
Original file line number Diff line number Diff line change
@@ -246,7 +246,7 @@ module HTTP
# `Cookie` headers in it.
def add_request_headers(headers)
headers.delete("Cookie")
headers.add("Cookie", map(&.to_cookie_header).join("; "))
headers.add("Cookie", map(&.to_cookie_header).join("; ")) unless empty?

headers
end

0 comments on commit 7ac9a53

Please sign in to comment.