diff --git a/core/src/main/scala/org/http4s/Message.scala b/core/src/main/scala/org/http4s/Message.scala index 418dd33177b..c75b4910aab 100644 --- a/core/src/main/scala/org/http4s/Message.scala +++ b/core/src/main/scala/org/http4s/Message.scala @@ -340,7 +340,14 @@ sealed abstract case class Request[F[_]]( /** Add a Cookie header for the provided [[Cookie]] */ def addCookie(cookie: RequestCookie): Self = - putHeaders(Cookie(NonEmptyList.of(cookie))) + headers + .get(Cookie) + .fold(putHeaders(Cookie(NonEmptyList.of(cookie)))) { preExistingCookie => + removeHeader(Cookie).putHeaders( + Header( + Cookie.name.value, + s"${preExistingCookie.value}; ${cookie.name}=${cookie.content}")) + } /** Add a Cookie header with the provided values */ def addCookie(name: String, content: String): Self = diff --git a/tests/src/test/scala/org/http4s/MessageSpec.scala b/tests/src/test/scala/org/http4s/MessageSpec.scala index 859782674df..0ec53c4e12d 100644 --- a/tests/src/test/scala/org/http4s/MessageSpec.scala +++ b/tests/src/test/scala/org/http4s/MessageSpec.scala @@ -67,6 +67,15 @@ class MessageSpec extends Http4sSpec { .map(_.value) must beSome("token=value") } + "contain a single Cookie header when multiple explicit cookies are added" in { + Request(Method.GET) + .addCookie(RequestCookie("token1", "value1")) + .addCookie(RequestCookie("token2", "value2")) + .headers + .get("Cookie".ci) + .map(_.value) must beSome("token1=value1; token2=value2") + } + "contain a Cookie header when a name/value pair is added" in { Request(Method.GET) .addCookie("token", "value") @@ -74,6 +83,15 @@ class MessageSpec extends Http4sSpec { .get("Cookie".ci) .map(_.value) must beSome("token=value") } + + "contain a single Cookie header when name/value pairs are added" in { + Request(Method.GET) + .addCookie("token1", "value1") + .addCookie("token2", "value2") + .headers + .get("Cookie".ci) + .map(_.value) must beSome("token1=value1; token2=value2") + } } "Request.with..." should { @@ -118,7 +136,7 @@ class MessageSpec extends Http4sSpec { "redact Cookie Headers" in { val request = Request[IO](Method.GET).addCookie("token", "value").addCookie("token2", "value2") - request.toString must_== ("Request(method=GET, uri=/, headers=Headers(Cookie: , Cookie: ))") + request.toString must_== ("Request(method=GET, uri=/, headers=Headers(Cookie: ))") } } }