Skip to content

Commit daca439

Browse files
committed
Remove record counts from header bag and use current count instead
1 parent 7b3f159 commit daca439

8 files changed

Lines changed: 36 additions & 101 deletions

File tree

src/Model/HeaderBag.php

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,6 @@
55
class HeaderBag
66
{
77
public $attributes = array(
8-
'qdCount' => 0,
9-
'anCount' => 0,
10-
'nsCount' => 0,
11-
'arCount' => 0,
128
'qr' => 0,
139
'opcode' => Message::OPCODE_QUERY,
1410
'aa' => 0,
@@ -43,12 +39,4 @@ public function isTruncated()
4339
{
4440
return 1 === $this->attributes['tc'];
4541
}
46-
47-
public function populateCounts(Message $message)
48-
{
49-
$this->attributes['qdCount'] = count($message->questions);
50-
$this->attributes['anCount'] = count($message->answers);
51-
$this->attributes['nsCount'] = count($message->authority);
52-
$this->attributes['arCount'] = count($message->additional);
53-
}
5442
}

src/Model/Message.php

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ public static function createRequestForQuery(Query $query)
4242
$request->header->set('id', self::generateId());
4343
$request->header->set('rd', 1);
4444
$request->questions[] = $query;
45-
$request->prepare();
4645

4746
return $request;
4847
}
@@ -69,8 +68,6 @@ public static function createResponseWithAnswersForQuery(Query $query, array $an
6968
$response->answers[] = $record;
7069
}
7170

72-
$response->prepare();
73-
7471
return $response;
7572
}
7673

@@ -167,9 +164,4 @@ public function getResponseCode()
167164
{
168165
return $this->header->get('rcode');
169166
}
170-
171-
public function prepare()
172-
{
173-
$this->header->populateCounts($this);
174-
}
175167
}

src/Protocol/BinaryDumper.php

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
namespace React\Dns\Protocol;
44

