diff --git a/src/Symfony/Component/BrowserKit/CookieJar.php b/src/Symfony/Component/BrowserKit/CookieJar.php index d65bbf87dc..e0849cf697 100644 --- a/src/Symfony/Component/BrowserKit/CookieJar.php +++ b/src/Symfony/Component/BrowserKit/CookieJar.php @@ -37,6 +37,11 @@ class CookieJar /** * Gets a cookie by name. * + * You should never use an empty domain, but if you do so, + * this method returns the first cookie for the given name/path + * (this behavior ensures a BC behavior with previous versions of + * Symfony). + * * @param string $name The cookie name * @param string $path The cookie path * @param string $domain The cookie domain @@ -49,12 +54,27 @@ class CookieJar { $this->flushExpiredCookies(); - return isset($this->cookieJar[$domain][$path][$name]) ? $this->cookieJar[$domain][$path][$name] : null; + if (!empty($domain)) { + return isset($this->cookieJar[$domain][$path][$name]) ? $this->cookieJar[$domain][$path][$name] : null; + } + + // avoid relying on this behavior that is mainly here for BC reasons + foreach ($this->cookieJar as $domain => $cookies) { + if (isset($cookies[$path][$name])) { + return $cookies[$path][$name]; + } + } + + return null; } /** * Removes a cookie by name. * + * You should never use an empty domain, but if you do so, + * all cookies for the given name/path expire (this behavior + * ensures a BC behavior with previous versions of Symfony). + * * @param string $name The cookie name * @param string $path The cookie path * @param string $domain The cookie domain @@ -67,13 +87,23 @@ class CookieJar $path = '/'; } - unset($this->cookieJar[$domain][$path][$name]); + if (empty($domain)) { + // an empty domain means any domain + // this should never happen but it allows for a better BC + $domains = array_keys($this->cookieJar); + } else { + $domains = array($domain); + } - if (empty($this->cookieJar[$domain][$path])) { - unset($this->cookieJar[$domain][$path]); + foreach ($domains as $domain) { + unset($this->cookieJar[$domain][$path][$name]); - if (empty($this->cookieJar[$domain])) { - unset($this->cookieJar[$domain]); + if (empty($this->cookieJar[$domain][$path])) { + unset($this->cookieJar[$domain][$path]); + + if (empty($this->cookieJar[$domain])) { + unset($this->cookieJar[$domain]); + } } } }