@@ -9,10 +9,9 @@ use trust_dns_proto::{
9
9
rr:: {
10
10
dnssec:: { rdata:: DNSSECRData , Algorithm , SupportedAlgorithms } ,
11
11
rdata:: {
12
- a, aaaa,
13
12
caa:: Value ,
14
13
opt:: { EdnsCode , EdnsOption } ,
15
- NULL ,
14
+ A , AAAA , NULL ,
16
15
} ,
17
16
record_data:: RData ,
18
17
resource:: Record ,
@@ -69,7 +68,7 @@ impl DnsMessageParser {
69
68
let msg = TrustDnsMessage :: from_vec ( & self . raw_message )
70
69
. map_err ( |source| DnsMessageParserError :: TrustDnsError { source } ) ?;
71
70
let header = parse_dns_query_message_header ( & msg) ;
72
- let edns_section = parse_edns ( & msg) ;
71
+ let edns_section = parse_edns ( & msg) . transpose ( ) ? ;
73
72
let rcode_high = edns_section. as_ref ( ) . map_or ( 0 , |edns| edns. extended_rcode ) ;
74
73
let response_code = ( u16:: from ( rcode_high) << 4 ) | ( ( u16:: from ( header. rcode ) ) & 0x000F ) ;
75
74
@@ -822,29 +821,32 @@ fn parse_dns_update_message_header(dns_message: &TrustDnsMessage) -> UpdateHeade
822
821
}
823
822
}
824
823
825
- fn parse_edns ( dns_message : & TrustDnsMessage ) -> Option < OptPseudoSection > {
826
- dns_message
827
- . extensions ( )
828
- . as_ref ( )
829
- . map ( |edns| OptPseudoSection {
824
+ fn parse_edns ( dns_message : & TrustDnsMessage ) -> Option < DnsParserResult < OptPseudoSection > > {
825
+ dns_message. extensions ( ) . as_ref ( ) . map ( |edns| {
826
+ parse_edns_options ( edns) . map ( |options| OptPseudoSection {
830
827
extended_rcode : edns. rcode_high ( ) ,
831
828
version : edns. version ( ) ,
832
829
dnssec_ok : edns. dnssec_ok ( ) ,
833
830
udp_max_payload_size : edns. max_payload ( ) ,
834
- options : parse_edns_options ( edns ) ,
831
+ options,
835
832
} )
833
+ } )
836
834
}
837
835
838
- fn parse_edns_options ( edns : & Edns ) -> Vec < EdnsOptionEntry > {
836
+ fn parse_edns_options ( edns : & Edns ) -> DnsParserResult < Vec < EdnsOptionEntry > > {
839
837
edns. options ( )
840
838
. as_ref ( )
841
839
. iter ( )
842
840
. map ( |( code, option) | match option {
843
841
EdnsOption :: DAU ( algorithms)
844
842
| EdnsOption :: DHU ( algorithms)
845
- | EdnsOption :: N3U ( algorithms) => parse_edns_opt_dnssec_algorithms ( * code, * algorithms) ,
846
- EdnsOption :: Unknown ( _, opt_data) => parse_edns_opt ( * code, opt_data) ,
847
- option => parse_edns_opt ( * code, & Vec :: < u8 > :: from ( option) ) ,
843
+ | EdnsOption :: N3U ( algorithms) => {
844
+ Ok ( parse_edns_opt_dnssec_algorithms ( * code, * algorithms) )
845
+ }
846
+ EdnsOption :: Unknown ( _, opt_data) => Ok ( parse_edns_opt ( * code, opt_data) ) ,
847
+ option => Vec :: < u8 > :: try_from ( option)
848
+ . map ( |bytes| parse_edns_opt ( * code, & bytes) )
849
+ . map_err ( |source| DnsMessageParserError :: TrustDnsError { source } ) ,
848
850
} )
849
851
. collect ( )
850
852
}
@@ -983,13 +985,13 @@ fn parse_vec_with_u16_len(
983
985
}
984
986
985
987
fn parse_ipv6_address ( decoder : & mut BinDecoder < ' _ > ) -> DnsParserResult < String > {
986
- Ok ( aaaa :: read ( decoder)
988
+ Ok ( < AAAA as BinDecodable > :: read ( decoder)
987
989
. map_err ( |source| DnsMessageParserError :: TrustDnsError { source } ) ?
988
990
. to_string ( ) )
989
991
}
990
992
991
993
fn parse_ipv4_address ( decoder : & mut BinDecoder < ' _ > ) -> DnsParserResult < String > {
992
- Ok ( a :: read ( decoder)
994
+ Ok ( < A as BinDecodable > :: read ( decoder)
993
995
. map_err ( |source| DnsMessageParserError :: TrustDnsError { source } ) ?
994
996
. to_string ( ) )
995
997
}
@@ -1111,25 +1113,21 @@ mod tests {
1111
1113
str:: FromStr ,
1112
1114
} ;
1113
1115
1114
- use trust_dns_proto:: {
1115
- rr:: {
1116
- dnssec:: {
1117
- rdata:: {
1118
- dnskey:: DNSKEY , ds:: DS , nsec:: NSEC , nsec3:: NSEC3 , nsec3param:: NSEC3PARAM ,
1119
- sig:: SIG , DNSSECRData ,
1120
- } ,
1121
- Algorithm as DNSSEC_Algorithm , DigestType , Nsec3HashAlgorithm ,
1122
- } ,
1123
- domain:: Name ,
1116
+ use trust_dns_proto:: rr:: {
1117
+ dnssec:: {
1124
1118
rdata:: {
1125
- caa:: KeyValue ,
1126
- null,
1127
- sshfp:: { Algorithm , FingerprintType } ,
1128
- tlsa:: { CertUsage , Matching , Selector } ,
1129
- CAA , NAPTR , SSHFP , TLSA , TXT ,
1119
+ dnskey:: DNSKEY , ds:: DS , nsec:: NSEC , nsec3:: NSEC3 , nsec3param:: NSEC3PARAM , sig:: SIG ,
1120
+ DNSSECRData ,
1130
1121
} ,
1122
+ Algorithm as DNSSEC_Algorithm , DigestType , Nsec3HashAlgorithm ,
1123
+ } ,
1124
+ domain:: Name ,
1125
+ rdata:: {
1126
+ caa:: KeyValue ,
1127
+ sshfp:: { Algorithm , FingerprintType } ,
1128
+ tlsa:: { CertUsage , Matching , Selector } ,
1129
+ CAA , NAPTR , SSHFP , TLSA , TXT ,
1131
1130
} ,
1132
- serialize:: binary:: Restrict ,
1133
1131
} ;
1134
1132
1135
1133
use super :: * ;
@@ -1284,7 +1282,7 @@ mod tests {
1284
1282
1285
1283
#[ test]
1286
1284
fn test_format_rdata_for_a_type ( ) {
1287
- let rdata = RData :: A ( Ipv4Addr :: from_str ( "1.2.3.4" ) . unwrap ( ) ) ;
1285
+ let rdata = RData :: A ( Ipv4Addr :: from_str ( "1.2.3.4" ) . unwrap ( ) . into ( ) ) ;
1288
1286
let rdata_text = format_rdata ( & rdata) ;
1289
1287
assert ! ( rdata_text. is_ok( ) ) ;
1290
1288
if let Ok ( ( parsed, raw_rdata) ) = rdata_text {
@@ -1295,7 +1293,7 @@ mod tests {
1295
1293
1296
1294
#[ test]
1297
1295
fn test_format_rdata_for_aaaa_type ( ) {
1298
- let rdata = RData :: AAAA ( Ipv6Addr :: from_str ( "2001::1234" ) . unwrap ( ) ) ;
1296
+ let rdata = RData :: AAAA ( Ipv6Addr :: from_str ( "2001::1234" ) . unwrap ( ) . into ( ) ) ;
1299
1297
let rdata_text = format_rdata ( & rdata) ;
1300
1298
assert ! ( rdata_text. is_ok( ) ) ;
1301
1299
if let Ok ( ( parsed, raw_rdata) ) = rdata_text {
@@ -1306,7 +1304,9 @@ mod tests {
1306
1304
1307
1305
#[ test]
1308
1306
fn test_format_rdata_for_cname_type ( ) {
1309
- let rdata = RData :: CNAME ( Name :: from_str ( "www.example.com." ) . unwrap ( ) ) ;
1307
+ let rdata = RData :: CNAME ( trust_dns_proto:: rr:: rdata:: CNAME (
1308
+ Name :: from_str ( "www.example.com." ) . unwrap ( ) ,
1309
+ ) ) ;
1310
1310
let rdata_text = format_rdata ( & rdata) ;
1311
1311
assert ! ( rdata_text. is_ok( ) ) ;
1312
1312
if let Ok ( ( parsed, raw_rdata) ) = rdata_text {
@@ -1778,8 +1778,7 @@ mod tests {
1778
1778
let raw_rdata = BASE64
1779
1779
. decode ( raw_data. as_bytes ( ) )
1780
1780
. expect ( "Invalid base64 encoded rdata." ) ;
1781
- let mut decoder = BinDecoder :: new ( & raw_rdata) ;
1782
- let record_rdata = null:: read ( & mut decoder, Restrict :: new ( raw_rdata. len ( ) as u16 ) ) . unwrap ( ) ;
1781
+ let record_rdata = NULL :: with ( raw_rdata) ;
1783
1782
let rdata_text =
1784
1783
DnsMessageParser :: new ( Vec :: < u8 > :: new ( ) ) . format_unknown_rdata ( code, & record_rdata) ;
1785
1784
assert ! ( rdata_text. is_ok( ) ) ;
@@ -1801,9 +1800,7 @@ mod tests {
1801
1800
. decode ( raw_data_encoded. as_bytes ( ) )
1802
1801
. expect ( "Invalid base64 encoded raw rdata." ) ;
1803
1802
for i in 1 ..=2 {
1804
- let mut decoder = BinDecoder :: new ( & raw_rdata) ;
1805
- let record_rdata =
1806
- null:: read ( & mut decoder, Restrict :: new ( raw_rdata. len ( ) as u16 ) ) . unwrap ( ) ;
1803
+ let record_rdata = NULL :: with ( raw_rdata. clone ( ) ) ;
1807
1804
let rdata_text = message_parser. format_unknown_rdata ( code, & record_rdata) ;
1808
1805
assert ! ( rdata_text. is_ok( ) ) ;
1809
1806
assert_eq ! ( expected_output, rdata_text. unwrap( ) . 0 . unwrap( ) ) ;
0 commit comments