CachedExecutor::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %
Metric Value
dl 0
loc 5
rs 9.4285
cc 1
eloc 3
nc 1
nop 2
1
<?php
2
3
namespace Thruster\Component\Dns;
4
5
use Thruster\Component\Promise\PromiseInterface;
6
7
/**
8
 * Class CachedExecutor
9
 *
10
 * @package Thruster\Component\Dns
11
 * @author  Aurimas Niekis <[email protected]>
12
 */
13
class CachedExecutor implements ExecutorInterface
14
{
15
    /**
16
     * @var ExecutorInterface
17
     */
18
    private $executor;
19
20
    /**
21
     * @var RecordCache
22
     */
23
    private $cache;
24
25
    public function __construct(ExecutorInterface $executor, RecordCache $cache)
26
    {
27
        $this->executor = $executor;
28
        $this->cache = $cache;
29
    }
30
31
    public function query(string $nameServer, Query $query) : PromiseInterface
32
    {
33
        return $this->cache
34
            ->lookup($query)
35
            ->then(
36
                function ($cachedRecords) use ($query) {
37
                    return $this->buildResponse($query, $cachedRecords);
38
                },
39
                function () use ($nameServer, $query) {
40
                    return $this->executor
41
                        ->query($nameServer, $query)
42
                        ->then(function ($response) use ($query) {
43
                            $this->cache->storeResponseMessage($query->getCurrentTime(), $response);
44
45
                            return $response;
46
                        });
47
                }
48
            );
49
    }
50
51
    private function buildResponse(Query $query, array $cachedRecords) : Message
52
    {
53
        $response = new Message();
54
55
        $response->header->set('id', $this->generateId());
56
        $response->header->set('qr', 1);
57
        $response->header->set('opcode', Message::OPCODE_QUERY);
58
        $response->header->set('rd', 1);
59
        $response->header->set('rcode', Message::RCODE_OK);
60
61
        $response->questions[] = new Record($query->getName(), $query->getType(), $query->getClass());
62
63
        foreach ($cachedRecords as $record) {
64
            $response->answers[] = $record;
65
        }
66
67
        $response->prepare();
68
69
        return $response;
70
    }
71
72
    private function generateId() : int
73
    {
74
        return mt_rand(0, 0xffff);
75
    }
76
}
77