/
MiddlewareApplication.php
74 lines (61 loc) · 1.82 KB
/
MiddlewareApplication.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<?php declare(strict_types = 1);
namespace Contributte\Middlewares\Application;
use Contributte\Psr7\Psr7ResponseFactory;
use Contributte\Psr7\Psr7ServerRequestFactory;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
class MiddlewareApplication extends AbstractApplication
{
private const UNIQUE_HEADERS = [
'content-type',
];
protected function createInitialRequest(): ServerRequestInterface
{
return Psr7ServerRequestFactory::fromGlobal();
}
protected function createInitialResponse(): ResponseInterface
{
return Psr7ResponseFactory::fromGlobal();
}
protected function finalize(ServerRequestInterface $request, ResponseInterface $response): ResponseInterface
{
$this->sendStatus($response);
$this->sendHeaders($response);
$this->sendBody($response);
return $response;
}
protected function sendStatus(ResponseInterface $response): void
{
$version = $response->getProtocolVersion();
$status = $response->getStatusCode();
$phrase = $response->getReasonPhrase();
header(sprintf('HTTP/%s %s %s', $version, $status, $phrase));
}
protected function sendHeaders(ResponseInterface $response): void
{
foreach ($response->getHeaders() as $name => $values) {
$this->sendHeader($name, $values);
}
}
/**
* @param string[] $values
*/
protected function sendHeader(string $name, array $values): void
{
$name = str_replace('-', ' ', $name);
$name = ucwords($name);
$name = str_replace(' ', '-', $name);
$replace = in_array(strtolower($name), self::UNIQUE_HEADERS, true) ? true : false;
foreach ($values as $value) {
header(sprintf('%s: %s', $name, $value), $replace);
}
}
protected function sendBody(ResponseInterface $response): void
{
$stream = $response->getBody();
$stream->rewind();
while (!$stream->eof()) {
echo $stream->read(8192);
}
}
}