11use indexmap:: IndexMap ;
22#[ cfg( feature = "regex" ) ]
33use regex:: Regex ;
4+ use std:: io;
45use std:: net:: { IpAddr , Ipv4Addr , Ipv6Addr , SocketAddr , SocketAddrV4 , SocketAddrV6 } ;
56
67use crate :: ip:: IpVersionAddrIter ;
@@ -30,7 +31,7 @@ pub trait ToIpAddrs: sealed::Sealed {
3031/// A simulated version of `tokio::net::ToSocketAddrs`.
3132pub trait ToSocketAddrs : sealed:: Sealed {
3233 #[ doc( hidden) ]
33- fn to_socket_addr ( & self , dns : & Dns ) -> SocketAddr ;
34+ fn to_socket_addr ( & self , dns : & Dns ) -> io :: Result < SocketAddr > ;
3435}
3536
3637impl Dns {
@@ -116,73 +117,76 @@ impl ToIpAddrs for Regex {
116117
117118// Hostname and port
118119impl ToSocketAddrs for ( String , u16 ) {
119- fn to_socket_addr ( & self , dns : & Dns ) -> SocketAddr {
120+ fn to_socket_addr ( & self , dns : & Dns ) -> io :: Result < SocketAddr > {
120121 ( & self . 0 [ ..] , self . 1 ) . to_socket_addr ( dns)
121122 }
122123}
123124
124125impl ToSocketAddrs for ( & str , u16 ) {
125- fn to_socket_addr ( & self , dns : & Dns ) -> SocketAddr {
126+ fn to_socket_addr ( & self , dns : & Dns ) -> io :: Result < SocketAddr > {
126127 // When IP address is passed directly as a str.
127128 if let Ok ( ip) = self . 0 . parse :: < IpAddr > ( ) {
128- return ( ip, self . 1 ) . into ( ) ;
129+ return Ok ( ( ip, self . 1 ) . into ( ) ) ;
129130 }
130131
131132 match dns. names . get ( self . 0 ) {
132- Some ( ip) => ( * ip, self . 1 ) . into ( ) ,
133- None => panic ! ( "no ip address found for a hostname: {}" , self . 0 ) ,
133+ Some ( ip) => Ok ( ( * ip, self . 1 ) . into ( ) ) ,
134+ None => Err ( io:: Error :: other ( format ! (
135+ "no ip address found for a hostname: {}" ,
136+ self . 0
137+ ) ) ) ,
134138 }
135139 }
136140}
137141
138142impl ToSocketAddrs for SocketAddr {
139- fn to_socket_addr ( & self , _: & Dns ) -> SocketAddr {
140- * self
143+ fn to_socket_addr ( & self , _: & Dns ) -> io :: Result < SocketAddr > {
144+ Ok ( * self )
141145 }
142146}
143147
144148impl ToSocketAddrs for SocketAddrV4 {
145- fn to_socket_addr ( & self , _: & Dns ) -> SocketAddr {
146- SocketAddr :: V4 ( * self )
149+ fn to_socket_addr ( & self , _: & Dns ) -> io :: Result < SocketAddr > {
150+ Ok ( SocketAddr :: V4 ( * self ) )
147151 }
148152}
149153
150154impl ToSocketAddrs for SocketAddrV6 {
151- fn to_socket_addr ( & self , _: & Dns ) -> SocketAddr {
152- SocketAddr :: V6 ( * self )
155+ fn to_socket_addr ( & self , _: & Dns ) -> io :: Result < SocketAddr > {
156+ Ok ( SocketAddr :: V6 ( * self ) )
153157 }
154158}
155159
156160impl ToSocketAddrs for ( IpAddr , u16 ) {
157- fn to_socket_addr ( & self , _: & Dns ) -> SocketAddr {
158- ( * self ) . into ( )
161+ fn to_socket_addr ( & self , _: & Dns ) -> io :: Result < SocketAddr > {
162+ Ok ( ( * self ) . into ( ) )
159163 }
160164}
161165
162166impl ToSocketAddrs for ( Ipv4Addr , u16 ) {
163- fn to_socket_addr ( & self , _: & Dns ) -> SocketAddr {
164- ( * self ) . into ( )
167+ fn to_socket_addr ( & self , _: & Dns ) -> io :: Result < SocketAddr > {
168+ Ok ( ( * self ) . into ( ) )
165169 }
166170}
167171
168172impl ToSocketAddrs for ( Ipv6Addr , u16 ) {
169- fn to_socket_addr ( & self , _: & Dns ) -> SocketAddr {
170- ( * self ) . into ( )
173+ fn to_socket_addr ( & self , _: & Dns ) -> io :: Result < SocketAddr > {
174+ Ok ( ( * self ) . into ( ) )
171175 }
172176}
173177
174178impl < T : ToSocketAddrs + ?Sized > ToSocketAddrs for & T {
175- fn to_socket_addr ( & self , dns : & Dns ) -> SocketAddr {
179+ fn to_socket_addr ( & self , dns : & Dns ) -> io :: Result < SocketAddr > {
176180 ( * * self ) . to_socket_addr ( dns)
177181 }
178182}
179183
180184impl ToSocketAddrs for str {
181- fn to_socket_addr ( & self , dns : & Dns ) -> SocketAddr {
185+ fn to_socket_addr ( & self , dns : & Dns ) -> io :: Result < SocketAddr > {
182186 let socketaddr: Result < SocketAddr , _ > = self . parse ( ) ;
183187
184188 if let Ok ( s) = socketaddr {
185- return s ;
189+ return Ok ( s ) ;
186190 }
187191
188192 // Borrowed from std
@@ -191,7 +195,7 @@ impl ToSocketAddrs for str {
191195 ( $e: expr, $msg: expr) => {
192196 match $e {
193197 Some ( r) => r,
194- None => panic! ( "Unable to parse dns: {}" , $msg) ,
198+ None => return Err ( io :: Error :: new ( io :: ErrorKind :: InvalidInput , $msg) ) ,
195199 }
196200 } ;
197201 }
@@ -205,7 +209,7 @@ impl ToSocketAddrs for str {
205209}
206210
207211impl ToSocketAddrs for String {
208- fn to_socket_addr ( & self , dns : & Dns ) -> SocketAddr {
212+ fn to_socket_addr ( & self , dns : & Dns ) -> io :: Result < SocketAddr > {
209213 self . as_str ( ) . to_socket_addr ( dns)
210214 }
211215}
@@ -227,16 +231,22 @@ mod tests {
227231 let mut dns = Dns :: new ( IpVersionAddrIter :: default ( ) ) ;
228232 let generated_addr = dns. lookup ( "foo" ) ;
229233
230- let hostname_port = "foo:5000" . to_socket_addr ( & dns ) ;
234+ let hostname_port = "foo:5000" ;
231235 let ipv4_port = "127.0.0.1:5000" ;
232236 let ipv6_port = "[::1]:5000" ;
233237
234238 assert_eq ! (
235- hostname_port,
239+ hostname_port. to_socket_addr ( & dns ) . unwrap ( ) ,
236240 format!( "{generated_addr}:5000" ) . parse( ) . unwrap( )
237241 ) ;
238- assert_eq ! ( ipv4_port. to_socket_addr( & dns) , ipv4_port. parse( ) . unwrap( ) ) ;
239- assert_eq ! ( ipv6_port. to_socket_addr( & dns) , ipv6_port. parse( ) . unwrap( ) ) ;
242+ assert_eq ! (
243+ ipv4_port. to_socket_addr( & dns) . unwrap( ) ,
244+ ipv4_port. parse( ) . unwrap( )
245+ ) ;
246+ assert_eq ! (
247+ ipv6_port. to_socket_addr( & dns) . unwrap( ) ,
248+ ipv6_port. parse( ) . unwrap( )
249+ ) ;
240250 }
241251
242252 #[ test]
@@ -251,7 +261,7 @@ mod tests {
251261 let addr = dns. lookup ( "192.168.3.3" ) ;
252262 assert_eq ! ( addr, Ipv4Addr :: new( 192 , 168 , 3 , 3 ) ) ;
253263
254- let addr = "192.168.3.3:0" . to_socket_addr ( & dns) ;
264+ let addr = "192.168.3.3:0" . to_socket_addr ( & dns) . unwrap ( ) ;
255265 assert_eq ! ( addr. ip( ) , Ipv4Addr :: new( 192 , 168 , 3 , 3 ) ) ;
256266 }
257267}
0 commit comments