Passed
Push — master ( e3c5be...0313ed )
by Aleksei
01:53
created

BucketStreamMiddleware::addHeaderList()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 2

Importance

Changes 0
Metric Value
cc 2
eloc 3
c 0
b 0
f 0
nc 2
nop 2
dl 0
loc 6
ccs 4
cts 4
cp 1
crap 2
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
namespace roxblnfk\SmartStream\Middleware;
6
7
use Psr\Http\Message\ResponseInterface;
8
use Psr\Http\Message\ServerRequestInterface;
9
use Psr\Http\Message\StreamFactoryInterface;
10
use Psr\Http\Message\StreamInterface;
11
use Psr\Http\Server\MiddlewareInterface;
12
use Psr\Http\Server\RequestHandlerInterface;
13
use roxblnfk\SmartStream\Stream\BucketStream;
14
use Yiisoft\Http\Header;
15
16
final class BucketStreamMiddleware implements MiddlewareInterface
17
{
18
    private StreamFactoryInterface $streamFactory;
19
20 5
    public function __construct(StreamFactoryInterface $streamFactory)
21
    {
22 5
        $this->streamFactory = $streamFactory;
23 5
    }
24
25 5
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
26
    {
27 5
        $response = $handler->handle($request);
28 5
        $stream = $response->getBody();
29 5
        if (!$stream instanceof BucketStream) {
30 1
            return $response;
31
        }
32
33 4
        $bucket = $stream->getBucket();
34
35
        // Bucket has been detached
36 4
        if ($bucket === null) {
37 1
            return $stream->isReadable() ? $response : $response->withBody($this->streamFactory->createStream(''));
38
        }
39
40 3
        if (!$stream->hasConverter() && !$bucket->isConvertable() && !$stream->isReadable()) {
41 1
            $response = $response->withBody($this->createReadableStream($bucket->getData()));
42
        }
43
44
        // Set MIME type
45 3
        $matching = $stream->getMatchedResult();
46 3
        if ($matching !== null && $matching->getMimeType() !== null) {
47 2
            $response = $response->withHeader(Header::CONTENT_TYPE, $matching->getMimeType());
48
        }
49
50
        // Update request
51 3
        if ($bucket->getStatusCode() !== null) {
52 1
            $response = $response->withStatus($bucket->getStatusCode());
53
        }
54 3
        return $this->addHeaderList($response, $bucket->getHeaders());
55
    }
56
57 3
    private function addHeaderList(ResponseInterface $response, array $headers): ResponseInterface
58
    {
59 3
        foreach ($headers as $header => $value) {
60 3
            $response = $response->withHeader($header, $value);
61
        }
62 3
        return $response;
63
    }
64 1
    private function createReadableStream($data): StreamInterface
65
    {
66 1
        if ($data instanceof \SplFileInfo) {
67
            return $this->streamFactory->createStreamFromFile($data->getRealPath());
68
        }
69 1
        if (is_resource($data)) {
70
            return $this->streamFactory->createStreamFromResource($data);
71
        }
72 1
        return $this->streamFactory->createStream(is_string($data) ? $data : '');
73
    }
74
}
75