diff --git a/gatling-http/src/main/scala/com/excilys/ebi/gatling/http/cookie/CookieJar.scala b/gatling-http/src/main/scala/com/excilys/ebi/gatling/http/cookie/CookieJar.scala index 975859ccce..d882022c36 100644 --- a/gatling-http/src/main/scala/com/excilys/ebi/gatling/http/cookie/CookieJar.scala +++ b/gatling-http/src/main/scala/com/excilys/ebi/gatling/http/cookie/CookieJar.scala @@ -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)) } diff --git a/gatling-http/src/test/scala/com/excilys/ebi/gatling/http/cookie/CookieJarSpec.scala b/gatling-http/src/test/scala/com/excilys/ebi/gatling/http/cookie/CookieJarSpec.scala index 3633163f1c..feb4c5107d 100644 --- a/gatling-http/src/test/scala/com/excilys/ebi/gatling/http/cookie/CookieJarSpec.scala +++ b/gatling-http/src/test/scala/com/excilys/ebi/gatling/http/cookie/CookieJarSpec.scala @@ -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") + } } } \ No newline at end of file