Skip to content

Commit ba0e871

Browse files
committed
loop send udp query
1 parent 8d97b47 commit ba0e871

File tree

1 file changed

+35
-34
lines changed

1 file changed

+35
-34
lines changed

src/resolver/lookup.rs

Lines changed: 35 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,15 @@ use futures_util::{future::Future,future};
1515
use super::resolver_error::ResolverError;
1616
use std::sync:: {Mutex,Arc};
1717
use crate::client::client_connection::ClientConnectionType;
18+
19+
use crate::client::udp_connection::ClientUDPConnection;
20+
use crate::client::tcp_connection::ClientTCPConnection;
1821
//Future returned fron AsyncResolver when performing a lookup with rtype A
1922
pub struct LookupIpFutureStub {
2023
name: DomainName, // cache: DnsCache,
2124
query_answer: Arc<std::sync::Mutex<Pin<Box<dyn futures_util::Future<Output = Result<DnsMessage, ResolverError>> + Send>>>>,
2225
cache: DnsCache,
23-
conn: ClientConnectionType,
26+
name_servers: Vec<(ClientUDPConnection, ClientTCPConnection)>,
2427
waker: Option<Waker>,
2528
}
2629

@@ -44,7 +47,7 @@ impl Future for LookupIpFutureStub{
4447

4548
let referenced_query = Arc::clone(&self.query_answer); //same as self.query.clone()
4649
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));
4851
println!(" [return pending]");
4952
return Poll::Pending;
5053
},
@@ -61,15 +64,15 @@ impl LookupIpFutureStub{
6164
pub fn lookup(
6265
name: DomainName,
6366
cache:DnsCache,
64-
conn: ClientConnectionType,
67+
name_servers: Vec<(ClientUDPConnection, ClientTCPConnection)>,
6568
) -> Self {
6669
println!("[LOOKUP CREATE FUTURE]");
6770

6871
Self {
6972
name: name,
7073
query_answer: Arc::new(Mutex::new(future::err(ResolverError::Message("Empty")).boxed())), //FIXME: cambiar a otro tipo el error/inicio
7174
cache: cache,
72-
conn: conn,
75+
name_servers: name_servers,
7376
waker: None,
7477
}
7578

@@ -79,7 +82,7 @@ impl LookupIpFutureStub{
7982
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
8083
name: DomainName,
8184
mut cache: DnsCache,
82-
conn: ClientConnectionType,
85+
name_servers: Vec<(ClientUDPConnection, ClientTCPConnection)>,
8386
waker: Option<Waker>,
8487
referenced_query:Arc<std::sync::Mutex<Pin<Box<dyn futures_util::Future<Output = Result<DnsMessage, ResolverError>> + Send>>>>,
8588
) {
@@ -113,32 +116,27 @@ pub async fn lookup_stub( //FIXME: podemos ponerle de nombre lookup_strategy y
113116
// return Ok(new_query);
114117
}
115118

119+
// Create Server failure query //FIXME:
120+
let mut response = new_query.clone().to_owned();
121+
response.get_header().set_rcode(2);
116122

117123
//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);
118137

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
142140

143141
//wake up task
144142
if let Some(waker) = waker {
@@ -169,14 +167,17 @@ mod async_resolver_test {
169167
let cache = DnsCache::new();
170168
let waker = None;
171169

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);
177170
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);
178178

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;
180181
// println!("[Test Result ] {:?}", result);
181182
}
182183

0 commit comments

Comments
 (0)