RequestHandler   A
last analyzed

Complexity

Total Complexity 8

Size/Duplication

Total Lines 54
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 25
c 1
b 0
f 0
dl 0
loc 54
ccs 26
cts 26
cp 1
rs 10
wmc 8

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 3 1
A handle() 0 13 2
A getController() 0 11 3
A withClientId() 0 12 2
1
<?php
2
3
namespace BenTools\MercurePHP\Hub;
4
5
use BenTools\MercurePHP\Controller\AbstractController;
6
use BenTools\MercurePHP\Exception\Http\HttpException;
7
use BenTools\MercurePHP\Exception\Http\NotFoundHttpException;
8
use Psr\Http\Message\ServerRequestInterface;
9
use Ramsey\Uuid\Uuid;
10
use React\Http\Message\Response;
11
use React\Promise\PromiseInterface;
12
13
use function React\Promise\resolve;
14
15
final class RequestHandler
16
{
17
    private const CLIENT_NAMESPACE = '530344d8-a802-11ea-bb37-0242ac130002';
18
19
    private array $controllers;
20 4
21
    public function __construct(array $controllers)
22 4
    {
23 4
        $this->controllers = (fn(AbstractController ...$controllers) => $controllers)(...$controllers);
24
    }
25 7
26
    public function handle(ServerRequestInterface $request): PromiseInterface
27
    {
28 7
        try {
29 7
            $request = $this->withClientId($request);
30
            $handle = $this->getController($request);
31 5
32 5
            return $handle($request);
33 5
        } catch (HttpException $e) {
34 5
            return resolve(
35 5
                new Response(
36 5
                    $e->getStatusCode(),
37
                    ['Content-Type' => 'text/plain'],
38
                    $e->getMessage(),
39
                )
40
            );
41 7
        }
42
    }
43 7
44 7
    private function getController(ServerRequestInterface $request): AbstractController
45 6
    {
46
        foreach ($this->controllers as $controller) {
47
            if (!$controller->matchRequest($request)) {
48 5
                continue;
49
            }
50
51 2
            return $controller;
52
        }
53
54 7
        throw new NotFoundHttpException('Not found.');
55
    }
56 7
57 7
    private function withClientId(ServerRequestInterface $request): ServerRequestInterface
58 7
    {
59 7
        if (null === $request->getAttribute('clientId')) {
60 7
            $serverParams = $request->getServerParams();
61
            $clientId = Uuid::uuid5(
62 7
                self::CLIENT_NAMESPACE,
63
                ($serverParams['REMOTE_ADDR'] ?? '') . ':' . ($serverParams['REMOTE_PORT'] ?? '')
64
            );
65 7
            $request = $request->withAttribute('clientId', $clientId);
66
        }
67
68
        return $request;
69
    }
70
}
71