@@ -6,7 +6,6 @@ mod tests;
66pub use core:: net:: { SocketAddr , SocketAddrV4 , SocketAddrV6 } ;
77
88use crate :: net:: { IpAddr , Ipv4Addr , Ipv6Addr } ;
9- use crate :: sys:: net:: LookupHost ;
109use crate :: { io, iter, option, slice, vec} ;
1110
1211/// A trait for objects which can be converted or resolved to one or more
@@ -188,15 +187,9 @@ impl ToSocketAddrs for (Ipv6Addr, u16) {
188187 }
189188}
190189
191- fn resolve_socket_addr ( lh : LookupHost ) -> io:: Result < vec:: IntoIter < SocketAddr > > {
192- let p = lh. port ( ) ;
193- let v: Vec < _ > = lh
194- . map ( |mut a| {
195- a. set_port ( p) ;
196- a
197- } )
198- . collect ( ) ;
199- Ok ( v. into_iter ( ) )
190+ fn lookup_host ( host : & str , port : u16 ) -> io:: Result < vec:: IntoIter < SocketAddr > > {
191+ let addrs = crate :: sys:: net:: lookup_host ( host, port) ?;
192+ Ok ( Vec :: from_iter ( addrs) . into_iter ( ) )
200193}
201194
202195#[ stable( feature = "rust1" , since = "1.0.0" ) ]
@@ -205,17 +198,14 @@ impl ToSocketAddrs for (&str, u16) {
205198 fn to_socket_addrs ( & self ) -> io:: Result < vec:: IntoIter < SocketAddr > > {
206199 let ( host, port) = * self ;
207200
208- // try to parse the host as a regular IP address first
209- if let Ok ( addr) = host. parse :: < Ipv4Addr > ( ) {
210- let addr = SocketAddrV4 :: new ( addr, port) ;
211- return Ok ( vec ! [ SocketAddr :: V4 ( addr) ] . into_iter ( ) ) ;
212- }
213- if let Ok ( addr) = host. parse :: < Ipv6Addr > ( ) {
214- let addr = SocketAddrV6 :: new ( addr, port, 0 , 0 ) ;
215- return Ok ( vec ! [ SocketAddr :: V6 ( addr) ] . into_iter ( ) ) ;
201+ // Try to parse the host as a regular IP address first
202+ if let Ok ( addr) = host. parse :: < IpAddr > ( ) {
203+ let addr = SocketAddr :: new ( addr, port) ;
204+ return Ok ( vec ! [ addr] . into_iter ( ) ) ;
216205 }
217206
218- resolve_socket_addr ( ( host, port) . try_into ( ) ?)
207+ // Otherwise, make the system look it up.
208+ lookup_host ( host, port)
219209 }
220210}
221211
@@ -232,12 +222,21 @@ impl ToSocketAddrs for (String, u16) {
232222impl ToSocketAddrs for str {
233223 type Iter = vec:: IntoIter < SocketAddr > ;
234224 fn to_socket_addrs ( & self ) -> io:: Result < vec:: IntoIter < SocketAddr > > {
235- // try to parse as a regular SocketAddr first
225+ // Try to parse as a regular SocketAddr first
236226 if let Ok ( addr) = self . parse ( ) {
237227 return Ok ( vec ! [ addr] . into_iter ( ) ) ;
238228 }
239229
240- resolve_socket_addr ( self . try_into ( ) ?)
230+ // Otherwise, split the string by ':' and convert the second part to u16...
231+ let Some ( ( host, port_str) ) = self . rsplit_once ( ':' ) else {
232+ return Err ( io:: const_error!( io:: ErrorKind :: InvalidInput , "invalid socket address" ) ) ;
233+ } ;
234+ let Ok ( port) = port_str. parse :: < u16 > ( ) else {
235+ return Err ( io:: const_error!( io:: ErrorKind :: InvalidInput , "invalid port value" ) ) ;
236+ } ;
237+
238+ // ... and make the system look up the host.
239+ lookup_host ( host, port)
241240 }
242241}
243242
0 commit comments