@@ -2,20 +2,21 @@ use hickory_proto::{
2
2
op:: { header:: MessageType , op_code:: OpCode , query:: Query , Message , ResponseCode } ,
3
3
rr:: { record_type:: RecordType , Name , RData } ,
4
4
} ;
5
+ use std:: io:: { Error , ErrorKind } ;
5
6
use std:: { net:: IpAddr , str:: FromStr } ;
6
7
7
8
#[ allow( dead_code) ]
8
- pub fn build_dns_query ( domain : & str , query_type : RecordType , used_by_tcp : bool ) -> Result < Vec < u8 > , String > {
9
+ pub fn build_dns_query ( domain : & str , query_type : RecordType , used_by_tcp : bool ) -> std :: io :: Result < Vec < u8 > > {
9
10
use rand:: { rngs:: StdRng , Rng , SeedableRng } ;
10
- let name = Name :: from_str ( domain) . map_err ( |e| e. to_string ( ) ) ?;
11
+ let name = Name :: from_str ( domain) . map_err ( |e| Error :: new ( ErrorKind :: InvalidInput , e. to_string ( ) ) ) ?;
11
12
let query = Query :: query ( name, query_type) ;
12
13
let mut msg = Message :: new ( ) ;
13
14
msg. add_query ( query)
14
15
. set_id ( StdRng :: from_entropy ( ) . gen ( ) )
15
16
. set_op_code ( OpCode :: Query )
16
17
. set_message_type ( MessageType :: Query )
17
18
. set_recursion_desired ( true ) ;
18
- let mut msg_buf = msg. to_vec ( ) . map_err ( |e| e. to_string ( ) ) ?;
19
+ let mut msg_buf = msg. to_vec ( ) . map_err ( |e| Error :: new ( ErrorKind :: InvalidInput , e. to_string ( ) ) ) ?;
19
20
if used_by_tcp {
20
21
let mut buf = ( msg_buf. len ( ) as u16 ) . to_be_bytes ( ) . to_vec ( ) ;
21
22
buf. append ( & mut msg_buf) ;
@@ -25,13 +26,13 @@ pub fn build_dns_query(domain: &str, query_type: RecordType, used_by_tcp: bool)
25
26
}
26
27
}
27
28
28
- pub fn extract_ipaddr_from_dns_message ( message : & Message ) -> Result < IpAddr , String > {
29
+ pub fn extract_ipaddr_from_dns_message ( message : & Message ) -> std :: io :: Result < IpAddr > {
29
30
if message. response_code ( ) != ResponseCode :: NoError {
30
- return Err ( format ! ( "{:?}" , message. response_code( ) ) ) ;
31
+ return Err ( Error :: new ( ErrorKind :: InvalidData , format ! ( "{:?}" , message. response_code( ) ) ) ) ;
31
32
}
32
33
let mut cname = None ;
33
34
for answer in message. answers ( ) {
34
- match answer. data ( ) . ok_or ( "DNS response not contains answer data") ? {
35
+ match answer. data ( ) . ok_or ( Error :: new ( ErrorKind :: InvalidData , "No answer data") ) ? {
35
36
RData :: A ( addr) => {
36
37
return Ok ( IpAddr :: V4 ( ( * addr) . into ( ) ) ) ;
37
38
}
@@ -45,26 +46,28 @@ pub fn extract_ipaddr_from_dns_message(message: &Message) -> Result<IpAddr, Stri
45
46
}
46
47
}
47
48
if let Some ( cname) = cname {
48
- return Err ( cname) ;
49
+ return Err ( Error :: new ( ErrorKind :: InvalidData , format ! ( "CNAME: {}" , cname) ) ) ;
49
50
}
50
- Err ( format ! ( "{:?}" , message. answers( ) ) )
51
+ Err ( Error :: new ( ErrorKind :: InvalidData , format ! ( "{:?}" , message. answers( ) ) ) )
51
52
}
52
53
53
- pub fn extract_domain_from_dns_message ( message : & Message ) -> Result < String , String > {
54
- let query = message. queries ( ) . first ( ) . ok_or ( "DnsRequest no query body" ) ?;
54
+ pub fn extract_domain_from_dns_message ( message : & Message ) -> std:: io:: Result < String > {
55
+ let err = Error :: new ( ErrorKind :: InvalidData , "DnsRequest no query body" ) ;
56
+ let query = message. queries ( ) . first ( ) . ok_or ( err) ?;
55
57
let name = query. name ( ) . to_string ( ) ;
56
58
Ok ( name)
57
59
}
58
60
59
- pub fn parse_data_to_dns_message ( data : & [ u8 ] , used_by_tcp : bool ) -> Result < Message , String > {
61
+ pub fn parse_data_to_dns_message ( data : & [ u8 ] , used_by_tcp : bool ) -> std :: io :: Result < Message > {
60
62
if used_by_tcp {
63
+ let err = Error :: new ( ErrorKind :: InvalidData , "invalid dns data" ) ;
61
64
if data. len ( ) < 2 {
62
- return Err ( "invalid dns data" . into ( ) ) ;
65
+ return Err ( err ) ;
63
66
}
64
67
let len = u16:: from_be_bytes ( [ data[ 0 ] , data[ 1 ] ] ) as usize ;
65
- let data = data. get ( 2 ..len + 2 ) . ok_or ( "invalid dns data" ) ?;
68
+ let data = data. get ( 2 ..len + 2 ) . ok_or ( err ) ?;
66
69
return parse_data_to_dns_message ( data, false ) ;
67
70
}
68
- let message = Message :: from_vec ( data) . map_err ( |e| e. to_string ( ) ) ?;
71
+ let message = Message :: from_vec ( data) . map_err ( |e| Error :: new ( ErrorKind :: InvalidData , e. to_string ( ) ) ) ?;
69
72
Ok ( message)
70
73
}
0 commit comments