Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
80.00% covered (warning)
80.00%
16 / 20
50.00% covered (danger)
50.00%
1 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
RequestSizeLimitMiddleware
80.00% covered (warning)
80.00%
16 / 20
50.00% covered (danger)
50.00%
1 / 2
5.20
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 process
76.47% covered (warning)
76.47%
13 / 17
0.00% covered (danger)
0.00%
0 / 1
4.21
1<?php
2
3declare(strict_types=1);
4
5namespace BO\Zmscitizenapi\Middleware;
6
7use BO\Zmscitizenapi\Utils\ErrorMessages;
8use BO\Zmscitizenapi\Services\Core\LoggerService;
9use Psr\Http\Message\ResponseInterface;
10use Psr\Http\Message\ServerRequestInterface;
11use Psr\Http\Server\MiddlewareInterface;
12use Psr\Http\Server\RequestHandlerInterface;
13
14class RequestSizeLimitMiddleware implements MiddlewareInterface
15{
16    private const ERROR_TOO_LARGE = 'requestEntityTooLarge';
17    private int $maxSize;
18    private LoggerService $logger;
19    public function __construct(LoggerService $logger)
20    {
21        $this->logger = $logger;
22        $config = \App::getRequestLimits();
23        $this->maxSize = $config['maxSize'];
24    }
25
26    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
27    {
28        try {
29            $contentLength = $request->getHeaderLine('Content-Length');
30            if ($contentLength === '') {
31                return $handler->handle($request);
32            }
33            $contentLength = (int)$contentLength;
34            if ($contentLength > $this->maxSize) {
35                $this->logger->logInfo(sprintf('Request too large: %d bytes. URI: %s', $contentLength, $request->getUri()));
36                $response = \App::$slim->getResponseFactory()->createResponse();
37                $response = $response->withStatus(ErrorMessages::get(self::ERROR_TOO_LARGE)['statusCode'])
38                    ->withHeader('Content-Type', 'application/json');
39                $response->getBody()->write(json_encode([
40                    'errors' => [ErrorMessages::get(self::ERROR_TOO_LARGE)]
41                ]));
42                return $response;
43            }
44
45            return $handler->handle($request);
46        } catch (\Throwable $e) {
47            $this->logger->logError($e, $request);
48            throw $e;
49        }
50    }
51}