Skip to content

Commit

Permalink
Backport #2965: Add a Request.cookies function
Browse files Browse the repository at this point in the history
  • Loading branch information
ScalaFanatic authored and rossabaker committed Nov 26, 2019
1 parent f4809c1 commit 5a281bd
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 0 deletions.
8 changes: 8 additions & 0 deletions core/src/main/scala/org/http4s/Message.scala
Original file line number Diff line number Diff line change
Expand Up @@ -338,6 +338,14 @@ sealed abstract case class Request[F[_]](
*/
def params: Map[String, String] = uri.params

/**
* Parses all available [[Cookie]] headers into a list of [[RequestCookie]] objects. This
* implementation is compatible with cookie headers formatted per HTTP/1 and HTTP/2, or even both
* at the same time.
*/
def cookies: List[RequestCookie] =
headers.get(Cookie).fold(List.empty[RequestCookie])(_.values.toList)

/** Add a Cookie header for the provided [[Cookie]] */
def addCookie(cookie: RequestCookie): Self =
headers
Expand Down
34 changes: 34 additions & 0 deletions tests/src/test/scala/org/http4s/MessageSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,40 @@ class MessageSpec extends Http4sSpec {
}
}

"cookies" should {
val cookieList = List(
RequestCookie("test1", "value1"),
RequestCookie("test2", "value2"),
RequestCookie("test3", "value3"))

"be empty if there are no Cookie headers present" in {
Request(Method.GET).cookies mustEqual List.empty
}

"parse discrete HTTP/1 Cookie header(s) into corresponding RequestCookies" in {
val cookies = Header("Cookie", "test1=value1; test2=value2; test3=value3")
val request = Request(Method.GET, headers = Headers.of(cookies))
request.cookies mustEqual cookieList
}

"parse discrete HTTP/2 Cookie header(s) into corresponding RequestCookies" in {
val cookies = Headers.of(
Header("Cookie", "test1=value1"),
Header("Cookie", "test2=value2"),
Header("Cookie", "test3=value3"))
val request = Request(Method.GET, headers = cookies)
request.cookies mustEqual cookieList
}

"parse HTTP/1 and HTTP/2 Cookie headers on a single request into corresponding RequestCookies" in {
val cookies = Headers.of(
Header("Cookie", "test1=value1; test2=value2"), // HTTP/1 style
Header("Cookie", "test3=value3")) // HTTP/2 style (separate headers for separate cookies)
val request = Request(Method.GET, headers = cookies)
request.cookies mustEqual cookieList
}
}

"toString" should {
"redact an Authorization header" in {
val request =
Expand Down

0 comments on commit 5a281bd

Please sign in to comment.