8000 [BrowserKit] Fixed CookieJar issue being unable to parse multiple coo… · gbenoit79/symfony@87890d3 · GitHub
[go: up one dir, main page]

Skip to content

Commit 87890d3

Browse files
committed
[BrowserKit] Fixed CookieJar issue being unable to parse multiple cookies from Set-Cookie.
1 parent 13aa515 commit 87890d3

File tree

2 files changed

+40
-0
lines changed

2 files changed

+40
-0
lines changed

src/Symfony/Component/BrowserKit/CookieJar.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,19 @@ public function clear()
9696
*/
9797
public function updateFromResponse(Response $response, $uri = null)
9898
{
99+
$cookies = array();
100+
99101
foreach ($response->getHeader('Set-Cookie', false) as $cookie) {
102+
foreach (explode(',', $cookie) as $i => $part) {
103+
if ($i==0 || preg_match('/^(?P<token>\s*[0-9A-Za-z!#\$%\&\'\*\+\-\.^_`\|~]+)=/', $part)) {
104+
$cookies[] = ltrim($part);
105+
} else {
106+
$cookies[count($cookies)-1].= ','.$part;
107+
}
108+
}
109+
}
110+
111+
foreach ($cookies as $cookie) {
100112
$this->set(Cookie::fromString($cookie, $uri));
101113
}
102114
}

src/Symfony/Component/BrowserKit/Tests/CookieJarTest.php

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,38 @@ public function testUpdateFromResponse()
6666
$cookieJar->set(new Cookie('bar', 'bar'));
6767
$cookieJar->updateFromResponse($response);
6868

69+
$this->assertInstanceOf('Symfony\Component\BrowserKit\Cookie', $cookieJar->get('foo'));
70+
$this->assertInstanceOf('Symfony\Component\BrowserKit\Cookie', $cookieJar->get('bar'));
6971
$this->assertEquals('foo', $cookieJar->get('foo')->getValue(), '->updateFromResponse() updates cookies from a Response objects');
7072
$this->assertEquals('bar', $cookieJar->get('bar')->getValue(), '->updateFromResponse() keeps existing cookies');
7173
}
7274

75+
public function testUpdateFromResponseWithMultipleCookies()
76+
{
77+
$timestamp = time() + 3600;
78+
$date = gmdate('D, d M Y H:i:s \G\M\T', $timestamp);
79+
$response = new Response('', 200, array(
80+
'Set-Cookie' => sprintf('foo=foo; expires=%s; domain=.symfony.com; path=/, bar=bar; domain=.blog.symfony.com, PHPSESSID=id; expires=%s', $date, $date)
81+
));
82+
83+
$cookieJar = new CookieJar();
84+
$cookieJar->updateFromResponse($response);
85+
86+
$fooCookie = $cookieJar->get('foo', '/', '.symfony.com');
87+
$barCookie = $cookieJar->get('bar', '/', '.blog.symfony.com');
88+
$phpCookie = $cookieJar->get('PHPSESSID');
89+
90+
$this->assertInstanceOf('Symfony\Component\BrowserKit\Cookie', $fooCookie);
91+
$this->assertInstanceOf('Symfony\Component\BrowserKit\Cookie', $barCookie);
92+
$this->assertInstanceOf('Symfony\Component\BrowserKit\Cookie', $phpCookie);
93+
$this->assertEquals('foo', $fooCookie->getValue());
94+
$this->assertEquals('bar', $barCookie->getValue());
95+
$this->assertEquals('id', $phpCookie->getValue());
96+
$this->assertEquals($timestamp, $fooCookie->getExpiresTime());
97+
$this->assertEquals(null, $barCookie->getExpiresTime());
98+
$this->assertEquals($timestamp, $phpCookie->getExpiresTime());
99+
}
100+
73101
/**
74102
* @dataProvider provideAllValuesValues
75103
*/

0 commit comments

Comments
 (0)
0