|
5 | 5 |
|
6 | 6 | use DebugBar\JavascriptRenderer as DebugBarRenderer;
|
7 | 7 | use Psr\Http\Message\MessageInterface;
|
| 8 | +use Psr\Http\Message\ResponseFactoryInterface; |
8 | 9 | use Psr\Http\Message\ResponseInterface as Response;
|
9 | 10 | use Psr\Http\Message\ServerRequestInterface as ServerRequest;
|
| 11 | +use Psr\Http\Message\StreamFactoryInterface; |
10 | 12 | use Psr\Http\Message\UriInterface;
|
11 | 13 | use Psr\Http\Server\MiddlewareInterface;
|
12 | 14 | use Psr\Http\Server\RequestHandlerInterface as RequestHandler;
|
13 | 15 | use Slim\Http\Uri as SlimUri;
|
14 |
| -use Zend\Diactoros\Response as DiactorosResponse; |
15 |
| -use Zend\Diactoros\Response\HtmlResponse; |
16 |
| -use Zend\Diactoros\Response\Serializer; |
17 |
| -use Zend\Diactoros\Stream; |
18 | 16 |
|
19 | 17 | /**
|
20 |
| - * PhpDebugBarMiddleware |
21 |
| - * |
22 | 18 | * @author Witold Wasiczko <[email protected]>
|
23 | 19 | */
|
24 | 20 | final class PhpDebugBarMiddleware implements MiddlewareInterface
|
25 | 21 | {
|
26 | 22 | public const FORCE_KEY = 'X-Enable-Debug-Bar';
|
27 | 23 |
|
28 |
| - protected $debugBarRenderer; |
| 24 | + private $debugBarRenderer; |
| 25 | + private $responseFactory; |
| 26 | + private $streamFactory; |
29 | 27 |
|
30 |
| - public function __construct(DebugBarRenderer $debugbarRenderer) |
31 |
| - { |
| 28 | + public function __construct( |
| 29 | + DebugBarRenderer $debugbarRenderer, |
| 30 | + ResponseFactoryInterface $responseFactory, |
| 31 | + StreamFactoryInterface $streamFactory |
| 32 | + ) { |
32 | 33 | $this->debugBarRenderer = $debugbarRenderer;
|
| 34 | + $this->responseFactory = $responseFactory; |
| 35 | + $this->streamFactory = $streamFactory; |
33 | 36 | }
|
34 | 37 |
|
35 | 38 | /**
|
@@ -79,16 +82,20 @@ public function handle(ServerRequest $request): Response
|
79 | 82 | return $this->process($request, $handler);
|
80 | 83 | }
|
81 | 84 |
|
82 |
| - private function prepareHtmlResponseWithDebugBar(Response $response): HtmlResponse |
| 85 | + private function prepareHtmlResponseWithDebugBar(Response $response): Response |
83 | 86 | {
|
84 | 87 | $head = $this->debugBarRenderer->renderHead();
|
85 | 88 | $body = $this->debugBarRenderer->render();
|
86 |
| - $outResponseBody = Serializer::toString($response); |
| 89 | + $outResponseBody = $this->serializeResponse($response); |
87 | 90 | $template = '<html><head>%s</head><body><h1>DebugBar</h1><p>Response:</p><pre>%s</pre>%s</body></html>';
|
88 | 91 | $escapedOutResponseBody = htmlspecialchars($outResponseBody);
|
89 | 92 | $result = sprintf($template, $head, $escapedOutResponseBody, $body);
|
90 | 93 |
|
91 |
| - return new HtmlResponse($result); |
| 94 | + $stream = $this->streamFactory->createStream($result); |
| 95 | + |
| 96 | + return $this->responseFactory->createResponse(200) |
| 97 | + ->withBody($stream) |
| 98 | + ->withAddedHeader('Content-type', 'text/html'); |
92 | 99 | }
|
93 | 100 |
|
94 | 101 | private function attachDebugBarToResponse(Response $response): Response
|
@@ -122,11 +129,11 @@ private function getStaticFile(UriInterface $uri): ?Response
|
122 | 129 | }
|
123 | 130 |
|
124 | 131 | $contentType = $this->getContentTypeByFileName($fullPathToFile);
|
125 |
| - $stream = new Stream($fullPathToFile, 'r'); |
| 132 | + $stream = $this->streamFactory->createStreamFromResource(fopen($fullPathToFile, 'r')); |
126 | 133 |
|
127 |
| - return new DiactorosResponse($stream, 200, [ |
128 |
| - 'Content-type' => $contentType, |
129 |
| - ]); |
| 134 | + return $this->responseFactory->createResponse(200) |
| 135 | + ->withBody($stream) |
| 136 | + ->withAddedHeader('Content-type', $contentType); |
130 | 137 | }
|
131 | 138 |
|
132 | 139 | private function extractPath(UriInterface $uri): string
|
@@ -180,4 +187,47 @@ private function isRedirect(Response $response): bool
|
180 | 187 |
|
181 | 188 | return ($statusCode >= 300 || $statusCode < 400) && $response->getHeaderLine('Location') !== '';
|
182 | 189 | }
|
| 190 | + |
| 191 | + private function serializeResponse(Response $response) : string |
| 192 | + { |
| 193 | + $reasonPhrase = $response->getReasonPhrase(); |
| 194 | + $headers = $this->serializeHeaders($response->getHeaders()); |
| 195 | + $body = (string) $response->getBody(); |
| 196 | + $format = 'HTTP/%s %d%s%s%s'; |
| 197 | + |
| 198 | + if (! empty($headers)) { |
| 199 | + $headers = "\r\n" . $headers; |
| 200 | + } |
| 201 | + |
| 202 | + $headers .= "\r\n\r\n"; |
| 203 | + |
| 204 | + return sprintf( |
| 205 | + $format, |
| 206 | + $response->getProtocolVersion(), |
| 207 | + $response->getStatusCode(), |
| 208 | + ($reasonPhrase ? ' ' . $reasonPhrase : ''), |
| 209 | + $headers, |
| 210 | + $body |
| 211 | + ); |
| 212 | + } |
| 213 | + |
| 214 | + private function serializeHeaders(array $headers) : string |
| 215 | + { |
| 216 | + $lines = []; |
| 217 | + foreach ($headers as $header => $values) { |
| 218 | + $normalized = $this->filterHeader($header); |
| 219 | + foreach ($values as $value) { |
| 220 | + $lines[] = sprintf('%s: %s', $normalized, $value); |
| 221 | + } |
| 222 | + } |
| 223 | + |
| 224 | + return implode("\r\n", $lines); |
| 225 | + } |
| 226 | + |
| 227 | + private function filterHeader(string $header) : string |
| 228 | + { |
| 229 | + $filtered = str_replace('-', ' ', $header); |
| 230 | + $filtered = ucwords($filtered); |
| 231 | + return str_replace(' ', '-', $filtered); |
| 232 | + } |
183 | 233 | }
|
0 commit comments