Skip to content

Commit 1a3fd92

Browse files
committed
[Dns] Partial parseAnswer implementation
1 parent 09d3eb4 commit 1a3fd92

1 file changed

Lines changed: 62 additions & 2 deletions

File tree

Parser.php

Lines changed: 62 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@ public function parseChunk($data, Message $message)
2424
return;
2525
}
2626
}
27+
28+
if ($message->header['anCount'] != count($message->answer)) {
29+
if (!$this->parseAnswer($message)) {
30+
return;
31+
}
32+
}
2733
}
2834

2935
private function parseHeader(Message $message)
@@ -81,10 +87,14 @@ private function parseQuestion(Message $message)
8187
}
8288
}
8389

90+
if (strlen($message->data) - $consumed < 4) {
91+
return;
92+
}
93+
8494
list($type, $class) = array_merge(unpack('n*', substr($message->data, $consumed, 4)));
8595
$consumed += 4;
8696

87-
$message->data = substr($message->data, 0, $consumed);
97+
$message->data = substr($message->data, $consumed) ?: '';
8898

8999
$message->question[] = array(
90100
'name' => implode('.', $labels),
@@ -99,7 +109,57 @@ private function parseQuestion(Message $message)
99109
return $message;
100110
}
101111

102-
public function toBinary(Message $message)
112+
private function parseAnswer(Message $message)
103113
{
114+
if (strlen($message->data) < 2) {
115+
return;
116+
}
117+
118+
$consumed = 0;
119+
120+
$length = ord(substr($message->data, $consumed, 1));
121+
$consumed += 1;
122+
123+
if ($length === 192) {
124+
$labels[] = '@';
125+
$consumed += 3;
126+
} else {
127+
while ($length !== 0) {
128+
$labels[] = substr($message->data, $consumed, $length);
129+
$consumed += $length;
130+
131+
$length = ord(substr($message->data, $consumed, 1));
132+
$consumed += 1;
133+
134+
if (strlen($message->data) - $consumed < $length) {
135+
return;
136+
}
137+
}
138+
}
139+
140+
if (strlen($message->data) - $consumed < 10) {
141+
return;
142+
}
143+
144+
list($type, $class) = array_merge(unpack('n*', substr($message->data, $consumed, 4)));
145+
$consumed += 4;
146+
147+
list($ttl) = array_merge(unpack('l', substr($message->data, $consumed, 4)));
148+
$consumed += 4;
149+
150+
list($rdLength) = array_merge(unpack('n', substr($message->data, $consumed, 2)));
151+
$consumed += 2;
152+
153+
$message->data = substr($message->data, $consumed) ?: '';
154+
155+
$record = new Record();
156+
$record->name = implode('.', $labels);
157+
$record->type = $type;
158+
$record->class = $class;
159+
$record->ttl = $ttl;
160+
161+
$message->answer[] = $record;
162+
163+
return $message;
104164
}
105165
}

0 commit comments

Comments
 (0)