55
66use DebugBar \JavascriptRenderer as DebugBarRenderer ;
77use Psr \Http \Message \MessageInterface ;
8- use Psr \Http \Message \ResponseInterface ;
9- use Psr \Http \Message \ServerRequestInterface ;
8+ use Psr \Http \Message \ResponseInterface as Response ;
9+ use Psr \Http \Message \ServerRequestInterface as ServerRequest ;
1010use Psr \Http \Message \UriInterface ;
1111use Psr \Http \Server \MiddlewareInterface ;
12- use Psr \Http \Server \RequestHandlerInterface ;
13- use Slim \Http \Uri ;
14- use Zend \Diactoros \Response ;
12+ use Psr \Http \Server \RequestHandlerInterface as RequestHandler ;
13+ use Slim \Http \Uri as SlimUri ;
14+ use Zend \Diactoros \Response as DiactorosResponse ;
1515use Zend \Diactoros \Response \HtmlResponse ;
1616use Zend \Diactoros \Response \Serializer ;
1717use Zend \Diactoros \Stream ;
2323 */
2424final class PhpDebugBarMiddleware implements MiddlewareInterface
2525{
26+ public const FORCE_KEY = 'X-Enable-Debug-Bar ' ;
27+
2628 protected $ debugBarRenderer ;
2729
2830 public function __construct (DebugBarRenderer $ debugbarRenderer )
@@ -33,15 +35,21 @@ public function __construct(DebugBarRenderer $debugbarRenderer)
3335 /**
3436 * @inheritDoc
3537 */
36- public function process (ServerRequestInterface $ request , RequestHandlerInterface $ handler ): ResponseInterface
38+ public function process (ServerRequest $ request , RequestHandler $ handler ): Response
3739 {
3840 if ($ staticFile = $ this ->getStaticFile ($ request ->getUri ())) {
3941 return $ staticFile ;
4042 }
4143
4244 $ response = $ handler ->handle ($ request );
4345
44- if (!$ this ->isHtmlAccepted ($ request )) {
46+ $ forceHeaderValue = $ request ->getHeaderLine (self ::FORCE_KEY );
47+ $ forceCookieValue = $ request ->getCookieParams ()[self ::FORCE_KEY ] ?? '' ;
48+ $ forceAttibuteValue = $ request ->getAttribute (self ::FORCE_KEY , '' );
49+ $ isForceEnable = in_array ('true ' , [$ forceHeaderValue , $ forceCookieValue , $ forceAttibuteValue ], true );
50+ $ isForceDisable = in_array ('false ' , [$ forceHeaderValue , $ forceCookieValue , $ forceAttibuteValue ], true );
51+
52+ if ($ isForceDisable || (!$ isForceEnable && ($ this ->isRedirect ($ response ) || !$ this ->isHtmlAccepted ($ request )))) {
4553 return $ response ;
4654 }
4755
@@ -51,30 +59,27 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface
5159 return $ this ->prepareHtmlResponseWithDebugBar ($ response );
5260 }
5361
54- public function __invoke (ServerRequestInterface $ request , ResponseInterface $ response , callable $ next ): ResponseInterface
62+ public function __invoke (ServerRequest $ request , Response $ response , callable $ next ): Response
5563 {
56- $ handler = new class ($ next , $ response ) implements RequestHandlerInterface {
64+ $ handler = new class ($ next , $ response ) implements RequestHandler {
5765 private $ next ;
5866 private $ response ;
5967
60- public function __construct (callable $ next , ResponseInterface $ response )
68+ public function __construct (callable $ next , Response $ response )
6169 {
6270 $ this ->next = $ next ;
6371 $ this ->response = $ response ;
6472 }
6573
66- public function handle (ServerRequestInterface $ request ): ResponseInterface
74+ public function handle (ServerRequest $ request ): Response
6775 {
6876 return ($ this ->next )($ request , $ this ->response );
6977 }
7078 };
7179 return $ this ->process ($ request , $ handler );
7280 }
7381
74- /**
75- * @return HtmlResponse
76- */
77- private function prepareHtmlResponseWithDebugBar (ResponseInterface $ response )
82+ private function prepareHtmlResponseWithDebugBar (Response $ response ): HtmlResponse
7883 {
7984 $ head = $ this ->debugBarRenderer ->renderHead ();
8085 $ body = $ this ->debugBarRenderer ->render ();
@@ -86,10 +91,7 @@ private function prepareHtmlResponseWithDebugBar(ResponseInterface $response)
8691 return new HtmlResponse ($ result );
8792 }
8893
89- /**
90- * @return ResponseInterface
91- */
92- private function attachDebugBarToResponse (ResponseInterface $ response )
94+ private function attachDebugBarToResponse (Response $ response ): Response
9395 {
9496 $ head = $ this ->debugBarRenderer ->renderHead ();
9597 $ body = $ this ->debugBarRenderer ->render ();
@@ -103,42 +105,34 @@ private function attachDebugBarToResponse(ResponseInterface $response)
103105 return $ response ;
104106 }
105107
106- /**
107- * @return ResponseInterface|null
108- */
109- private function getStaticFile (UriInterface $ uri )
108+ private function getStaticFile (UriInterface $ uri ): ?Response
110109 {
111110 $ path = $ this ->extractPath ($ uri );
112111
113112 if (strpos ($ path , $ this ->debugBarRenderer ->getBaseUrl ()) !== 0 ) {
114- return ;
113+ return null ;
115114 }
116115
117116 $ pathToFile = substr ($ path , strlen ($ this ->debugBarRenderer ->getBaseUrl ()));
118117
119118 $ fullPathToFile = $ this ->debugBarRenderer ->getBasePath () . $ pathToFile ;
120119
121120 if (!file_exists ($ fullPathToFile )) {
122- return ;
121+ return null ;
123122 }
124123
125124 $ contentType = $ this ->getContentTypeByFileName ($ fullPathToFile );
126125 $ stream = new Stream ($ fullPathToFile , 'r ' );
127126
128- return new Response ($ stream , 200 , [
127+ return new DiactorosResponse ($ stream , 200 , [
129128 'Content-type ' => $ contentType ,
130129 ]);
131130 }
132131
133- /**
134- * @param UriInterface $uri
135- *
136- * @return string
137- */
138- private function extractPath (UriInterface $ uri )
132+ private function extractPath (UriInterface $ uri ): string
139133 {
140134 // Slim3 compatibility
141- if ($ uri instanceof Uri ) {
135+ if ($ uri instanceof SlimUri ) {
142136 $ basePath = $ uri ->getBasePath ();
143137 if (!empty ($ basePath )) {
144138 return $ basePath ;
@@ -147,12 +141,7 @@ private function extractPath(UriInterface $uri)
147141 return $ uri ->getPath ();
148142 }
149143
150- /**
151- * @param string $filename
152- *
153- * @return string
154- */
155- private function getContentTypeByFileName ($ filename )
144+ private function getContentTypeByFileName (string $ filename ): string
156145 {
157146 $ ext = pathinfo ($ filename , PATHINFO_EXTENSION );
158147
@@ -170,35 +159,25 @@ private function getContentTypeByFileName($filename)
170159 return isset ($ map [$ ext ]) ? $ map [$ ext ] : 'text/plain ' ;
171160 }
172161
173- /**
174- * @param ResponseInterface $response
175- *
176- * @return bool
177- */
178- private function isHtmlResponse (ResponseInterface $ response )
162+ private function isHtmlResponse (Response $ response ): bool
179163 {
180164 return $ this ->hasHeaderContains ($ response , 'Content-Type ' , 'text/html ' );
181165 }
182166
183- /**
184- * @param ServerRequestInterface $request
185- *
186- * @return bool
187- */
188- private function isHtmlAccepted (ServerRequestInterface $ request )
167+ private function isHtmlAccepted (ServerRequest $ request ): bool
189168 {
190169 return $ this ->hasHeaderContains ($ request , 'Accept ' , 'text/html ' );
191170 }
192171
193- /**
194- * @param MessageInterface $message
195- * @param string $headerName
196- * @param string $value
197- *
198- * @return bool
199- */
200- private function hasHeaderContains (MessageInterface $ message , $ headerName , $ value )
172+ private function hasHeaderContains (MessageInterface $ message , string $ headerName , string $ value ): bool
201173 {
202174 return strpos ($ message ->getHeaderLine ($ headerName ), $ value ) !== false ;
203175 }
176+
177+ private function isRedirect (Response $ response ): bool
178+ {
179+ $ statusCode = $ response ->getStatusCode ();
180+
181+ return ($ statusCode >= 300 || $ statusCode < 400 ) && $ response ->getHeaderLine ('Location ' ) !== '' ;
182+ }
204183}
0 commit comments