@@ -6,7 +6,7 @@ use tokio::net::UdpSocket;
66
77use crate :: message:: resource_record:: ResourceRecord ;
88use crate :: message:: DnsMessage ;
9-
9+ use crate :: message :: rcode :: Rcode ;
1010
1111/// Structure to represent a Name Server
1212#[ derive ( Debug ) ]
@@ -35,26 +35,52 @@ impl NameServer {
3535 let socket_clone = self . shared_sock . clone ( ) ;
3636 tokio:: spawn ( async move {
3737 // Handle the request concurrently!!! Important
38- NameServer :: handle_request ( socket_clone, data, src) . await ;
38+ self . handle_request ( socket_clone, data, src) . await ;
3939 } ) ;
4040 }
4141 }
4242
43- async fn handle_request ( socket : Arc < Mutex < UdpSocket > > ,
43+ async fn handle_request ( & self , socket : Arc < Mutex < UdpSocket > > ,
4444 data : Vec < u8 > ,
4545 addr : std:: net:: SocketAddr ) {
46- let message = DnsMessage :: from_bytes ( & data) . unwrap ( ) ;
47- // respondemos lo mismo por el momento
48- let response = message . to_bytes ( ) ;
46+ let mut message = DnsMessage :: from_bytes ( & data) . expect ( "Error al parsear el mensaje" ) ;
47+
48+ let rrs_to_add = NameServer :: search_query ( & self . zone , & message ) ;
4949
50+ if rrs_to_add. len ( ) > 0 {
51+ NameServer :: add_rrs ( & mut message, & rrs_to_add)
52+ }
53+ let response = message. to_bytes ( ) ;
5054 // lock the socket and send the response
5155 let mut sock = socket. lock ( ) . await ;
5256 if let Err ( e) = sock. send_to ( & response, addr) . await {
5357 eprintln ! ( "Failed to send response to {}: {}" , addr, e) ;
5458 } else {
5559 println ! ( "Sent response to {:?}" , addr) ;
5660 }
57- }
61+ }
62+
63+ fn add_rrs ( msg : & mut DnsMessage , rrs : & Vec < ResourceRecord > ) {
64+ msg. set_answer ( rrs. clone ( ) ) ;
65+ let mut header = msg. get_header ( ) ;
66+ header. set_aa ( true ) ;
67+ header. set_rcode ( Rcode :: NOERROR ) ;
68+ header. set_qr ( true ) ;
69+ header. set_ancount ( rrs. len ( ) as u16 ) ;
70+ msg. set_header ( header) ;
71+ }
72+
73+ fn search_query ( zone : & Vec < ResourceRecord > , msg : & DnsMessage ) -> Vec < ResourceRecord > {
74+ let qclass = msg. get_question ( ) . get_rclass ( ) ;
75+ let qtype = msg. get_question ( ) . get_rrtype ( ) ;
76+ let qname = msg. get_question ( ) . get_qname ( ) ;
77+ zone. iter ( )
78+ . filter ( |rr|
79+ qclass == rr. get_rclass ( )
80+ && qtype == rr. get_rtype ( )
81+ && qname == rr. get_name ( ) )
82+ . collect ( )
83+ }
5884}
5985
6086
0 commit comments