@@ -15,12 +15,15 @@ use futures_util::{future::Future,future};
15
15
use super :: resolver_error:: ResolverError ;
16
16
use std:: sync:: { Mutex , Arc } ;
17
17
use crate :: client:: client_connection:: ClientConnectionType ;
18
+
19
+ use crate :: client:: udp_connection:: ClientUDPConnection ;
20
+ use crate :: client:: tcp_connection:: ClientTCPConnection ;
18
21
//Future returned fron AsyncResolver when performing a lookup with rtype A
19
22
pub struct LookupIpFutureStub {
20
23
name : DomainName , // cache: DnsCache,
21
24
query_answer : Arc < std:: sync:: Mutex < Pin < Box < dyn futures_util:: Future < Output = Result < DnsMessage , ResolverError > > + Send > > > > ,
22
25
cache : DnsCache ,
23
- conn : ClientConnectionType ,
26
+ name_servers : Vec < ( ClientUDPConnection , ClientTCPConnection ) > ,
24
27
waker : Option < Waker > ,
25
28
}
26
29
@@ -44,7 +47,7 @@ impl Future for LookupIpFutureStub{
44
47
45
48
let referenced_query = Arc :: clone ( & self . query_answer ) ; //same as self.query.clone()
46
49
tokio:: spawn (
47
- lookup_stub ( self . name . clone ( ) , self . cache . clone ( ) , self . conn . clone ( ) , self . waker . clone ( ) , referenced_query) ) ;
50
+ lookup_stub ( self . name . clone ( ) , self . cache . clone ( ) , self . name_servers . clone ( ) , self . waker . clone ( ) , referenced_query) ) ;
48
51
println ! ( " [return pending]" ) ;
49
52
return Poll :: Pending ;
50
53
} ,
@@ -61,15 +64,15 @@ impl LookupIpFutureStub{
61
64
pub fn lookup (
62
65
name : DomainName ,
63
66
cache : DnsCache ,
64
- conn : ClientConnectionType ,
67
+ name_servers : Vec < ( ClientUDPConnection , ClientTCPConnection ) > ,
65
68
) -> Self {
66
69
println ! ( "[LOOKUP CREATE FUTURE]" ) ;
67
70
68
71
Self {
69
72
name : name,
70
73
query_answer : Arc :: new ( Mutex :: new ( future:: err ( ResolverError :: Message ( "Empty" ) ) . boxed ( ) ) ) , //FIXME: cambiar a otro tipo el error/inicio
71
74
cache : cache,
72
- conn : conn ,
75
+ name_servers : name_servers ,
73
76
waker : None ,
74
77
}
75
78
@@ -79,7 +82,7 @@ impl LookupIpFutureStub{
79
82
pub async fn lookup_stub ( //FIXME: podemos ponerle de nombre lookup_strategy y que se le pase ahi un parametro strategy que diga si son los pasos o si funciona como stub
80
83
name : DomainName ,
81
84
mut cache : DnsCache ,
82
- conn : ClientConnectionType ,
85
+ name_servers : Vec < ( ClientUDPConnection , ClientTCPConnection ) > ,
83
86
waker : Option < Waker > ,
84
87
referenced_query : Arc < std:: sync:: Mutex < Pin < Box < dyn futures_util:: Future < Output = Result < DnsMessage , ResolverError > > + Send > > > > ,
85
88
) {
@@ -113,32 +116,27 @@ pub async fn lookup_stub( //FIXME: podemos ponerle de nombre lookup_strategy y
113
116
// return Ok(new_query);
114
117
}
115
118
119
+ // Create Server failure query //FIXME:
120
+ let mut response = new_query. clone ( ) . to_owned ( ) ;
121
+ response. get_header ( ) . set_rcode ( 2 ) ;
116
122
117
123
//loop
124
+ for ( conn_udp, conn_tcp) in name_servers. iter ( ) {
125
+
126
+ let result_response = conn_udp. send ( new_query. clone ( ) ) ;
127
+ match result_response {
128
+ Ok ( response_ok) => {
129
+ response = response_ok;
130
+ break ;
131
+ } ,
132
+ Err ( _) => ( ) ,
133
+ } ;
134
+ }
135
+
136
+ println ! ( "[] {:?}" , response) ;
118
137
119
- //FIXME:
120
- let response_result: Result < DnsMessage , ResolverError > = match conn {
121
- ClientConnectionType :: TCP ( client_conn) => {
122
- match client_conn. send ( new_query) {
123
- Err ( _) => Err ( ResolverError :: Message ( "Error: Receiving DNS message" ) ) ,
124
- Ok ( val) => {
125
- Ok ( val)
126
- } ,
127
- }
128
- }
129
-
130
- ClientConnectionType :: UDP ( client_conn) => {
131
- match client_conn. send ( new_query) {
132
- Err ( _) => Err ( ResolverError :: Message ( "Error: Receiving DNS message" ) ) ,
133
- Ok ( val) => {
134
- Ok ( val) } ,
135
- }
136
- }
137
- } ;
138
- println ! ( "[] {:?}" , response_result) ;
139
-
140
- let mut future_query = referenced_query. lock ( ) . unwrap ( ) ;
141
- * future_query = future:: ready ( response_result) . boxed ( ) ; // TODO: check if it workingas expected
138
+ // let mut future_query = referenced_query.lock().unwrap();
139
+ // *future_query = future::ready(response_result).boxed(); // TODO: check if it workingas expected
142
140
143
141
//wake up task
144
142
if let Some ( waker) = waker {
@@ -169,14 +167,17 @@ mod async_resolver_test {
169
167
let cache = DnsCache :: new ( ) ;
170
168
let waker = None ;
171
169
172
- let google_server: IpAddr = IpAddr :: V4 ( Ipv4Addr :: new ( 8 , 8 , 8 , 8 ) ) ;
173
- let timeout: Duration = Duration :: from_secs ( 20 ) ;
174
-
175
- let client_udp = ClientUDPConnection :: new ( google_server, timeout) ;
176
- let conn = ClientConnectionType :: UDP ( client_udp) ;
177
170
let query = Arc :: new ( Mutex :: new ( future:: err ( ResolverError :: Message ( "Empty" ) ) . boxed ( ) ) ) ;
171
+
172
+ // Create vect of name servers
173
+ let google_server: IpAddr = IpAddr :: V4 ( Ipv4Addr :: new ( 8 , 8 , 8 , 8 ) ) ;
174
+ let timeout: Duration = Duration :: from_secs ( 20 ) ;
175
+
176
+ let conn_udp: ClientUDPConnection = ClientUDPConnection :: new ( google_server, timeout) ;
177
+ let conn_tcp: ClientTCPConnection = ClientTCPConnection :: new ( google_server, timeout) ;
178
178
179
- lookup_stub ( name, cache, conn, waker, query) . await ;
179
+ let name_servers = vec ! [ ( conn_udp, conn_tcp) ] ;
180
+ lookup_stub ( name, cache, name_servers, waker, query) . await ;
180
181
// println!("[Test Result ] {:?}", result);
181
182
}
182
183
0 commit comments