66use PHPFastCGI \FastCGIDaemon \DaemonInterface ;
77use PHPFastCGI \FastCGIDaemon \Exception \DaemonException ;
88use PHPFastCGI \FastCGIDaemon \Exception \ProtocolException ;
9- use PHPFastCGI \FastCGIDaemon \Http \RequestBuilder ;
9+ use PHPFastCGI \FastCGIDaemon \Http \Request ;
1010use PHPFastCGI \FastCGIDaemon \KernelInterface ;
1111use Psr \Http \Message \ResponseInterface ;
1212use Psr \Http \Message \StreamInterface ;
1313use Psr \Log \LoggerAwareInterface ;
1414use Psr \Log \LoggerAwareTrait ;
1515use Psr \Log \LoggerInterface ;
1616use Psr \Log \NullLogger ;
17+ use Symfony \Component \HttpFoundation \Response as HttpFoundationResponse ;
18+ use Zend \Diactoros \Stream ;
1719
1820/**
1921 * The default implementation of the ConnectionHandlerInterface.
@@ -112,7 +114,7 @@ public function close()
112114 $ this ->bufferLength = 0 ;
113115
114116 foreach ($ this ->requests as $ request ) {
115- $ request ['builder ' ]-> clean ( );
117+ fclose ( $ request ['stdin ' ] );
116118 }
117119
118120 $ this ->requests = [];
@@ -203,6 +205,8 @@ protected function writeResponse($requestId, $headerData, StreamInterface $strea
203205
204206 $ this ->writeRecord ($ requestId , DaemonInterface::FCGI_STDOUT , $ writeData );
205207 } while ($ writeSize === 65535 );
208+
209+ $ this ->writeRecord ($ requestId , DaemonInterface::FCGI_STDOUT );
206210 }
207211
208212 /**
@@ -220,9 +224,7 @@ protected function endRequest($requestId, $appStatus = 0, $protocolStatus = Daem
220224
221225 $ keepAlive = $ this ->requests [$ requestId ]['keepAlive ' ];
222226
223- if (isset ($ this ->requests [$ requestId ]['builder ' ])) {
224- $ this ->requests [$ requestId ]['builder ' ]->clean ();
225- }
227+ fclose ($ this ->requests [$ requestId ]['stdin ' ]);
226228
227229 unset($ this ->requests [$ requestId ]);
228230
@@ -286,7 +288,11 @@ protected function processBeginRequestRecord($requestId, $contentData)
286288
287289 $ keepAlive = DaemonInterface::FCGI_KEEP_CONNECTION & $ content ['flags ' ];
288290
289- $ this ->requests [$ requestId ] = ['keepAlive ' => $ keepAlive ];
291+ $ this ->requests [$ requestId ] = [
292+ 'keepAlive ' => $ keepAlive ,
293+ 'stdin ' => fopen ('php://temp ' , 'r+ ' ),
294+ 'params ' => [],
295+ ];
290296
291297 if ($ this ->shutdown ) {
292298 $ this ->endRequest ($ requestId , 0 , DaemonInterface::FCGI_OVERLOADED );
@@ -297,8 +303,6 @@ protected function processBeginRequestRecord($requestId, $contentData)
297303 $ this ->endRequest ($ requestId , 0 , DaemonInterface::FCGI_UNKNOWN_ROLE );
298304 return ;
299305 }
300-
301- $ this ->requests [$ requestId ]['builder ' ] = new RequestBuilder ();
302306 }
303307
304308 /**
@@ -349,7 +353,7 @@ protected function processParamsRecord($requestId, $contentData)
349353
350354 $ content = unpack ($ contentFormat , $ contentData );
351355
352- $ this ->requests [$ requestId ]['builder ' ]-> addParam ( $ content ['name ' ], $ content ['value ' ]) ;
356+ $ this ->requests [$ requestId ]['params ' ][ $ content ['name ' ]] = $ content ['value ' ];
353357 }
354358
355359 /**
@@ -372,7 +376,7 @@ protected function processStdinRecord($requestId, $contentData)
372376 return ;
373377 }
374378
375- $ this ->requests [$ requestId ]['builder ' ]-> addStdin ( $ contentData );
379+ fwrite ( $ this ->requests [$ requestId ]['stdin ' ], $ contentData );
376380 }
377381
378382 /**
@@ -400,16 +404,23 @@ protected function processAbortRequestRecord($requestId)
400404 */
401405 protected function dispatchRequest ($ requestId )
402406 {
403- $ request = $ this ->requests [$ requestId ]['builder ' ]->getRequest ();
407+ $ request = new Request (
408+ $ this ->requests [$ requestId ]['params ' ],
409+ $ this ->requests [$ requestId ]['stdin ' ]
410+ );
404411
405412 try {
406413 $ response = $ this ->kernel ->handleRequest ($ request );
407414
408- if (!$ response instanceof ResponseInterface) {
409- throw new \LogicException ('Kernel must return a PSR-7 HTTP response message ' );
415+ if ($ response instanceof ResponseInterface) {
416+ $ this ->sendResponse ($ requestId , $ response );
417+ } elseif ($ response instanceof HttpFoundationResponse) {
418+ $ this ->sendHttpFoundationResponse ($ requestId , $ response );
419+ } else {
420+ throw new \LogicException ('Kernel must return a PSR-7 or HttpFoundation response message ' );
410421 }
411422
412- $ this ->sendResponse ($ requestId, $ response );
423+ $ this ->endRequest ($ requestId );
413424 } catch (\Exception $ exception ) {
414425 $ this ->logger ->error ($ exception ->getMessage ());
415426
@@ -425,7 +436,10 @@ protected function dispatchRequest($requestId)
425436 */
426437 protected function sendResponse ($ requestId , ResponseInterface $ response )
427438 {
428- $ headerData = "Status: {$ response ->getStatusCode ()} {$ response ->getReasonPhrase ()}\r\n" ;
439+ $ statusCode = $ response ->getStatusCode ();
440+ $ reasonPhrase = $ response ->getReasonPhrase ();
441+
442+ $ headerData = "Status: {$ statusCode } {$ reasonPhrase }\r\n" ;
429443
430444 foreach ($ response ->getHeaders () as $ name => $ values ) {
431445 $ headerData .= $ name .': ' .implode (', ' , $ values )."\r\n" ;
@@ -434,8 +448,25 @@ protected function sendResponse($requestId, ResponseInterface $response)
434448 $ headerData .= "\r\n" ;
435449
436450 $ this ->writeResponse ($ requestId , $ headerData , $ response ->getBody ());
451+ }
437452
438- $ this ->writeRecord ($ requestId , DaemonInterface::FCGI_STDOUT );
439- $ this ->endRequest ($ requestId );
453+ /**
454+ * Send a HttpFoundation response to the client.
455+ *
456+ * @param int $requestId The request id to respond to
457+ * @param HttpFoundationResponse $response The HTTP foundation response message
458+ */
459+ protected function sendHttpFoundationResponse ($ requestId , HttpFoundationResponse $ response )
460+ {
461+ $ statusCode = $ response ->getStatusCode ();
462+
463+ $ headerData = "Status: {$ statusCode }\r\n" ;
464+ $ headerData .= $ response ->headers . "\r\n" ;
465+
466+ $ stream = new Stream ('php://memory ' , 'r+ ' );
467+ $ stream ->write ($ response ->getContent ());
468+ $ stream ->rewind ();
469+
470+ $ this ->writeResponse ($ requestId , $ headerData , $ stream );
440471 }
441472}
0 commit comments