@@ -39,20 +39,34 @@ 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 ->id = $ id ;
50+ $ message ->rcode = $ fields & 0xf ;
51+ $ message ->ra = (($ fields >> 7 ) & 1 ) === 1 ;
52+ $ message ->rd = (($ fields >> 8 ) & 1 ) === 1 ;
53+ $ message ->tc = (($ fields >> 9 ) & 1 ) === 1 ;
54+ $ message ->aa = (($ fields >> 10 ) & 1 ) === 1 ;
55+ $ message ->opcode = ($ fields >> 11 ) & 0xf ;
56+ $ message ->qr = (($ fields >> 15 ) & 1 ) === 1 ;
57+
58+ // parse all questions
59+ for ($ i = $ qdCount ; $ i > 0 ; --$ i ) {
60+ $ question = $ this ->parseQuestion ($ message );
61+ if ($ question === null ) {
5062 return ;
63+ } else {
64+ $ message ->questions [] = $ question ;
5165 }
5266 }
5367
5468 // parse all answer records
55- for ($ i = $ message -> header -> get ( ' anCount ' ) ; $ i > 0 ; --$ i ) {
69+ for ($ i = $ anCount ; $ i > 0 ; --$ i ) {
5670 $ record = $ this ->parseRecord ($ message );
5771 if ($ record === null ) {
5872 return ;
@@ -62,7 +76,7 @@ private function parse($data, Message $message)
6276 }
6377
6478 // parse all authority records
65- for ($ i = $ message -> header -> get ( ' nsCount ' ) ; $ i > 0 ; --$ i ) {
79+ for ($ i = $ nsCount ; $ i > 0 ; --$ i ) {
6680 $ record = $ this ->parseRecord ($ message );
6781 if ($ record === null ) {
6882 return ;
@@ -72,7 +86,7 @@ private function parse($data, Message $message)
7286 }
7387
7488 // parse all additional records
75- for ($ i = $ message -> header -> get ( ' arCount ' ) ; $ i > 0 ; --$ i ) {
89+ for ($ i = $ arCount ; $ i > 0 ; --$ i ) {
7690 $ record = $ this ->parseRecord ($ message );
7791 if ($ record === null ) {
7892 return ;
@@ -84,36 +98,10 @@ private function parse($data, Message $message)
8498 return $ message ;
8599 }
86100
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-
101+ /**
102+ * @param Message $message
103+ * @return ?Query
104+ */
117105 private function parseQuestion (Message $ message )
118106 {
119107 $ consumed = $ message ->consumed ;
@@ -129,17 +117,11 @@ private function parseQuestion(Message $message)
129117
130118 $ message ->consumed = $ consumed ;
131119
132- $ message -> questions [] = new Query (
120+ return new Query (
133121 implode ('. ' , $ labels ),
134122 $ type ,
135123 $ class
136124 );
137-
138- if ($ message ->header ->get ('qdCount ' ) != count ($ message ->questions )) {
139- return $ this ->parseQuestion ($ message );
140- }
141-
142- return $ message ;
143125 }
144126
145127 /**
0 commit comments