6
6
use PHPPM \Bootstraps \BootstrapInterface ;
7
7
use PHPPM \Bootstraps \HooksInterface ;
8
8
use PHPPM \Bootstraps \RequestClassProviderInterface ;
9
- use PHPPM \Utils ;
10
9
use Psr \Http \Message \ServerRequestInterface ;
11
10
use Psr \Http \Message \ResponseInterface ;
12
11
use RingCentral \Psr7 ;
@@ -95,10 +94,8 @@ public function handle(ServerRequestInterface $request)
95
94
return $ response ;
96
95
}
97
96
98
- // should not receive output from application->handle()
99
- @ob_end_clean ();
100
-
101
- $ response = $ this ->mapResponse ($ syResponse );
97
+ $ out = ob_get_clean ();
98
+ $ response = $ this ->mapResponse ($ syResponse , $ out );
102
99
103
100
if ($ this ->application instanceof TerminableInterface) {
104
101
$ this ->application ->terminate ($ syRequest , $ syResponse );
@@ -114,7 +111,8 @@ public function handle(ServerRequestInterface $request)
114
111
/**
115
112
* Convert React\Http\Request to Symfony\Component\HttpFoundation\Request
116
113
*
117
- * @param ReactRequest $reactRequest
114
+ * @param ServerRequestInterface $psrRequest
115
+ *
118
116
* @return SymfonyRequest $syRequest
119
117
*/
120
118
protected function mapRequest (ServerRequestInterface $ psrRequest )
@@ -124,7 +122,6 @@ protected function mapRequest(ServerRequestInterface $psrRequest)
124
122
125
123
// cookies
126
124
$ _COOKIE = [];
127
- $ sessionCookieSet = false ;
128
125
129
126
foreach ($ psrRequest ->getHeader ('Cookie ' ) as $ cookieHeader ) {
130
127
$ cookies = explode ('; ' , $ cookieHeader );
@@ -135,19 +132,10 @@ protected function mapRequest(ServerRequestInterface $psrRequest)
135
132
136
133
if ($ name === session_name ()) {
137
134
session_id ($ value );
138
- $ sessionCookieSet = true ;
139
135
}
140
136
}
141
137
}
142
138
143
- if (!$ sessionCookieSet && session_id ()) {
144
- // session id already set from the last round but not obtained
145
- // from the cookie header, so generate a new one, since php is
146
- // not doing it automatically with session_start() if session
147
- // has already been started.
148
- session_id (Utils::generateSessionId ());
149
- }
150
-
151
139
/** @var \React\Http\Io\UploadedFile $file */
152
140
$ uploadedFiles = $ psrRequest ->getUploadedFiles ();
153
141
@@ -174,7 +162,6 @@ protected function mapRequest(ServerRequestInterface $psrRequest)
174
162
$ mapFiles ($ uploadedFiles );
175
163
176
164
// @todo check howto handle additional headers
177
-
178
165
// @todo check howto support other HTTP methods with bodies
179
166
$ post = $ psrRequest ->getParsedBody () ?: array ();
180
167
@@ -197,16 +184,26 @@ protected function mapRequest(ServerRequestInterface $psrRequest)
197
184
* Convert Symfony\Component\HttpFoundation\Response to React\Http\Response
198
185
*
199
186
* @param SymfonyResponse $syResponse
187
+ * @param string $stdout Additional stdout that was catched during handling a request.
188
+ *
200
189
* @return ResponseInterface
201
190
*/
202
- protected function mapResponse (SymfonyResponse $ syResponse )
191
+ protected function mapResponse (SymfonyResponse $ syResponse, $ stdout = '' )
203
192
{
204
193
// end active session
205
194
if (PHP_SESSION_ACTIVE === session_status ()) {
195
+ // make sure open session are saved to the storage
196
+ // in case the framework hasn't closed it correctly.
206
197
session_write_close ();
207
- session_unset (); // reset $_SESSION
208
198
}
209
199
200
+ // reset session_id in any case to something not valid, for next request
201
+ session_id ('' );
202
+
203
+ //reset $_SESSION
204
+ session_unset ();
205
+ unset($ _SESSION );
206
+
210
207
$ nativeHeaders = [];
211
208
212
209
foreach (headers_list () as $ header ) {
@@ -278,6 +275,10 @@ protected function mapResponse(SymfonyResponse $syResponse)
278
275
@ob_end_flush ();
279
276
}
280
277
278
+ if ($ stdout ) {
279
+ $ content = $ stdout . $ content ;
280
+ }
281
+
281
282
if (!isset ($ headers ['Content-Length ' ])) {
282
283
$ psrResponse = $ psrResponse ->withAddedHeader ('Content-Length ' , strlen ($ content ));
283
284
}
0 commit comments