diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index c69589c..ab22cdd 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -60,7 +60,7 @@ jobs: needs: [style] strategy: matrix: - rust: [ 1.64 ] # keep in sync with 'rust-version' in Cargo.toml + rust: [ 1.85 ] # keep in sync with 'rust-version' in Cargo.toml os: - ubuntu-latest - windows-latest diff --git a/Cargo.toml b/Cargo.toml index 183e35c..e958f49 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,8 +10,8 @@ license = "MIT" authors = ["Sean McArthur "] keywords = ["http", "hyper", "hyperium"] categories = ["network-programming", "web-programming::http-client", "web-programming::http-server"] -edition = "2021" -rust-version = "1.64" +edition = "2024" +rust-version = "1.85" [package.metadata.docs.rs] features = ["full"] diff --git a/examples/client.rs b/examples/client.rs index 04defac..e4c0109 100644 --- a/examples/client.rs +++ b/examples/client.rs @@ -2,7 +2,7 @@ use std::env; use http_body_util::Empty; use hyper::Request; -use hyper_util::client::legacy::{connect::HttpConnector, Client}; +use hyper_util::client::legacy::{Client, connect::HttpConnector}; #[tokio::main(flavor = "current_thread")] async fn main() -> Result<(), Box> { diff --git a/examples/server.rs b/examples/server.rs index 48806d8..514a688 100644 --- a/examples/server.rs +++ b/examples/server.rs @@ -3,8 +3,8 @@ use std::{convert::Infallible, error::Error}; use bytes::Bytes; -use http::{header::CONTENT_TYPE, Request, Response}; -use http_body_util::{combinators::BoxBody, BodyExt, Full}; +use http::{Request, Response, header::CONTENT_TYPE}; +use http_body_util::{BodyExt, Full, combinators::BoxBody}; use hyper::{body::Incoming, service::service_fn}; use hyper_util::{ rt::{TokioExecutor, TokioIo}, diff --git a/src/client/legacy/client.rs b/src/client/legacy/client.rs index fb38c16..7bd9915 100644 --- a/src/client/legacy/client.rs +++ b/src/client/legacy/client.rs @@ -6,7 +6,7 @@ use std::error::Error as StdError; use std::fmt; -use std::future::{poll_fn, Future}; +use std::future::{Future, poll_fn}; use std::pin::Pin; use std::task::{self, Poll}; use std::time::Duration; @@ -14,18 +14,18 @@ use std::time::Duration; use futures_util::future::{self, Either, FutureExt, TryFutureExt}; use http::uri::Scheme; use hyper::client::conn::TrySendError as ConnTrySendError; -use hyper::header::{HeaderValue, HOST}; +use hyper::header::{HOST, HeaderValue}; use hyper::rt::Timer; -use hyper::{body::Body, Method, Request, Response, Uri, Version}; +use hyper::{Method, Request, Response, Uri, Version, body::Body}; use tracing::{debug, trace, warn}; -use super::connect::capture::CaptureConnectionExtension; #[cfg(feature = "tokio")] use super::connect::HttpConnector; +use super::connect::capture::CaptureConnectionExtension; use super::connect::{Alpn, Connect, Connected, Connection}; use super::pool::{self, Ver}; -use crate::common::{lazy as hyper_lazy, timer, Exec, Lazy, SyncWrapper}; +use crate::common::{Exec, Lazy, SyncWrapper, lazy as hyper_lazy, timer}; type BoxSendFuture = Pin + Send>>; @@ -484,7 +484,7 @@ where fn connect_to( &self, pool_key: PoolKey, - ) -> impl Lazy, PoolKey>, Error>> + Send + Unpin + ) -> impl Lazy, PoolKey>, Error>> + Send + Unpin + use { let executor = self.exec.clone(); let pool = self.pool.clone(); diff --git a/src/client/legacy/connect/capture.rs b/src/client/legacy/connect/capture.rs index 67b2a5a..e57fd97 100644 --- a/src/client/legacy/connect/capture.rs +++ b/src/client/legacy/connect/capture.rs @@ -131,18 +131,20 @@ mod test { "connection has not been set" ); tx.set(&Connected::new().proxy(true)); - assert!(rx - .connection_metadata() - .as_ref() - .expect("connected should be set") - .is_proxied()); + assert!( + rx.connection_metadata() + .as_ref() + .expect("connected should be set") + .is_proxied() + ); // ensure it can be called multiple times - assert!(rx - .connection_metadata() - .as_ref() - .expect("connected should be set") - .is_proxied()); + assert!( + rx.connection_metadata() + .as_ref() + .expect("connected should be set") + .is_proxied() + ); } #[tokio::test] @@ -153,12 +155,13 @@ mod test { "connection has not been set" ); let test_task = tokio::spawn(async move { - assert!(rx - .wait_for_connection_metadata() - .await - .as_ref() - .expect("connection should be set") - .is_proxied()); + assert!( + rx.wait_for_connection_metadata() + .await + .as_ref() + .expect("connection should be set") + .is_proxied() + ); // can be awaited multiple times assert!( rx.wait_for_connection_metadata().await.is_some(), diff --git a/src/client/legacy/connect/http.rs b/src/client/legacy/connect/http.rs index 00d6566..bd60880 100644 --- a/src/client/legacy/connect/http.rs +++ b/src/client/legacy/connect/http.rs @@ -6,7 +6,7 @@ use std::marker::PhantomData; use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}; use std::pin::Pin; use std::sync::Arc; -use std::task::{self, ready, Poll}; +use std::task::{self, Poll, ready}; use std::time::Duration; use futures_util::future::Either; @@ -17,7 +17,7 @@ use tokio::net::{TcpSocket, TcpStream}; use tokio::time::Sleep; use tracing::{debug, trace, warn}; -use super::dns::{self, resolve, GaiResolver, Resolve}; +use super::dns::{self, GaiResolver, Resolve, resolve}; use super::{Connected, Connection}; use crate::rt::TokioIo; @@ -114,11 +114,7 @@ impl TcpKeepaliveConfig { if let Some(retries) = self.retries { ka = Self::ka_with_retries(ka, retries, &mut dirty) }; - if dirty { - Some(ka) - } else { - None - } + if dirty { Some(ka) } else { None } } #[cfg( @@ -1169,8 +1165,8 @@ mod tests { use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, TcpListener}; use std::time::{Duration, Instant}; - use super::dns; use super::ConnectingTcp; + use super::dns; let server4 = TcpListener::bind("127.0.0.1:0").unwrap(); let addr = server4.local_addr().unwrap(); diff --git a/src/client/legacy/connect/mod.rs b/src/client/legacy/connect/mod.rs index 90a9767..0c9b363 100644 --- a/src/client/legacy/connect/mod.rs +++ b/src/client/legacy/connect/mod.rs @@ -65,8 +65,8 @@ use std::{ fmt::{self, Formatter}, sync::{ - atomic::{AtomicBool, Ordering}, Arc, + atomic::{AtomicBool, Ordering}, }, }; @@ -83,7 +83,7 @@ mod http; pub mod proxy; pub(crate) mod capture; -pub use capture::{capture_connection, CaptureConnection}; +pub use capture::{CaptureConnection, capture_connection}; pub use self::sealed::Connect; diff --git a/src/client/legacy/connect/proxy/socks/v5/messages.rs b/src/client/legacy/connect/proxy/socks/v5/messages.rs index fae30cb..bdad540 100644 --- a/src/client/legacy/connect/proxy/socks/v5/messages.rs +++ b/src/client/legacy/connect/proxy/socks/v5/messages.rs @@ -152,7 +152,7 @@ impl ProxyReq<'_> { let addr_len = match self.0 { Address::Socket(SocketAddr::V4(_)) => 1 + 4 + 2, Address::Socket(SocketAddr::V6(_)) => 1 + 16 + 2, - Address::Domain(ref domain, _) => 1 + 1 + domain.len() + 2, + Address::Domain(domain, _) => 1 + 1 + domain.len() + 2, }; if buf.capacity() - buf.len() < 3 + addr_len { diff --git a/src/client/legacy/connect/proxy/tunnel.rs b/src/client/legacy/connect/proxy/tunnel.rs index d114044..3d80a7a 100644 --- a/src/client/legacy/connect/proxy/tunnel.rs +++ b/src/client/legacy/connect/proxy/tunnel.rs @@ -2,7 +2,7 @@ use std::error::Error as StdError; use std::future::Future; use std::marker::{PhantomData, Unpin}; use std::pin::Pin; -use std::task::{self, ready, Poll}; +use std::task::{self, Poll, ready}; use http::{HeaderMap, HeaderValue, Uri}; use hyper::rt::{Read, Write}; @@ -249,8 +249,8 @@ impl std::fmt::Display for TunnelError { impl std::error::Error for TunnelError { fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { match self { - TunnelError::Io(ref e) => Some(e), - TunnelError::ConnectFailed(ref e) => Some(&**e), + TunnelError::Io(e) => Some(e), + TunnelError::ConnectFailed(e) => Some(&**e), _ => None, } } diff --git a/src/client/legacy/pool.rs b/src/client/legacy/pool.rs index 156f057..8c027da 100644 --- a/src/client/legacy/pool.rs +++ b/src/client/legacy/pool.rs @@ -9,7 +9,7 @@ use std::hash::Hash; use std::ops::{Deref, DerefMut}; use std::pin::Pin; use std::sync::{Arc, Mutex, Weak}; -use std::task::{self, ready, Poll}; +use std::task::{self, Poll, ready}; use std::time::{Duration, Instant}; @@ -1032,8 +1032,8 @@ mod tests { #[tokio::test] async fn test_pool_checkout_task_unparked() { - use futures_util::future::join; use futures_util::FutureExt; + use futures_util::future::join; let pool = pool_no_timer(); let key = host_key("foo"); diff --git a/src/client/pool/cache.rs b/src/client/pool/cache.rs index 45f5336..699fe6f 100644 --- a/src/client/pool/cache.rs +++ b/src/client/pool/cache.rs @@ -22,7 +22,7 @@ mod internal { use std::future::Future; use std::pin::Pin; use std::sync::{Arc, Mutex, Weak}; - use std::task::{self, ready, Poll}; + use std::task::{self, Poll, ready}; use futures_util::future; use tokio::sync::oneshot; diff --git a/src/client/pool/negotiate.rs b/src/client/pool/negotiate.rs index 90dfcf8..6b09f8e 100644 --- a/src/client/pool/negotiate.rs +++ b/src/client/pool/negotiate.rs @@ -49,7 +49,7 @@ mod internal { use std::future::Future; use std::pin::Pin; use std::sync::{Arc, Mutex}; - use std::task::{self, ready, Poll}; + use std::task::{self, Poll, ready}; use pin_project_lite::pin_project; use tower_layer::Layer; @@ -353,7 +353,7 @@ mod internal { /// Get a reference to the fallback service if this is it. pub fn fallback_ref(&self) -> Option<&L> { - if let Negotiated::Fallback(ref left) = self { + if let Negotiated::Fallback(left) = self { Some(left) } else { None @@ -362,7 +362,7 @@ mod internal { /// Get a mutable reference to the fallback service if this is it. pub fn fallback_mut(&mut self) -> Option<&mut L> { - if let Negotiated::Fallback(ref mut left) = self { + if let Negotiated::Fallback(left) = self { Some(left) } else { None @@ -371,7 +371,7 @@ mod internal { /// Get a reference to the upgraded service if this is it. pub fn upgraded_ref(&self) -> Option<&R> { - if let Negotiated::Upgraded(ref right) = self { + if let Negotiated::Upgraded(right) = self { Some(right) } else { None @@ -380,7 +380,7 @@ mod internal { /// Get a mutable reference to the upgraded service if this is it. pub fn upgraded_mut(&mut self) -> Option<&mut R> { - if let Negotiated::Upgraded(ref mut right) = self { + if let Negotiated::Upgraded(right) = self { Some(right) } else { None @@ -399,17 +399,17 @@ mod internal { fn poll_ready(&mut self, cx: &mut task::Context<'_>) -> Poll> { match self { - Negotiated::Fallback(ref mut s) => s.poll_ready(cx), - Negotiated::Upgraded(ref mut s) => s.poll_ready(cx), + Negotiated::Fallback(s) => s.poll_ready(cx), + Negotiated::Upgraded(s) => s.poll_ready(cx), } } fn call(&mut self, req: Req) -> Self::Future { match self { - Negotiated::Fallback(ref mut s) => NegotiatedFuture::Fallback { + Negotiated::Fallback(s) => NegotiatedFuture::Fallback { future: s.call(req), }, - Negotiated::Upgraded(ref mut s) => NegotiatedFuture::Upgraded { + Negotiated::Upgraded(s) => NegotiatedFuture::Upgraded { future: s.call(req), }, } diff --git a/src/client/pool/singleton.rs b/src/client/pool/singleton.rs index b39d494..ac6bb23 100644 --- a/src/client/pool/singleton.rs +++ b/src/client/pool/singleton.rs @@ -152,7 +152,7 @@ mod internal { use std::future::Future; use std::pin::Pin; use std::sync::{Mutex, Weak}; - use std::task::{self, ready, Poll}; + use std::task::{self, Poll, ready}; use pin_project_lite::pin_project; use tokio::sync::oneshot; diff --git a/src/client/proxy/matcher.rs b/src/client/proxy/matcher.rs index bc488e1..b91b7aa 100644 --- a/src/client/proxy/matcher.rs +++ b/src/client/proxy/matcher.rs @@ -905,25 +905,31 @@ mod tests { }; // should bypass proxy (case insensitive match) - assert!(p - .intercept(&"http://example.com".parse().unwrap()) - .is_none()); - assert!(p - .intercept(&"http://EXAMPLE.COM".parse().unwrap()) - .is_none()); - assert!(p - .intercept(&"http://Example.com".parse().unwrap()) - .is_none()); + assert!( + p.intercept(&"http://example.com".parse().unwrap()) + .is_none() + ); + assert!( + p.intercept(&"http://EXAMPLE.COM".parse().unwrap()) + .is_none() + ); + assert!( + p.intercept(&"http://Example.com".parse().unwrap()) + .is_none() + ); // subdomain should bypass proxy (case insensitive match) - assert!(p - .intercept(&"http://www.example.com".parse().unwrap()) - .is_none()); - assert!(p - .intercept(&"http://WWW.EXAMPLE.COM".parse().unwrap()) - .is_none()); - assert!(p - .intercept(&"http://Www.Example.Com".parse().unwrap()) - .is_none()); + assert!( + p.intercept(&"http://www.example.com".parse().unwrap()) + .is_none() + ); + assert!( + p.intercept(&"http://WWW.EXAMPLE.COM".parse().unwrap()) + .is_none() + ); + assert!( + p.intercept(&"http://Www.Example.Com".parse().unwrap()) + .is_none() + ); } } diff --git a/src/common/mod.rs b/src/common/mod.rs index 6586aab..bcd7d47 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -14,6 +14,6 @@ pub(crate) mod timer; pub(crate) use exec::Exec; #[cfg(feature = "client-legacy")] -pub(crate) use lazy::{lazy, Started as Lazy}; +pub(crate) use lazy::{Started as Lazy, lazy}; #[cfg(feature = "client-legacy")] pub(crate) use sync::SyncWrapper; diff --git a/src/rt/io.rs b/src/rt/io.rs index 0546663..825b2c9 100644 --- a/src/rt/io.rs +++ b/src/rt/io.rs @@ -1,6 +1,6 @@ use std::marker::Unpin; use std::pin::Pin; -use std::task::{ready, Poll}; +use std::task::{Poll, ready}; use hyper::rt::{Read, ReadBuf, Write}; diff --git a/src/server/conn/auto/mod.rs b/src/server/conn/auto/mod.rs index 01ec8e1..bdadf4b 100644 --- a/src/server/conn/auto/mod.rs +++ b/src/server/conn/auto/mod.rs @@ -7,7 +7,7 @@ use std::future::Future; use std::marker::PhantomPinned; use std::mem::MaybeUninit; use std::pin::Pin; -use std::task::{ready, Context, Poll}; +use std::task::{Context, Poll, ready}; use std::{error::Error as StdError, io, time::Duration}; use bytes::Bytes; @@ -407,7 +407,7 @@ impl std::ops::Deref for Cow<'_, T> { fn deref(&self) -> &T { match self { Cow::Borrowed(t) => &*t, - Cow::Owned(ref t) => t, + Cow::Owned(t) => t, } } } diff --git a/src/server/graceful.rs b/src/server/graceful.rs index b367fc8..f55521b 100644 --- a/src/server/graceful.rs +++ b/src/server/graceful.rs @@ -39,7 +39,10 @@ impl GracefulShutdown { } /// Wrap a future for graceful shutdown watching. - pub fn watch(&self, conn: C) -> impl Future { + pub fn watch( + &self, + conn: C, + ) -> impl Future + use { self.watcher().watch(conn) } @@ -273,9 +276,9 @@ mod private { impl Sealed for crate::server::conn::auto::Connection<'_, I, S, E> where S: hyper::service::Service< - http::Request, - Response = http::Response, - >, + http::Request, + Response = http::Response, + >, S::Error: Into>, S::Future: 'static, I: hyper::rt::Read + hyper::rt::Write + Unpin + 'static, @@ -289,9 +292,9 @@ mod private { impl Sealed for crate::server::conn::auto::UpgradeableConnection<'_, I, S, E> where S: hyper::service::Service< - http::Request, - Response = http::Response, - >, + http::Request, + Response = http::Response, + >, S::Error: Into>, S::Future: 'static, I: hyper::rt::Read + hyper::rt::Write + Unpin + Send + 'static, @@ -306,8 +309,8 @@ mod private { mod test { use super::*; use pin_project_lite::pin_project; - use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::Arc; + use std::sync::atomic::{AtomicUsize, Ordering}; pin_project! { #[derive(Debug)] diff --git a/src/service/oneshot.rs b/src/service/oneshot.rs index 2b15e72..c2fe22f 100644 --- a/src/service/oneshot.rs +++ b/src/service/oneshot.rs @@ -1,7 +1,7 @@ use pin_project_lite::pin_project; use std::future::Future; use std::pin::Pin; -use std::task::{ready, Context, Poll}; +use std::task::{Context, Poll, ready}; use tower_service::Service; // Vendored from tower::util to reduce dependencies, the code is small enough. diff --git a/tests/legacy_client.rs b/tests/legacy_client.rs index 8f887c9..5d12e2b 100644 --- a/tests/legacy_client.rs +++ b/tests/legacy_client.rs @@ -5,8 +5,8 @@ mod test_utils; use std::io::{Read, Write}; use std::net::{SocketAddr, TcpListener}; use std::pin::Pin; -use std::sync::atomic::Ordering; use std::sync::Arc; +use std::sync::atomic::Ordering; use std::task::Poll; use std::thread; use std::time::Duration; @@ -19,11 +19,11 @@ use http_body_util::BodyExt; use http_body_util::{Empty, Full, StreamBody}; use tokio::io::{AsyncReadExt, AsyncWriteExt}; +use hyper::Request; use hyper::body::Bytes; use hyper::body::Frame; -use hyper::Request; -use hyper_util::client::legacy::connect::{capture_connection, HttpConnector}; use hyper_util::client::legacy::Client; +use hyper_util::client::legacy::connect::{HttpConnector, capture_connection}; use hyper_util::rt::{TokioExecutor, TokioIo}; use test_utils::{DebugConnector, DebugStream}; @@ -1017,23 +1017,25 @@ fn connection_poisoning() { let num_requests: Arc = Default::default(); let num_requests_tracker = num_requests.clone(); let num_conns_tracker = num_conns.clone(); - thread::spawn(move || loop { - let mut sock = server.accept().unwrap().0; - num_conns_tracker.fetch_add(1, Ordering::Relaxed); - let num_requests_tracker = num_requests_tracker.clone(); - thread::spawn(move || { - sock.set_read_timeout(Some(Duration::from_secs(5))).unwrap(); - sock.set_write_timeout(Some(Duration::from_secs(5))) - .unwrap(); - let mut buf = [0; 4096]; - loop { - if sock.read(&mut buf).expect("read 1") > 0 { - num_requests_tracker.fetch_add(1, Ordering::Relaxed); - sock.write_all(b"HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n") - .expect("write 1"); + thread::spawn(move || { + loop { + let mut sock = server.accept().unwrap().0; + num_conns_tracker.fetch_add(1, Ordering::Relaxed); + let num_requests_tracker = num_requests_tracker.clone(); + thread::spawn(move || { + sock.set_read_timeout(Some(Duration::from_secs(5))).unwrap(); + sock.set_write_timeout(Some(Duration::from_secs(5))) + .unwrap(); + let mut buf = [0; 4096]; + loop { + if sock.read(&mut buf).expect("read 1") > 0 { + num_requests_tracker.fetch_add(1, Ordering::Relaxed); + sock.write_all(b"HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n") + .expect("write 1"); + } } - } - }); + }); + } }); let make_request = || { Request::builder() diff --git a/tests/proxy.rs b/tests/proxy.rs index 2b2d398..2c804e9 100644 --- a/tests/proxy.rs +++ b/tests/proxy.rs @@ -4,8 +4,8 @@ use tokio::io::{AsyncReadExt, AsyncWriteExt}; use tokio::net::{TcpListener, TcpStream}; use tower_service::Service; -use hyper_util::client::legacy::connect::proxy::{SocksV4, SocksV5, Tunnel}; use hyper_util::client::legacy::connect::HttpConnector; +use hyper_util::client::legacy::connect::proxy::{SocksV4, SocksV5, Tunnel}; #[cfg(not(miri))] #[tokio::test] diff --git a/tests/test_utils/mod.rs b/tests/test_utils/mod.rs index ee062b3..6ec4da9 100644 --- a/tests/test_utils/mod.rs +++ b/tests/test_utils/mod.rs @@ -1,7 +1,7 @@ use std::future::Future; use std::pin::Pin; -use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::Arc; +use std::sync::atomic::{AtomicUsize, Ordering}; use std::task::{Context, Poll}; use futures_channel::mpsc;