File tree Expand file tree Collapse file tree 3 files changed +24
-18
lines changed
Filter options
tests/Functional/EventListener Expand file tree Collapse file tree 3 files changed +24
-18
lines changed
Original file line number Diff line number Diff line change 1
1
Changelog
2
2
=========
3
3
4
+ 2.9.2
5
+ -----
6
+
7
+ ### Fixed
8
+
9
+ * 2.9.1 fixed overwriting flash messages on multiple redirects, but introduced
10
+ a risk to lose flash messages when redirecting to a path that is outside the
11
+ firewall or destroys the session.
12
+ This version hopefully fixes both cases. Existing flash messages in a request
13
+ cookie are merged with new flash messages from the session.
14
+
4
15
2.9.1
5
16
-----
6
17
Original file line number Diff line number Diff line change @@ -87,26 +87,28 @@ public function onKernelResponse(FlashMessageResponseEvent $event)
87
87
return ;
88
88
}
89
89
90
- $ response = $ event ->getResponse ();
91
-
92
- // If the response is a redirect, we should wait until the final response
93
- // is reached
94
- if ($ response ->isRedirect ()) {
95
- return ;
96
- }
97
-
98
90
$ flashBag = $ this ->session ->getFlashBag ();
99
91
$ flashes = $ flashBag ->all ();
100
92
101
93
if (empty ($ flashes )) {
102
94
return ;
103
95
}
104
96
97
+ $ response = $ event ->getResponse ();
98
+
105
99
$ cookies = $ response ->headers ->getCookies (ResponseHeaderBag::COOKIES_ARRAY );
106
100
$ host = (null === $ this ->options ['host ' ]) ? '' : $ this ->options ['host ' ];
107
101
if (isset ($ cookies [$ host ][$ this ->options ['path ' ]][$ this ->options ['name ' ]])) {
108
102
$ rawCookie = $ cookies [$ host ][$ this ->options ['path ' ]][$ this ->options ['name ' ]]->getValue ();
109
- $ flashes = array_merge ($ flashes , json_decode ($ rawCookie ));
103
+ $ flashes = array_merge_recursive ($ flashes , json_decode ($ rawCookie , true ));
104
+ }
105
+
106
+ // Preserve existing flash message cookie from previous redirect if there was one.
107
+ // This covers multiple redirects where each redirect adds flash messages.
108
+ $ request = $ event ->getRequest ();
109
+ if ($ request ->cookies ->has ($ this ->options ['name ' ])) {
110
+ $ rawCookie = $ request ->cookies ->get ($ this ->options ['name ' ]);
111
+ $ flashes = array_merge_recursive ($ flashes , json_decode ($ rawCookie , true ));
110
112
}
111
113
112
114
$ cookie = new Cookie (
Original file line number Diff line number Diff line change 13
13
14
14
use Mockery \Adapter \Phpunit \MockeryPHPUnitIntegration ;
15
15
use Symfony \Bundle \FrameworkBundle \Test \WebTestCase ;
16
- use Symfony \Component \HttpFoundation \Cookie ;
17
16
18
17
class FlashMessageListenerTest extends WebTestCase
19
18
{
@@ -33,7 +32,6 @@ public function testFlashMessageCookieIsSet()
33
32
34
33
$ found = false ;
35
34
foreach ($ cookies as $ cookie ) {
36
- /** @var Cookie $cookie */
37
35
if ('flash_cookie_name ' !== $ cookie ->getName ()) {
38
36
continue ;
39
37
}
@@ -45,9 +43,7 @@ public function testFlashMessageCookieIsSet()
45
43
$ found = true ;
46
44
}
47
45
48
- if (!$ found ) {
49
- $ this ->fail ('Cookie flash_cookie_name not found in the cookie response header: ' .implode (', ' , $ cookies ));
50
- }
46
+ $ this ->assertTrue ($ found , 'Cookie "flash_cookie_name" not found in response cookies ' );
51
47
}
52
48
53
49
public function testFlashMessageCookieIsSetOnRedirect ()
@@ -65,7 +61,6 @@ public function testFlashMessageCookieIsSetOnRedirect()
65
61
66
62
$ found = false ;
67
63
foreach ($ cookies as $ cookie ) {
68
- /** @var Cookie $cookie */
69
64
if ('flash_cookie_name ' !== $ cookie ->getName ()) {
70
65
continue ;
71
66
}
@@ -77,8 +72,6 @@ public function testFlashMessageCookieIsSetOnRedirect()
77
72
$ found = true ;
78
73
}
79
74
80
- if (!$ found ) {
81
- $ this ->fail ('Cookie flash_cookie_name not found in the cookie response header: ' .implode (', ' , $ cookies ));
82
- }
75
+ $ this ->assertTrue ($ found , 'Cookie "flash_cookie_name" not found in response cookies ' );
83
76
}
84
77
}
You can’t perform that action at this time.
0 commit comments