@@ -6,7 +6,6 @@ mod tests;
6
6
pub use core:: net:: { SocketAddr , SocketAddrV4 , SocketAddrV6 } ;
7
7
8
8
use crate :: net:: { IpAddr , Ipv4Addr , Ipv6Addr } ;
9
- use crate :: sys:: net:: LookupHost ;
10
9
use crate :: { io, iter, option, slice, vec} ;
11
10
12
11
/// A trait for objects which can be converted or resolved to one or more
@@ -188,15 +187,9 @@ impl ToSocketAddrs for (Ipv6Addr, u16) {
188
187
}
189
188
}
190
189
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 ( ) )
200
193
}
201
194
202
195
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
@@ -205,17 +198,14 @@ impl ToSocketAddrs for (&str, u16) {
205
198
fn to_socket_addrs ( & self ) -> io:: Result < vec:: IntoIter < SocketAddr > > {
206
199
let ( host, port) = * self ;
207
200
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 ( ) ) ;
216
205
}
217
206
218
- resolve_socket_addr ( ( host, port) . try_into ( ) ?)
207
+ // Otherwise, make the system look it up.
208
+ lookup_host ( host, port)
219
209
}
220
210
}
221
211
@@ -232,12 +222,21 @@ impl ToSocketAddrs for (String, u16) {
232
222
impl ToSocketAddrs for str {
233
223
type Iter = vec:: IntoIter < SocketAddr > ;
234
224
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
236
226
if let Ok ( addr) = self . parse ( ) {
237
227
return Ok ( vec ! [ addr] . into_iter ( ) ) ;
238
228
}
239
229
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)
241
240
}
242
241
}
243
242
0 commit comments