AltSvcFrame   A
last analyzed

Complexity

Total Complexity 9

Size/Duplication

Total Lines 96
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 9
lcom 1
cbo 2
dl 0
loc 96
ccs 26
cts 26
cp 1
rs 10
c 0
b 0
f 0

7 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 6 1
A serializeBody() 0 5 1
A parseBody() 0 17 3
A setOrigin() 0 6 1
A getOrigin() 0 4 1
A setField() 0 6 1
A getField() 0 4 1
1
<?php
2
declare(strict_types=1);
3
namespace Hyphper\Frame;
4
5
use Hyphper\Frame\Exception\InvalidFrameException;
6
7
/**
8
 * The ALTSVC frame is used to advertise alternate services that the current
9
 * host, or a different one, can understand. This frame is standardised as
10
 * part of RFC 7838.
11
 *
12
 * This frame does no work to validate that the ALTSVC field parameter is
13
 * acceptable per the rules of RFC 7838.
14
 *
15
 * note: If the stream_id of this frame is nonzero, the origin field
16
 * must have zero length. Conversely, if the stream_id of this
17
 * frame is zero, the origin field must have nonzero length. Put
18
 * another way, a valid ALTSVC frame has stream_id != 0 XOR
19
 * strlen(origin) != 0.
20
 *
21
 * @package Hyphper\Frame
22
 */
23
class AltSvcFrame extends \Hyphper\Frame
24
{
25
    protected $defined_flags = [];
26
    protected $type = 0xA;
27
    protected $stream_association = self::EITHER_STREAM;
28
    protected $origin;
29
    protected $field;
30
31
    /**
32
     * AltSvcFrame constructor.
33
     *
34
     * @param array $options
35
     */
36 6
    public function __construct(array $options = [])
37
    {
38 6
        parent::__construct($options);
39 6
        $this->origin = $options['origin'] ?? '';
40 6
        $this->field = $options['field'] ?? '';
41 6
    }
42
43
    /**
44
     * @return string
45
     */
46 4
    public function serializeBody(): string
47
    {
48 4
        $origin_len = pack('n', strlen($this->origin));
49 4
        return $origin_len . $this->origin . $this->field;
50
    }
51
52
    /**
53
     * Given the body of a frame, parses it into frame data. This populates
54
     * the non-header parts of the frame: that is, it does not populate the
55
     * stream ID or flags.
56
     *
57
     *
58
     * @param string $data
59
     * @return void
60
     */
61 2
    public function parseBody(string $data)
62
    {
63 2
        if (!$unpack = @unpack('norigin_length', substr($data, 0, 2))) {
64
            throw new InvalidFrameException('Invalid ALTSVC frame body.');
65
        }
66 2
        $origin_length = $unpack['origin_length'];
67
68 2
        $this->origin = substr($data, 2, $origin_length);
69
70 2
        if (strlen($this->origin) != $origin_length) {
71
            throw new InvalidFrameException('Invalid ALTSVC frame body.');
72
        }
73
74 2
        $this->field = substr($data, 2 + $origin_length);
75
76 2
        $this->body_len = strlen($data);
77 2
    }
78
79
    /**
80
     * @param mixed|string $origin
81
     *
82
     * @return AltSvcFrame
83
     */
84 2
    public function setOrigin($origin)
85
    {
86 2
        $this->origin = $origin;
87
88 2
        return $this;
89
    }
90
91
    /**
92
     * @return mixed|string
93
     */
94 1
    public function getOrigin()
95
    {
96 1
        return $this->origin;
97
    }
98
99
    /**
100
     * @param mixed|string $field
101
     *
102
     * @return AltSvcFrame
103
     */
104 2
    public function setField($field)
105
    {
106 2
        $this->field = $field;
107
108 2
        return $this;
109
    }
110
111
    /**
112
     * @return mixed|string
113
     */
114 1
    public function getField()
115
    {
116 1
        return $this->field;
117
    }
118
}
119