From 271fdbbb4cdb5d0f655ff824fa4a2157b45bc19d Mon Sep 17 00:00:00 2001 From: Tiago Batista Cardoso Date: Wed, 21 Jan 2026 17:40:21 +0100 Subject: [PATCH] temp --- client-network/src/lib.rs | 99 ++++++++++++++++++++++++++++++++------- 1 file changed, 83 insertions(+), 16 deletions(-) diff --git a/client-network/src/lib.rs b/client-network/src/lib.rs index 9224415..60dbbb0 100644 --- a/client-network/src/lib.rs +++ b/client-network/src/lib.rs @@ -506,36 +506,103 @@ fn parse_pack(s: &str) -> Option<[u8; 6]> { ]) } +fn quick_ping(addr: &SocketAddr, timeout_ms: u64) -> bool { + let connect = + std::net::TcpStream::connect_timeout(addr, std::time::Duration::from_millis(timeout_ms)); + connect.is_ok() +} + /// /// sends a get request to the server to get the socket address of the given peer /// pub async fn get_socket_address(username: String, ip: String) -> Option { - let client = Client::builder() - .timeout(Duration::from_secs(5)) - .build() - .expect("cannot create client"); + let client = match Client::builder().timeout(Duration::from_secs(5)).build() { + Ok(c) => c, + Err(e) => { + eprintln!("Failed to build HTTP client: {}", e); + return None; + } + }; + let uri = format!("{}/peers/{}/addresses", ip, username); - let res = client.get(uri).send().await.expect("couldnt get response"); + let res = match client.get(&uri).send().await { + Ok(r) => r, + Err(e) => { + eprintln!("HTTP request error: {}", e); + return None; + } + }; + if res.status().is_success() { - println!("Successfully retreived the addresses. {}", res.status()); + println!("Successfully retrieved the addresses. {}", res.status()); } else { eprintln!( "Failed to get the peers addresses from the server. Status: {}", res.status() ); } - let body: Bytes = res.bytes().await.expect("couldnt get bytes"); - match String::from_utf8(body.to_vec()) { - Ok(s) => { - let addresses = parse_addresses(&s); - if let Some(first) = addresses.first() { - Some(first.clone()) - } else { - None - } + let body = match res.bytes().await { + Ok(b) => b, + Err(e) => { + eprintln!("Failed to read response body: {}", e); + return None; + } + }; + + let s = match String::from_utf8(body.to_vec()) { + Ok(st) => st, + Err(e) => { + eprintln!("Response not valid UTF-8: {}", e); + return None; + } + }; + + let addresses = parse_addresses(&s); // assumes parse_addresses: &str -> Vec + + for addr in addresses { + if quick_ping(&addr, 300) { + return Some(addr); + } + + // TODO: nat_traversal(&addr).await; + // after NAT traversal attempt, ping again + + if quick_ping(&addr, 300) { + return Some(addr); } - Err(_) => None, } + + None } + +//pub async fn get_socket_address(username: String, ip: String) -> Option { +// let client = Client::builder() +// .timeout(Duration::from_secs(5)) +// .build() +// .expect("cannot create client"); +// let uri = format!("{}/peers/{}/addresses", ip, username); +// let res = client.get(uri).send().await.expect("couldnt get response"); +// if res.status().is_success() { +// println!("Successfully retreived the addresses. {}", res.status()); +// } else { +// eprintln!( +// "Failed to get the peers addresses from the server. Status: {}", +// res.status() +// ); +// } +// let body: Bytes = res.bytes().await.expect("couldnt get bytes"); +// +// match String::from_utf8(body.to_vec()) { +// Ok(s) => { +// let addresses = parse_addresses(&s); +// if let Some(first) = addresses.first() { +// Some(first.clone()) +// } else { +// None +// } +// } +// Err(_) => None, +// } +//}