Completed
Push — master ( 497209...b0f934 )
by Oscar
11s
created

Gzip::__invoke()   B

Complexity

Conditions 4
Paths 5

Size

Total Lines 22
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 22
rs 8.9197
c 0
b 0
f 0
cc 4
eloc 13
nc 5
nop 3
1
<?php
2
3
namespace Psr7Middlewares\Middleware;
4
5
use Psr7Middlewares\Utils;
6
use Psr7Middlewares\Transformers;
7
use Psr\Http\Message\ServerRequestInterface;
8
use Psr\Http\Message\ResponseInterface;
9
use RuntimeException;
10
11
/**
12
 * Middleware to gzip encode the response body.
13
 */
14
class Gzip
15
{
16
    use Utils\ResolverTrait;
17
    use Utils\AttributeTrait;
18
    use Utils\StreamTrait;
19
20
    /**
21
     * Execute the middleware.
22
     *
23
     * @param ServerRequestInterface $request
24
     * @param ResponseInterface      $response
25
     * @param callable               $next
26
     *
27
     * @return ResponseInterface
28
     */
29
    public function __invoke(ServerRequestInterface $request, ResponseInterface $response, callable $next)
30
    {
31
        if (!self::hasAttribute($request, EncodingNegotiator::KEY)) {
32
            throw new RuntimeException('Gzip middleware needs EncodingNegotiator executed before');
33
        }
34
35
        $response = $next($request, $response);
36
37
        $resolver = $this->resolver ?: new Transformers\Encoder();
38
        $encoding = EncodingNegotiator::getEncoding($request);
39
        $transformer = $resolver->resolve($encoding);
40
41
        if ($transformer) {
42
            $body = $response->getBody();
43
            
44
            return $response
45
                ->withHeader('Content-Encoding', $encoding)
46
                ->withBody($transformer($body, self::createStream($body)));
47
        }
48
49
        return $response;
50
    }
51
}
52