1 | <?php |
||
15 | class MarkerFramePicker extends AbstractFramePicker |
||
16 | { |
||
17 | /** |
||
18 | * Frame start byte sequence or null |
||
19 | * |
||
20 | * @var string|null |
||
21 | */ |
||
22 | private $startMarker; |
||
23 | |||
24 | /** |
||
25 | * Frame end marker |
||
26 | * |
||
27 | * @var string |
||
28 | */ |
||
29 | private $endMarker; |
||
30 | |||
31 | /** |
||
32 | * Offset to search for end marker during data handling |
||
33 | * |
||
34 | * @var int |
||
35 | */ |
||
36 | private $startPos; |
||
37 | |||
38 | /** |
||
39 | * bool |
||
40 | * |
||
41 | * @var bool |
||
42 | */ |
||
43 | private $isCaseSensitive; |
||
44 | |||
45 | /** |
||
46 | * MarkerFramePicker constructor. |
||
47 | * |
||
48 | * @param null|string $startMarker Start marker |
||
49 | * @param string $endMarker End marker |
||
50 | * @param bool $isCaseSensitive True, if case is important |
||
51 | */ |
||
52 | 30 | public function __construct($startMarker, $endMarker, $isCaseSensitive = true) |
|
53 | { |
||
54 | 30 | parent::__construct(); |
|
55 | 30 | $this->startMarker = $startMarker; |
|
56 | 30 | $this->endMarker = $endMarker; |
|
57 | 30 | $this->isCaseSensitive = $isCaseSensitive; |
|
58 | 30 | } |
|
59 | |||
60 | /** |
||
61 | * Find start of data in frame |
||
62 | * |
||
63 | * @param string $buffer Collected data for frame |
||
64 | * |
||
65 | * @return bool True if start of frame is found |
||
66 | */ |
||
67 | 29 | protected function resolveStartOfFrame($buffer) |
|
86 | |||
87 | /** {@inheritdoc} */ |
||
88 | 29 | protected function doHandleData($chunk, $remoteAddress, &$buffer) |
|
89 | { |
||
90 | 29 | $buffer .= $chunk; |
|
91 | 29 | if (!$this->resolveStartOfFrame($buffer)) { |
|
92 | 8 | return ''; |
|
93 | } |
||
94 | |||
95 | 23 | $pos = $this->findMarker($buffer, $this->endMarker, $this->startPos + strlen($this->startMarker)); |
|
96 | 23 | if ($pos === false) { |
|
97 | 12 | return ''; |
|
98 | } |
||
99 | |||
100 | 17 | $this->setFinished(true); |
|
101 | 17 | $result = substr($buffer, $pos + strlen($this->endMarker)); |
|
102 | 17 | $buffer = substr($buffer, $this->startPos, $pos + strlen($this->endMarker) - $this->startPos); |
|
103 | 17 | return $result !== false ? $result : ''; |
|
104 | } |
||
105 | |||
106 | /** {@inheritdoc} */ |
||
107 | 29 | protected function doCreateFrame($buffer, $remoteAddress) |
|
108 | { |
||
109 | 29 | if ($this->isEof()) { |
|
110 | 17 | return new Frame($buffer, $remoteAddress); |
|
111 | } |
||
112 | |||
113 | 12 | $data = $this->startPos === null ? '' : substr($buffer, $this->startPos); |
|
114 | 12 | return new Frame($data, $remoteAddress); |
|
115 | } |
||
116 | |||
117 | /** |
||
118 | * Performs strpos or stripos according to case sensibility |
||
119 | * |
||
120 | * @param string $haystack Where find text |
||
121 | * @param string $needle What to find |
||
122 | * @param int $offset Start offset in $haystack |
||
123 | * |
||
124 | * @return bool|int |
||
125 | */ |
||
126 | 29 | protected function findMarker($haystack, $needle, $offset = 0) |
|
132 | } |
||
133 |