5-
use React\Dns\Model\HeaderBag;
65
use React\Dns\Model\Message;
76
use React\Dns\Model\Record;
87
use React\Dns\Query\Query;
@@ -17,7 +16,7 @@ public function toBinary(Message $message)
1716
{
1817
$data = '';
1918

20-
$data .= $this->headerToBinary($message->header);
19+
$data .= $this->headerToBinary($message);
2120
$data .= $this->questionToBinary($message->questions);
2221
$data .= $this->recordsToBinary($message->answers);
2322
$data .= $this->recordsToBinary($message->authority);
@@ -30,8 +29,9 @@ public function toBinary(Message $message)
3029
* @param Message $message
3130
* @return string
3231
*/
33-
private function headerToBinary(HeaderBag $header)
32+
private function headerToBinary(Message $message)
3433
{
34+
$header = $message->header;
3535
$data = '';
3636

3737
$data .= pack('n', $header->get('id'));
@@ -48,10 +48,10 @@ private function headerToBinary(HeaderBag $header)
4848

4949
$data .= pack('n', $flags);
5050

51-
$data .= pack('n', $header->get('qdCount'));
52-
$data .= pack('n', $header->get('anCount'));
53-
$data .= pack('n', $header->get('nsCount'));
54-
$data .= pack('n', $header->get('arCount'));
51+
$data .= pack('n', count($message->questions));
52+
$data .= pack('n', count($message->answers));
53+
$data .= pack('n', count($message->authority));
54+
$data .= pack('n', count($message->additional));
5555

5656
return $data;
5757
}

src/Protocol/Parser.php

Lines changed: 29 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -39,20 +39,35 @@ public function parseMessage($data)
3939

4040
private function parse($data, Message $message)
4141
{
42-
if (!$message->header->get('id')) {
43-
if (!$this->parseHeader($message)) {
44-
return;
45-
}
42+
if (!isset($message->data[12 - 1])) {
43+
return;
4644
}
4745

48-
if ($message->header->get('qdCount') != count($message->questions)) {
49-
if (!$this->parseQuestion($message)) {
46+
list($id, $fields, $qdCount, $anCount, $nsCount, $arCount) = array_values(unpack('n*', substr($message->data, 0, 12)));
47+
$message->consumed += 12;
48+
49+
$message->header->set('id', $id);
50+
$message->header->set('rcode', $fields & bindec('1111'));
51+
$message->header->set('z', ($fields >> 4) & bindec('111'));
52+
$message->header->set('ra', ($fields >> 7) & 1);
53+
$message->header->set('rd', ($fields >> 8) & 1);
54+
$message->header->set('tc', ($fields >> 9) & 1);
55+
$message->header->set('aa', ($fields >> 10) & 1);
56+
$message->header->set('opcode', ($fields >> 11) & bindec('1111'));
57+
$message->header->set('qr', ($fields >> 15) & 1);
58+
59+
// parse all questions
60+
for ($i = $qdCount; $i > 0; --$i) {
61+
$question = $this->parseQuestion($message);
62+
if ($question === null) {
5063
return;
64+
} else {
65+
$message->questions[] = $question;
5166
}
5267
}
5368

5469
// parse all answer records
55-
for ($i = $message->header->get('anCount'); $i > 0; --$i) {
70+
for ($i = $anCount; $i > 0; --$i) {
5671
$record = $this->parseRecord($message);
5772
if ($record === null) {
5873
return;
@@ -62,7 +77,7 @@ private function parse($data, Message $message)
6277
}
6378

6479
// parse all authority records
65-
for ($i = $message->header->get('nsCount'); $i > 0; --$i) {
80+
for ($i = $nsCount; $i > 0; --$i) {
6681
$record = $this->parseRecord($message);
6782
if ($record === null) {
6883
return;
@@ -72,7 +87,7 @@ private function parse($data, Message $message)
7287
}
7388

7489
// parse all additional records
75-
for ($i = $message->header->get('arCount'); $i > 0; --$i) {
90+
for ($i = $arCount; $i > 0; --$i) {
7691
$record = $this->parseRecord($message);
7792
if ($record === null) {
7893
return;
@@ -84,36 +99,10 @@ private function parse($data, Message $message)
8499
return $message;
85100
}
86101

87-
private function parseHeader(Message $message)
88-
{
89-
if (!isset($message->data[12 - 1])) {
90-
return;
91-
}
92-
93-
$header = substr($message->data, 0, 12);
94-
$message->consumed += 12;
95-
96-
list($id, $fields, $qdCount, $anCount, $nsCount, $arCount) = array_values(unpack('n*', $header));
97-
98-
$rcode = $fields & bindec('1111');
99-
$z = ($fields >> 4) & bindec('111');
100-
$ra = ($fields >> 7) & 1;
101-
$rd = ($fields >> 8) & 1;
102-
$tc = ($fields >> 9) & 1;
103-
$aa = ($fields >> 10) & 1;
104-
$opcode = ($fields >> 11) & bindec('1111');
105-
$qr = ($fields >> 15) & 1;
106-
107-
$vars = compact('id', 'qdCount', 'anCount', 'nsCount', 'arCount',
108-
'qr', 'opcode', 'aa', 'tc', 'rd', 'ra', 'z', 'rcode');
109-
110-
foreach ($vars as $name => $value) {
111-
$message->header->set($name, $value);
112-
}
113-
114-
return $message;
115-
}
116-
102+
/**
103+
* @param Message $message
104+
* @return ?Query
105+
*/
117106
private function parseQuestion(Message $message)
118107
{
119108
$consumed = $message->consumed;
@@ -129,17 +118,11 @@ private function parseQuestion(Message $message)
129118

130119
$message->consumed = $consumed;
131120

132-
$message->questions[] = new Query(
121+
return new Query(
133122
implode('.', $labels),
134123
$type,
135124
$class
136125
);
137-
138-
if ($message->header->get('qdCount') != count($message->questions)) {
139-
return $this->parseQuestion($message);
140-
}
141-
142-
return $message;
143126
}
144127

145128
/**

tests/Protocol/BinaryDumperTest.php

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,6 @@ public function testToBinaryRequestMessage()
2929
Message::CLASS_IN
3030
);
3131

32-
$request->prepare();
33-
3432
$dumper = new BinaryDumper();
3533
$data = $dumper->toBinary($request);
3634
$data = $this->convertBinaryToHexDump($data);
@@ -61,8 +59,6 @@ public function testToBinaryRequestMessageWithCustomOptForEdns0()
6159

6260
$request->additional[] = new Record('', 41, 1000, 0, '');
6361

64-
$request->prepare();
65-
6662
$dumper = new BinaryDumper();
6763
$data = $dumper->toBinary($request);
6864
$data = $this->convertBinaryToHexDump($data);
@@ -90,8 +86,6 @@ public function testToBinaryResponseMessageWithoutRecords()
9086
Message::CLASS_IN
9187
);
9288

93-
$response->prepare();
94-
9589
$dumper = new BinaryDumper();
9690
$data = $dumper->toBinary($response);
9791
$data = $this->convertBinaryToHexDump($data);
@@ -130,7 +124,6 @@ public function testToBinaryForResponseWithSRVRecord()
130124
'port' => 8080,
131125
'target' => 'test'
132126
));
133-
$response->prepare();
134127

135128
$dumper = new BinaryDumper();
136129
$data = $dumper->toBinary($response);
@@ -176,7 +169,6 @@ public function testToBinaryForResponseWithSOARecord()
176169
'expire' => 605800,
177170
'minimum' => 3600
178171
));
179-
$response->prepare();
180172

181173
$dumper = new BinaryDumper();
182174
$data = $dumper->toBinary($response);
@@ -221,7 +213,6 @@ public function testToBinaryForResponseWithMultipleAnswerRecords()
221213
$response->answers[] = new Record('igor.io', Message::TYPE_AAAA, Message::CLASS_IN, 0, '::1');
222214
$response->answers[] = new Record('igor.io', Message::TYPE_TXT, Message::CLASS_IN, 0, array('hello', 'world'));
223215
$response->answers[] = new Record('igor.io', Message::TYPE_MX, Message::CLASS_IN, 0, array('priority' => 0, 'target' => ''));
224-
$response->prepare();
225216

226217
$dumper = new BinaryDumper();
227218
$data = $dumper->toBinary($response);
@@ -258,7 +249,6 @@ public function testToBinaryForResponseWithAnswerAndAdditionalRecord()
258249

259250
$response->answers[] = new Record('igor.io', Message::TYPE_NS, Message::CLASS_IN, 0, 'example.com');
260251
$response->additional[] = new Record('example.com', Message::TYPE_A, Message::CLASS_IN, 0, '127.0.0.1');
261-
$response->prepare();
262252

263253
$dumper = new BinaryDumper();
264254
$data = $dumper->toBinary($response);

tests/Protocol/ParserTest.php

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,6 @@ public function testParseRequest()
4747

4848
$header = $request->header;
4949
$this->assertSame(0x7262, $header->get('id'));
50-
$this->assertSame(1, $header->get('qdCount'));
51-
$this->assertSame(0, $header->get('anCount'));
52-
$this->assertSame(0, $header->get('nsCount'));
53-
$this->assertSame(0, $header->get('arCount'));
5450
$this->assertSame(0, $header->get('qr'));
5551
$this->assertSame(Message::OPCODE_QUERY, $header->get('opcode'));
5652
$this->assertSame(0, $header->get('aa'));
@@ -84,10 +80,6 @@ public function testParseResponse()
8480

8581
$header = $response->header;
8682
$this->assertSame(0x7262, $header->get('id'));
87-
$this->assertSame(1, $header->get('qdCount'));
88-
$this->assertSame(1, $header->get('anCount'));
89-
$this->assertSame(0, $header->get('nsCount'));
90-
$this->assertSame(0, $header->get('arCount'));
9183
$this->assertSame(1, $header->get('qr'));
9284
$this->assertSame(Message::OPCODE_QUERY, $header->get('opcode'));
9385
$this->assertSame(0, $header->get('aa'));
@@ -275,10 +267,6 @@ public function testParseAAAAResponse()
275267

276268
$header = $response->header;
277269
$this->assertSame(0xcd72, $header->get('id'));
278-
$this->assertSame(1, $header->get('qdCount'));
279-
$this->assertSame(1, $header->get('anCount'));
280-
$this->assertSame(0, $header->get('nsCount'));
281-
$this->assertSame(0, $header->get('arCount'));
282270
$this->assertSame(1, $header->get('qr'));
283271
$this->assertSame(Message::OPCODE_QUERY, $header->get('opcode'));
284272
$this->assertSame(0, $header->get('aa'));
@@ -588,10 +576,6 @@ public function testParsePTRResponse()
588576

589577
$header = $response->header;
590578
$this->assertSame(0x5dd8, $header->get('id'));
591-
$this->assertSame(1, $header->get('qdCount'));
592-
$this->assertSame(1, $header->get('anCount'));
593-
$this->assertSame(0, $header->get('nsCount'));
594-
$this->assertSame(0, $header->get('arCount'));
595579
$this->assertSame(1, $header->get('qr'));
596580
$this->assertSame(Message::OPCODE_QUERY, $header->get('opcode'));
597581
$this->assertSame(0, $header->get('aa'));

tests/Query/RetryExecutorTest.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,6 @@ protected function createStandardResponse()
342342
$response->header->set('qr', 1);
343343
$response->questions[] = new Record('igor.io', Message::TYPE_A, Message::CLASS_IN);
344344
$response->answers[] = new Record('igor.io', Message::TYPE_A, Message::CLASS_IN, 3600, '178.79.169.131');
345-
$response->prepare();
346345

347346
return $response;
348347
}

tests/Resolver/ResolverTest.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,6 @@ public function resolveAllShouldReturnMultipleValuesForAlias()
9191
$response->answers[] = new Record($query->name, Message::TYPE_CNAME, $query->class, 3600, 'example.com');
9292
$response->answers[] = new Record('example.com', $query->type, $query->class, 3600, '::1');
9393
$response->answers[] = new Record('example.com', $query->type, $query->class, 3600, '::2');
94-
$response->prepare();
9594

9695
return Promise\resolve($response);
9796
}));

0 commit comments

Comments
 (0)