@@ -74,16 +74,16 @@ impl<'a> DNS<'a> {
7474 self . value [ self . offset + 6 ] as u16 * 256 + self . value [ self . offset + 7 ] as u16 ;
7575 count
7676 }
77- // pub fn nscount(&self) -> u16 {
78- // let count: u16 =
79- // self.value[self.offset + 8] as u16 * 256 + self.value[self.offset + 9] as u16;
80- // count
81- // }
82- // pub fn arcount(&self) -> u16 {
83- // let count: u16 =
84- // self.value[self.offset + 10] as u16 * 256 + self.value[self.offset + 11] as u16;
85- // count
86- // }
77+ pub fn nscount ( & self ) -> u16 {
78+ let count: u16 =
79+ self . value [ self . offset + 8 ] as u16 * 256 + self . value [ self . offset + 9 ] as u16 ;
80+ count
81+ }
82+ pub fn arcount ( & self ) -> u16 {
83+ let count: u16 =
84+ self . value [ self . offset + 10 ] as u16 * 256 + self . value [ self . offset + 11 ] as u16 ;
85+ count
86+ }
8787 pub fn question_list ( & self ) -> Vec < ( String , & ' static str ) > {
8888 let mut vec = Vec :: with_capacity ( 1 ) ;
8989 let mut j = 12 ;
@@ -167,19 +167,35 @@ impl<'a> DNS<'a> {
167167 // 若是真正的数据,会以0x00结尾;若是指针,指针占2个字节,第一个字节的高2位为11。
168168 for _ in 0 ..self . ancount ( ) {
169169 if self . value [ n] & 0b_1100_0000 == 0b_1100_0000 {
170- let pointer =
171- ( self . value [ n] & 0b_0011_1111 ) as u16 * 256 + self . value [ n + 1 ] as u16 ;
172- let rdlength = self . value [ n + pointer as usize - 2 ] as u16 * 256
173- + self . value [ n + pointer as usize - 1 ] as u16 ; // RDLENGTH
174- vec. push ( b2a (
175- & self . value [ n + pointer as usize ..n + pointer as usize + rdlength as usize ]
176- ) ) ;
177- n += ( pointer + rdlength) as usize ;
170+ let qtype = self . value [ n + 2 ] as u16 * 256 + self . value [ n + 3 ] as u16 ;
171+ match qtype {
172+ 0x0001 | 0x001c => {
173+ let pointer =
174+ ( self . value [ n] & 0b_0011_1111 ) as u16 * 256 + self . value [ n + 1 ] as u16 ;
175+ let rdlength = self . value [ n + pointer as usize - 2 ] as u16 * 256
176+ + self . value [ n + pointer as usize - 1 ] as u16 ; // RDLENGTH
177+ vec. push ( b2a (
178+ & self . value [ n + pointer as usize ..n + pointer as usize + rdlength as usize ]
179+ ) ) ;
180+ n += ( pointer + rdlength) as usize ;
181+ } ,
182+ 0x0005 => {
183+ vec. push ( "CNAME" . to_string ( ) ) ;
184+ break ;
185+ } ,
186+ _ => vec. push ( "Unknown QTYPE" . to_string ( ) ) ,
187+ }
188+ } else { // not pointer
189+ vec. push ( "Not Pointer" . to_string ( ) ) ;
190+ break ;
178191 }
179192 }
180193 vec
181194 }
182195 pub fn answer ( & self ) -> String {
196+ if self . ancount ( ) == 0 {
197+ return format ! ( "Authority: {}, Additional: {}" , self . nscount( ) , self . arcount( ) ) ;
198+ }
183199 let mut str = String :: with_capacity ( 1024 ) ;
184200 for answer in self . answer_list ( ) {
185201 str. push_str ( & format ! ( "{}, " , answer) ) ;
0 commit comments