Dumper::headerToBinary()   B
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 25
Code Lines 18

Duplication

Lines 0
Ratio 0 %
Metric Value
dl 0
loc 25
rs 8.8571
cc 1
eloc 18
nc 1
nop 1
1
<?php
2
3
namespace Thruster\Component\Dns;
4
5
/**
6
 * Class Dumper
7
 *
8
 * @package Thruster\Component\Dns
9
 * @author  Aurimas Niekis <[email protected]>
10
 */
11
class Dumper
12
{
13
    public function toBinary(Message $message) : string
14
    {
15
        $data = '';
16
17
        $data .= $this->headerToBinary($message->header);
18
        $data .= $this->questionToBinary($message->questions);
19
20
        return $data;
21
    }
22
23
    private function headerToBinary(HeaderBag $header) : string
24
    {
25
        $data = '';
26
27
        $data .= pack('n', $header->get('id'));
28
29
        $flags = 0x00;
30
        $flags = ($flags << 1) | $header->get('qr');
31
        $flags = ($flags << 4) | $header->get('opcode');
32
        $flags = ($flags << 1) | $header->get('aa');
33
        $flags = ($flags << 1) | $header->get('tc');
34
        $flags = ($flags << 1) | $header->get('rd');
35
        $flags = ($flags << 1) | $header->get('ra');
36
        $flags = ($flags << 3) | $header->get('z');
37
        $flags = ($flags << 4) | $header->get('rcode');
38
39
        $data .= pack('n', $flags);
40
41
        $data .= pack('n', $header->get('qdCount'));
42
        $data .= pack('n', $header->get('anCount'));
43
        $data .= pack('n', $header->get('nsCount'));
44
        $data .= pack('n', $header->get('arCount'));
45
46
        return $data;
47
    }
48
49
    private function questionToBinary(array $questions) : string
50
    {
51
        $data = '';
52
53
        /** @var Query $question */
54
        foreach ($questions as $question) {
55
            $labels = explode('.', $question->getName());
56
            foreach ($labels as $label) {
57
                $data .= chr(strlen($label)).$label;
58
            }
59
            $data .= "\x00";
60
61
            $data .= pack('n*', $question->getType(), $question->getClass());
62
        }
63
64
        return $data;
65
    }
66
}
67