2424//! async fn main() -> Result<(), async_ip::IpRetrieveError> {
2525//! // Get both internal and external IP addresses
2626//! use reqwest::Client;
27- //! let ip_info = get_all::<Client> (None).await?;
27+ //! let ip_info = get_all(None).await?;
2828//! println!("External IPv6: {:?}", ip_info.external_ipv6);
2929//! println!("Internal IPv4: {:?}", ip_info.internal_ip);
3030//! Ok(())
6666 unused_import_braces,
6767 variant_size_differences,
6868 unused_features,
69- unused_results,
70- warnings
69+ unused_results
7170) ]
7271
73- use async_trait:: async_trait;
74- use auto_impl:: auto_impl;
75- #[ cfg( not( target_family = "wasm" ) ) ]
76- use reqwest:: Client ;
7772use std:: fmt:: Formatter ;
7873use std:: net:: IpAddr ;
79- #[ cfg( not( target_family = "wasm" ) ) ]
80- use std:: net:: SocketAddr ;
8174use std:: str:: FromStr ;
8275
8376// use http since it's 2-3x faster
@@ -112,24 +105,23 @@ impl IpAddressInfo {
112105}
113106
114107/// Gets IP info concurrently using default multiple internal sources
115- pub async fn get_all_multi_concurrent < T : AsyncHttpGetClient > (
116- client : Option < T > ,
108+ pub async fn get_all_multi_concurrent (
109+ client : Option < reqwest :: Client > ,
117110) -> Result < IpAddressInfo , IpRetrieveError > {
118111 get_all_multi_concurrent_from ( client, & [ URL_V6 , URL_V6_1 , URL_V6_2 ] ) . await
119112}
120113
121114/// Uses multiple url addrs to obtain the information
122- pub async fn get_all_multi_concurrent_from < T : AsyncHttpGetClient > (
123- client : Option < T > ,
115+ pub async fn get_all_multi_concurrent_from (
116+ client : Option < reqwest :: Client > ,
124117 v6_addrs : & [ & str ] ,
125118) -> Result < IpAddressInfo , IpRetrieveError > {
126- let client = client. map ( |client| Box :: new ( client) as Box < dyn AsyncHttpGetClient > ) ;
127- let client = & client. unwrap_or_else ( || Box :: new ( get_default_client ( ) ) ) ;
119+ let client = & client. unwrap_or_else ( get_default_client) ;
128120 let internal_ipv4_future = get_internal_ip ( false ) ;
129121 let external_ipv6_future = futures:: future:: select_ok (
130122 v6_addrs
131123 . iter ( )
132- . map ( |addr| Box :: pin ( get_ip_from ( Some ( client) , addr) ) )
124+ . map ( |addr| Box :: pin ( get_ip_from ( Some ( client. clone ( ) ) , addr) ) )
133125 . collect :: < Vec < _ > > ( ) ,
134126 ) ;
135127
@@ -145,20 +137,16 @@ pub async fn get_all_multi_concurrent_from<T: AsyncHttpGetClient>(
145137}
146138
147139/// Returns all possible IPs for this node
148- pub async fn get_all < T : AsyncHttpGetClient > (
149- client : Option < T > ,
150- ) -> Result < IpAddressInfo , IpRetrieveError > {
140+ pub async fn get_all ( client : Option < reqwest:: Client > ) -> Result < IpAddressInfo , IpRetrieveError > {
151141 get_all_from ( client, URL_V6 ) . await
152142}
153143
154144/// Gets IP info concurrently using custom multiple internal sources
155- pub async fn get_all_from < T : AsyncHttpGetClient > (
156- client : Option < T > ,
145+ pub async fn get_all_from (
146+ client : Option < reqwest :: Client > ,
157147 v6_addr : & str ,
158148) -> Result < IpAddressInfo , IpRetrieveError > {
159- let client = client
160- . map ( |client| Box :: new ( client) as Box < dyn AsyncHttpGetClient > )
161- . unwrap_or_else ( || Box :: new ( get_default_client ( ) ) ) ;
149+ let client = client. unwrap_or_else ( get_default_client) ;
162150 let internal_ipv4_future = get_internal_ip ( false ) ;
163151 let external_ipv6_future = get_ip_from ( Some ( client) , v6_addr) ;
164152 let ( res0, res2) = citadel_io:: tokio:: join!( internal_ipv4_future, external_ipv6_future) ;
@@ -177,15 +165,23 @@ pub async fn get_all_from<T: AsyncHttpGetClient>(
177165/// instead.
178166///
179167/// If a reqwest client is supplied, this function will use that client to get the information. None by default.
180- pub async fn get_ip_from < T : AsyncHttpGetClient > (
181- client : Option < T > ,
168+ pub async fn get_ip_from (
169+ client : Option < reqwest :: Client > ,
182170 addr : & str ,
183171) -> Result < IpAddr , IpRetrieveError > {
184- let client = client
185- . map ( |client| Box :: new ( client) as Box < dyn AsyncHttpGetClient > )
186- . unwrap_or_else ( || Box :: new ( get_default_client ( ) ) ) ;
172+ let client = client. unwrap_or_else ( get_default_client) ;
173+
174+ let resp = client
175+ . get ( addr)
176+ . send ( )
177+ . await
178+ . map_err ( |err| IpRetrieveError :: Error ( err. to_string ( ) ) ) ?;
179+
180+ let text = resp
181+ . text ( )
182+ . await
183+ . map_err ( |err| IpRetrieveError :: Error ( err. to_string ( ) ) ) ?;
187184
188- let text = client. get ( addr) . await ?;
189185 IpAddr :: from_str ( text. as_str ( ) ) . map_err ( |err| IpRetrieveError :: Error ( err. to_string ( ) ) )
190186}
191187
@@ -198,7 +194,6 @@ pub async fn get_internal_ip(ipv6: bool) -> Option<IpAddr> {
198194 }
199195}
200196
201- #[ cfg( not( target_family = "wasm" ) ) ]
202197/// Returns the internal ipv4 address of this node
203198pub async fn get_internal_ipv4 ( ) -> Option < IpAddr > {
204199 let socket = citadel_io:: tokio:: net:: UdpSocket :: bind ( addr ( "0.0.0.0:0" ) ?)
@@ -208,12 +203,6 @@ pub async fn get_internal_ipv4() -> Option<IpAddr> {
208203 socket. local_addr ( ) . ok ( ) . map ( |sck| sck. ip ( ) )
209204}
210205
211- #[ cfg( target_family = "wasm" ) ]
212- async fn get_internal_ipv4 ( ) -> Option < IpAddr > {
213- None
214- }
215-
216- #[ cfg( not( target_family = "wasm" ) ) ]
217206async fn get_internal_ipv6 ( ) -> Option < IpAddr > {
218207 let socket = citadel_io:: tokio:: net:: UdpSocket :: bind ( addr ( "[::]:0" ) ?)
219208 . await
@@ -225,25 +214,13 @@ async fn get_internal_ipv6() -> Option<IpAddr> {
225214 socket. local_addr ( ) . ok ( ) . map ( |sck| sck. ip ( ) )
226215}
227216
228- #[ cfg( target_family = "wasm" ) ]
229- async fn get_internal_ipv6 ( ) -> Option < IpAddr > {
230- None
231- }
232-
233- #[ cfg( not( target_family = "wasm" ) ) ]
234- fn addr ( addr : & str ) -> Option < SocketAddr > {
235- SocketAddr :: from_str ( addr) . ok ( )
217+ fn addr ( addr : & str ) -> Option < std:: net:: SocketAddr > {
218+ std:: net:: SocketAddr :: from_str ( addr) . ok ( )
236219}
237220
238- #[ cfg( not( target_family = "wasm" ) ) ]
239221/// Returns a default client
240- pub fn get_default_client ( ) -> Client {
241- Client :: builder ( ) . tcp_nodelay ( true ) . build ( ) . unwrap ( )
242- }
243- #[ cfg( target_family = "wasm" ) ]
244- /// Returns a default client
245- fn get_default_client ( ) -> UreqClient {
246- UreqClient
222+ pub fn get_default_client ( ) -> reqwest:: Client {
223+ reqwest:: Client :: builder ( ) . build ( ) . unwrap ( )
247224}
248225
249226/// The default error type for this crate
@@ -256,59 +233,7 @@ pub enum IpRetrieveError {
256233impl std:: fmt:: Display for IpRetrieveError {
257234 fn fmt ( & self , f : & mut Formatter < ' _ > ) -> std:: fmt:: Result {
258235 match self {
259- IpRetrieveError :: Error ( err) => write ! ( f, "{}" , err ) ,
236+ IpRetrieveError :: Error ( err) => write ! ( f, "{err}" ) ,
260237 }
261238 }
262239}
263-
264- #[ async_trait]
265- #[ auto_impl( Box , & ) ]
266- /// An async http client
267- pub trait AsyncHttpGetClient : Send + Sync {
268- /// Async Get
269- async fn get ( & self , addr : & str ) -> Result < String , IpRetrieveError > ;
270- }
271-
272- #[ cfg( not( target_family = "wasm" ) ) ]
273- #[ async_trait]
274- impl AsyncHttpGetClient for Client {
275- async fn get ( & self , addr : & str ) -> Result < String , IpRetrieveError > {
276- let resp = self
277- . get ( addr)
278- . send ( )
279- . await
280- . map_err ( |err| IpRetrieveError :: Error ( err. to_string ( ) ) ) ?;
281-
282- resp. text ( )
283- . await
284- . map_err ( |err| IpRetrieveError :: Error ( err. to_string ( ) ) )
285- }
286- }
287-
288- #[ async_trait]
289- impl AsyncHttpGetClient for ( ) {
290- async fn get ( & self , _addr : & str ) -> Result < String , IpRetrieveError > {
291- unimplemented ! ( "Stub implementation for AsyncHttpGetClient" )
292- }
293- }
294-
295- #[ cfg( target_family = "wasm" ) ]
296- /// Ureq client
297- pub struct UreqClient ;
298-
299- #[ cfg( target_family = "wasm" ) ]
300- #[ async_trait]
301- impl AsyncHttpGetClient for UreqClient {
302- async fn get ( & self , addr : & str ) -> Result < String , IpRetrieveError > {
303- let addr = addr. to_string ( ) ;
304- citadel_io:: tokio:: task:: spawn_blocking ( move || {
305- ureq:: get ( & addr)
306- . call ( )
307- . map_err ( |err| IpRetrieveError :: Error ( err. to_string ( ) ) ) ?
308- . into_string ( )
309- . map_err ( |err| IpRetrieveError :: Error ( err. to_string ( ) ) )
310- } )
311- . await
312- . map_err ( |err| IpRetrieveError :: Error ( err. to_string ( ) ) ) ?
313- }
314- }
0 commit comments