Skip to content

Commit

Permalink
Merge pull request #956 from nremond/double_cookies
Browse files Browse the repository at this point in the history
Multiple times the same cookie : consider the value of the last one, fix for #954
  • Loading branch information
nremond committed Feb 13, 2013
2 parents ab9ea15 + 5c3d87b commit 7794067
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 14 deletions.
Expand Up @@ -85,23 +85,18 @@ class CookieJar(store: Map[URI, List[Cookie]]) {

def cookiesEquals(c1: Cookie, c2: Cookie) = c1.getName.equalsIgnoreCase(c2.getName) && c1.getDomain.equalsIgnoreCase(c2.getDomain) && c1.getPath == c2.getPath

@tailrec
def addOrReplaceCookies(newCookies: List[Cookie], oldCookies: List[Cookie]): List[Cookie] = newCookies match {
case Nil => oldCookies
case newCookie :: moreNewCookies =>
val updatedCookies = newCookie :: oldCookies.filterNot(cookiesEquals(_, newCookie))
addOrReplaceCookies(moreNewCookies, updatedCookies)
}

def hasExpired(c: Cookie): Boolean = c.getMaxAge != MAX_AGE_UNSPECIFIED && c.getMaxAge <= 0

val uri = getEffectiveUri(rawURI)

val cookiesWithExactURI = store.get(uri) match {
case Some(cookies) =>
@tailrec
def addOrReplaceCookies(newCookies: List[Cookie], oldCookies: List[Cookie]): List[Cookie] = newCookies match {
case Nil => oldCookies
case newCookie :: moreNewCookies =>
val updatedCookies = newCookie :: oldCookies.filterNot(cookiesEquals(_, newCookie))
addOrReplaceCookies(moreNewCookies, updatedCookies)
}

addOrReplaceCookies(newCookies, cookies)
case _ => newCookies
}
val cookiesWithExactURI = addOrReplaceCookies(newCookies, store.get(uri).getOrElse(List.empty))
val nonExpiredCookies = cookiesWithExactURI.filterNot(hasExpired)
new CookieJar(store + (uri -> nonExpiredCookies))
}
Expand Down
Expand Up @@ -188,5 +188,16 @@ class CookieJarSpec extends Specification {
// RFC 6265, 5.1.3. Domain Matching
cookieStore.get(new URI("https://y.x.foo.org/")).length must beEqualTo(1)
}

"should serve the last cookie when they are definied twice" in {
val cookie1 = parseCookie("cookie1=VALUE1; Path=/")
val cookie2 = parseCookie("cookie1=VALUE2; Path=/")
val cookie3 = parseCookie("cookie1=VALUE3; Path=/")
val cookieStore = CookieJar(new URI("https://foo.org/"), List(cookie1, cookie2, cookie3))

val cookies = cookieStore.get(new URI("https://foo.org/"))
cookies.length must beEqualTo(1)
cookies.head.getValue must beEqualTo("VALUE3")
}
}
}

0 comments on commit 7794067

Please sign in to comment.