Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
80.95% covered (warning)
80.95%
17 / 21
50.00% covered (danger)
50.00%
1 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
RequestSizeLimitMiddleware
80.95% covered (warning)
80.95%
17 / 21
50.00% covered (danger)
50.00%
1 / 2
5.17
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
77.78% covered (warning)
77.78%
14 / 18
0.00% covered (danger)
0.00%
0 / 1
4.18
1<?php
2
3declare(strict_types=1);
4
5namespace BO\Zmscitizenapi\Middleware;
6
7use BO\Zmscitizenapi\Localization\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                $language = $request->getAttribute('language');
38                $response = $response->withStatus(ErrorMessages::get(self::ERROR_TOO_LARGE, $language)['statusCode'])
39                    ->withHeader('Content-Type', 'application/json');
40                $response->getBody()->write(json_encode([
41                    'errors' => [ErrorMessages::get(self::ERROR_TOO_LARGE, $language)]
42                ]));
43                return $response;
44            }
45
46            return $handler->handle($request);
47        } catch (\Throwable $e) {
48            $this->logger->logError($e, $request);
49            throw $e;
50        }
51    }
52}