refactor(client): switch from net2 to socket2 (#2206)
net2 was recently deprecated; socket2 is the recommended alternative Closes #2205
This commit is contained in:
@@ -38,7 +38,7 @@ want = "0.3"
|
|||||||
|
|
||||||
# Optional
|
# Optional
|
||||||
|
|
||||||
net2 = { version = "0.2.32", optional = true }
|
socket2 = { version = "0.3", optional = true }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
futures-util = { version = "0.3", default-features = false, features = ["alloc"] }
|
futures-util = { version = "0.3", default-features = false, features = ["alloc"] }
|
||||||
@@ -65,7 +65,7 @@ runtime = [
|
|||||||
"tokio/rt-core",
|
"tokio/rt-core",
|
||||||
]
|
]
|
||||||
tcp = [
|
tcp = [
|
||||||
"net2",
|
"socket2",
|
||||||
"tokio/blocking",
|
"tokio/blocking",
|
||||||
"tokio/tcp",
|
"tokio/tcp",
|
||||||
"tokio/time",
|
"tokio/time",
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ use std::time::Duration;
|
|||||||
|
|
||||||
use futures_util::future::Either;
|
use futures_util::future::Either;
|
||||||
use http::uri::{Scheme, Uri};
|
use http::uri::{Scheme, Uri};
|
||||||
use net2::TcpBuilder;
|
|
||||||
use pin_project::pin_project;
|
use pin_project::pin_project;
|
||||||
use tokio::net::TcpStream;
|
use tokio::net::TcpStream;
|
||||||
use tokio::time::Delay;
|
use tokio::time::Delay;
|
||||||
@@ -552,30 +551,32 @@ fn connect(
|
|||||||
reuse_address: bool,
|
reuse_address: bool,
|
||||||
connect_timeout: Option<Duration>,
|
connect_timeout: Option<Duration>,
|
||||||
) -> io::Result<impl Future<Output = io::Result<TcpStream>>> {
|
) -> io::Result<impl Future<Output = io::Result<TcpStream>>> {
|
||||||
let builder = match *addr {
|
use socket2::{Domain, Protocol, Socket, Type};
|
||||||
SocketAddr::V4(_) => TcpBuilder::new_v4()?,
|
let domain = match *addr {
|
||||||
SocketAddr::V6(_) => TcpBuilder::new_v6()?,
|
SocketAddr::V4(_) => Domain::ipv4(),
|
||||||
|
SocketAddr::V6(_) => Domain::ipv6(),
|
||||||
};
|
};
|
||||||
|
let socket = Socket::new(domain, Type::stream(), Some(Protocol::tcp()))?;
|
||||||
|
|
||||||
if reuse_address {
|
if reuse_address {
|
||||||
builder.reuse_address(reuse_address)?;
|
socket.set_reuse_address(true)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(ref local_addr) = *local_addr {
|
if let Some(ref local_addr) = *local_addr {
|
||||||
// Caller has requested this socket be bound before calling connect
|
// Caller has requested this socket be bound before calling connect
|
||||||
builder.bind(SocketAddr::new(local_addr.clone(), 0))?;
|
socket.bind(&SocketAddr::new(local_addr.clone(), 0).into())?;
|
||||||
} else if cfg!(windows) {
|
} else if cfg!(windows) {
|
||||||
// Windows requires a socket be bound before calling connect
|
// Windows requires a socket be bound before calling connect
|
||||||
let any: SocketAddr = match *addr {
|
let any: SocketAddr = match *addr {
|
||||||
SocketAddr::V4(_) => ([0, 0, 0, 0], 0).into(),
|
SocketAddr::V4(_) => ([0, 0, 0, 0], 0).into(),
|
||||||
SocketAddr::V6(_) => ([0, 0, 0, 0, 0, 0, 0, 0], 0).into(),
|
SocketAddr::V6(_) => ([0, 0, 0, 0, 0, 0, 0, 0], 0).into(),
|
||||||
};
|
};
|
||||||
builder.bind(any)?;
|
socket.bind(&any.into())?;
|
||||||
}
|
}
|
||||||
|
|
||||||
let addr = *addr;
|
let addr = *addr;
|
||||||
|
|
||||||
let std_tcp = builder.to_tcp_stream()?;
|
let std_tcp = socket.into_tcp_stream();
|
||||||
|
|
||||||
Ok(async move {
|
Ok(async move {
|
||||||
let connect = TcpStream::connect_std(std_tcp, &addr);
|
let connect = TcpStream::connect_std(std_tcp, &addr);
|
||||||
|
|||||||
Reference in New Issue
Block a user