@@ -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 /**
0 commit comments