From 9f88bfcafa72944b555eb352744aff9a7d329bc7 Mon Sep 17 00:00:00 2001 From: Jun Kurihara Date: Tue, 2 Jul 2024 17:03:05 +0900 Subject: [PATCH 1/3] deps: h3-0.0.6 --- Cargo.toml | 2 +- rpxy-bin/Cargo.toml | 6 +-- rpxy-lib/Cargo.toml | 17 ++++---- rpxy-lib/src/error.rs | 5 ++- rpxy-lib/src/proxy/proxy_h3.rs | 10 ++--- submodules/s2n-quic-h3/Cargo.toml | 6 ++- submodules/s2n-quic-h3/src/s2n_quic.rs | 60 ++++++++++++++++++-------- 7 files changed, 70 insertions(+), 36 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index f51c4db3..355e5b14 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "0.8.0" +version = "0.8.1" authors = ["Jun Kurihara"] homepage = "https://github.com/junkurihara/rust-rpxy" repository = "https://github.com/junkurihara/rust-rpxy" diff --git a/rpxy-bin/Cargo.toml b/rpxy-bin/Cargo.toml index 19056928..24451f5d 100644 --- a/rpxy-bin/Cargo.toml +++ b/rpxy-bin/Cargo.toml @@ -13,8 +13,8 @@ publish.workspace = true # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [features] -default = ["http3-quinn", "cache", "rustls-backend"] -# default = ["http3-s2n", "cache", "rustls-backend"] +# default = ["http3-quinn", "cache", "rustls-backend"] +default = ["http3-s2n", "cache", "rustls-backend"] http3-quinn = ["rpxy-lib/http3-quinn"] http3-s2n = ["rpxy-lib/http3-s2n"] native-tls-backend = ["rpxy-lib/native-tls-backend"] @@ -42,7 +42,7 @@ async-trait = "0.1.80" # config -clap = { version = "4.5.7", features = ["std", "cargo", "wrap_help"] } +clap = { version = "4.5.8", features = ["std", "cargo", "wrap_help"] } toml = { version = "0.8.14", default-features = false, features = ["parse"] } hot_reload = "0.1.5" diff --git a/rpxy-lib/Cargo.toml b/rpxy-lib/Cargo.toml index ea8feb0f..1c8a657f 100644 --- a/rpxy-lib/Cargo.toml +++ b/rpxy-lib/Cargo.toml @@ -13,11 +13,10 @@ publish.workspace = true # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [features] -# default = ["http3-s2n", "sticky-cookie", "cache", "rustls-backend"] -default = ["http3-quinn", "sticky-cookie", "cache", "rustls-backend"] +default = ["http3-s2n", "sticky-cookie", "cache", "rustls-backend"] +# default = ["http3-quinn", "sticky-cookie", "cache", "rustls-backend"] http3-quinn = ["socket2", "quinn", "h3", "h3-quinn", "rpxy-certs/http3"] http3-s2n = [ - "h3", "s2n-quic", "s2n-quic-core", "s2n-quic-rustls", @@ -54,8 +53,8 @@ thiserror = "1.0.61" # http for both server and client http = "1.1.0" http-body-util = "0.1.2" -hyper = { version = "1.3.1", default-features = false } -hyper-util = { version = "0.1.5", features = ["full"] } +hyper = { version = "1.4.0", default-features = false } +hyper-util = { version = "0.1.6", features = ["full"] } futures-util = { version = "0.3.30", default-features = false } futures-channel = { version = "0.3.30", default-features = false } @@ -84,9 +83,11 @@ tracing = { version = "0.1.40" } # http/3 quinn = { version = "0.11.2", optional = true } -h3 = { version = "0.0.5", optional = true } -h3-quinn = { version = "0.0.6", optional = true } -s2n-quic-h3 = { path = "../submodules/s2n-quic-h3/", optional = true } +h3 = { version = "0.0.6", features = ["tracing"], optional = true } +h3-quinn = { version = "0.0.7", optional = true } +s2n-quic-h3 = { path = "../submodules/s2n-quic-h3/", features = [ + "tracing", +], optional = true } s2n-quic = { version = "1.41.0", default-features = false, features = [ "provider-tls-rustls", ], optional = true } diff --git a/rpxy-lib/src/error.rs b/rpxy-lib/src/error.rs index 0b7741f6..3eb09e49 100644 --- a/rpxy-lib/src/error.rs +++ b/rpxy-lib/src/error.rs @@ -36,9 +36,12 @@ pub enum RpxyError { HyperBodyError(#[from] hyper::Error), // http/3 errors - #[cfg(any(feature = "http3-quinn", feature = "http3-s2n"))] + #[cfg(feature = "http3-quinn")] #[error("H3 error: {0}")] H3Error(#[from] h3::Error), + #[cfg(feature = "http3-s2n")] + #[error("H3 error: {0}")] + H3Error(#[from] s2n_quic_h3::h3::Error), #[cfg(any(feature = "http3-quinn", feature = "http3-s2n"))] #[error("Exceeds max request body size for HTTP/3")] H3TooLargeBody, diff --git a/rpxy-lib/src/proxy/proxy_h3.rs b/rpxy-lib/src/proxy/proxy_h3.rs index 998b6ee8..358dd9e0 100644 --- a/rpxy-lib/src/proxy/proxy_h3.rs +++ b/rpxy-lib/src/proxy/proxy_h3.rs @@ -12,9 +12,9 @@ use hyper_util::client::legacy::connect::Connect; use std::net::SocketAddr; #[cfg(feature = "http3-quinn")] -use h3::{quic::BidiStream, quic::Connection as ConnectionQuic, server::RequestStream}; +use h3::{quic::BidiStream, quic::Connection as ConnectionQuic, quic::OpenStreams, server::RequestStream}; #[cfg(all(feature = "http3-s2n", not(feature = "http3-quinn")))] -use s2n_quic_h3::h3::{self, quic::BidiStream, quic::Connection as ConnectionQuic, server::RequestStream}; +use s2n_quic_h3::h3::{self, quic::BidiStream, quic::Connection as ConnectionQuic, quic::OpenStreams, server::RequestStream}; impl Proxy where @@ -28,9 +28,9 @@ where ) -> RpxyResult<()> where C: ConnectionQuic, - >::BidiStream: BidiStream + Send + 'static, - <>::BidiStream as BidiStream>::RecvStream: Send, - <>::BidiStream as BidiStream>::SendStream: Send, + >::BidiStream: BidiStream + Send + 'static, + <>::BidiStream as BidiStream>::RecvStream: Send, + <>::BidiStream as BidiStream>::SendStream: Send, { let mut h3_conn = h3::server::Connection::<_, Bytes>::new(quic_connection).await?; info!( diff --git a/submodules/s2n-quic-h3/Cargo.toml b/submodules/s2n-quic-h3/Cargo.toml index 23f9951a..f2a92dee 100644 --- a/submodules/s2n-quic-h3/Cargo.toml +++ b/submodules/s2n-quic-h3/Cargo.toml @@ -12,8 +12,12 @@ publish = false [dependencies] bytes = { version = "1", default-features = false } futures = { version = "0.3", default-features = false } -h3 = "0.0.5" +h3 = { version = "0.0.6", features = ["tracing"] } # s2n-quic = { path = "../s2n-quic" } # s2n-quic-core = { path = "../s2n-quic-core" } s2n-quic = { version = "1.41.0" } s2n-quic-core = { version = "0.41.0" } +tracing = { version = "0.1.40", optional = true } + +[features] +tracing = ["dep:tracing"] diff --git a/submodules/s2n-quic-h3/src/s2n_quic.rs b/submodules/s2n-quic-h3/src/s2n_quic.rs index e94a710e..abe0a332 100644 --- a/submodules/s2n-quic-h3/src/s2n_quic.rs +++ b/submodules/s2n-quic-h3/src/s2n_quic.rs @@ -13,6 +13,9 @@ use std::{ task::{self, Poll}, }; +#[cfg(feature = "tracing")] +use tracing::instrument; + pub struct Connection { conn: s2n_quic::connection::Handle, bidi_acceptor: s2n_quic::connection::BidirectionalStreamAcceptor, @@ -66,16 +69,15 @@ impl quic::Connection for Connection where B: Buf, { - type BidiStream = BidiStream; - type SendStream = SendStream; type RecvStream = RecvStream; type OpenStreams = OpenStreams; - type Error = ConnectionError; + type AcceptError = ConnectionError; + #[cfg_attr(feature = "tracing", instrument(skip_all, level = "trace"))] fn poll_accept_recv( &mut self, cx: &mut task::Context<'_>, - ) -> Poll, Self::Error>> { + ) -> Poll, Self::AcceptError>> { let recv = match ready!(self.recv_acceptor.poll_accept_receive_stream(cx))? { Some(x) => x, None => return Poll::Ready(Ok(None)), @@ -83,10 +85,11 @@ where Poll::Ready(Ok(Some(Self::RecvStream::new(recv)))) } + #[cfg_attr(feature = "tracing", instrument(skip_all, level = "trace"))] fn poll_accept_bidi( &mut self, cx: &mut task::Context<'_>, - ) -> Poll, Self::Error>> { + ) -> Poll, Self::AcceptError>> { let (recv, send) = match ready!(self.bidi_acceptor.poll_accept_bidirectional_stream(cx))? { Some(x) => x.split(), None => return Poll::Ready(Ok(None)), @@ -97,28 +100,41 @@ where }))) } + fn opener(&self) -> Self::OpenStreams { + OpenStreams { + conn: self.conn.clone(), + } + } +} + +impl quic::OpenStreams for Connection +where + B: Buf, +{ + type BidiStream = BidiStream; + type SendStream = SendStream; + type OpenError = ConnectionError; + + + #[cfg_attr(feature = "tracing", instrument(skip_all, level = "trace"))] fn poll_open_bidi( &mut self, cx: &mut task::Context<'_>, - ) -> Poll> { + ) -> Poll> { let stream = ready!(self.conn.poll_open_bidirectional_stream(cx))?; Ok(stream.into()).into() } + #[cfg_attr(feature = "tracing", instrument(skip_all, level = "trace"))] fn poll_open_send( &mut self, cx: &mut task::Context<'_>, - ) -> Poll> { + ) -> Poll> { let stream = ready!(self.conn.poll_open_send_stream(cx))?; Ok(stream.into()).into() } - fn opener(&self) -> Self::OpenStreams { - OpenStreams { - conn: self.conn.clone(), - } - } - + #[cfg_attr(feature = "tracing", instrument(skip_all, level = "trace"))] fn close(&mut self, code: h3::error::Code, _reason: &[u8]) { self.conn.close( code.value() @@ -138,25 +154,27 @@ where { type BidiStream = BidiStream; type SendStream = SendStream; - type RecvStream = RecvStream; - type Error = ConnectionError; + type OpenError = ConnectionError; + #[cfg_attr(feature = "tracing", instrument(skip_all, level = "trace"))] fn poll_open_bidi( &mut self, cx: &mut task::Context<'_>, - ) -> Poll> { + ) -> Poll> { let stream = ready!(self.conn.poll_open_bidirectional_stream(cx))?; Ok(stream.into()).into() } + #[cfg_attr(feature = "tracing", instrument(skip_all, level = "trace"))] fn poll_open_send( &mut self, cx: &mut task::Context<'_>, - ) -> Poll> { + ) -> Poll> { let stream = ready!(self.conn.poll_open_send_stream(cx))?; Ok(stream.into()).into() } + #[cfg_attr(feature = "tracing", instrument(skip_all, level = "trace"))] fn close(&mut self, code: h3::error::Code, _reason: &[u8]) { self.conn.close( code.value() @@ -271,6 +289,7 @@ impl quic::RecvStream for RecvStream { type Buf = Bytes; type Error = ReadError; + #[cfg_attr(feature = "tracing", instrument(skip_all, level = "trace"))] fn poll_data( &mut self, cx: &mut task::Context<'_>, @@ -279,6 +298,7 @@ impl quic::RecvStream for RecvStream { Ok(buf).into() } + #[cfg_attr(feature = "tracing", instrument(skip_all, level = "trace"))] fn stop_sending(&mut self, error_code: u64) { let _ = self.stream.stop_sending( s2n_quic::application::Error::new(error_code) @@ -286,6 +306,7 @@ impl quic::RecvStream for RecvStream { ); } + #[cfg_attr(feature = "tracing", instrument(skip_all, level = "trace"))] fn recv_id(&self) -> StreamId { self.stream.id().try_into().expect("invalid stream id") } @@ -369,6 +390,7 @@ where { type Error = SendStreamError; + #[cfg_attr(feature = "tracing", instrument(skip_all, level = "trace"))] fn poll_ready(&mut self, cx: &mut task::Context<'_>) -> Poll> { loop { // try to flush the current chunk if we have one @@ -409,6 +431,7 @@ where // Poll::Ready(Ok(())) } + #[cfg_attr(feature = "tracing", instrument(skip_all, level = "trace"))] fn send_data>>(&mut self, data: D) -> Result<(), Self::Error> { if self.buf.is_some() { return Err(Self::Error::NotReady); @@ -427,6 +450,7 @@ where // Ok(()) } + #[cfg_attr(feature = "tracing", instrument(skip_all, level = "trace"))] fn poll_finish(&mut self, cx: &mut task::Context<'_>) -> Poll> { // ensure all chunks are flushed to the QUIC stream before finishing ready!(self.poll_ready(cx))?; @@ -434,12 +458,14 @@ where Ok(()).into() } + #[cfg_attr(feature = "tracing", instrument(skip_all, level = "trace"))] fn reset(&mut self, reset_code: u64) { let _ = self .stream .reset(reset_code.try_into().unwrap_or_else(|_| VarInt::MAX.into())); } + #[cfg_attr(feature = "tracing", instrument(skip_all, level = "trace"))] fn send_id(&self) -> StreamId { self.stream.id().try_into().expect("invalid stream id") } From 393d25560fefad942a50891a373d6a52482a2a0d Mon Sep 17 00:00:00 2001 From: Jun Kurihara Date: Tue, 2 Jul 2024 17:04:28 +0900 Subject: [PATCH 2/3] fix default --- rpxy-bin/Cargo.toml | 4 ++-- rpxy-lib/Cargo.toml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/rpxy-bin/Cargo.toml b/rpxy-bin/Cargo.toml index 24451f5d..8c7df8f9 100644 --- a/rpxy-bin/Cargo.toml +++ b/rpxy-bin/Cargo.toml @@ -13,8 +13,8 @@ publish.workspace = true # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [features] -# default = ["http3-quinn", "cache", "rustls-backend"] -default = ["http3-s2n", "cache", "rustls-backend"] +default = ["http3-quinn", "cache", "rustls-backend"] +# default = ["http3-s2n", "cache", "rustls-backend"] http3-quinn = ["rpxy-lib/http3-quinn"] http3-s2n = ["rpxy-lib/http3-s2n"] native-tls-backend = ["rpxy-lib/native-tls-backend"] diff --git a/rpxy-lib/Cargo.toml b/rpxy-lib/Cargo.toml index 1c8a657f..c841d6af 100644 --- a/rpxy-lib/Cargo.toml +++ b/rpxy-lib/Cargo.toml @@ -13,8 +13,8 @@ publish.workspace = true # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [features] -default = ["http3-s2n", "sticky-cookie", "cache", "rustls-backend"] -# default = ["http3-quinn", "sticky-cookie", "cache", "rustls-backend"] +# default = ["http3-s2n", "sticky-cookie", "cache", "rustls-backend"] +default = ["http3-quinn", "sticky-cookie", "cache", "rustls-backend"] http3-quinn = ["socket2", "quinn", "h3", "h3-quinn", "rpxy-certs/http3"] http3-s2n = [ "s2n-quic", From e3af5c4917201c73432f960a17bb1e8c4563318a Mon Sep 17 00:00:00 2001 From: Jun Kurihara Date: Wed, 10 Jul 2024 11:05:03 +0900 Subject: [PATCH 3/3] chore: fix typo --- CHANGELOG.md | 7 +++++++ rpxy-bin/Cargo.toml | 6 +++--- rpxy-certs/Cargo.toml | 6 +++--- rpxy-lib/Cargo.toml | 13 +++++++------ rpxy-lib/src/error.rs | 8 ++++---- submodules/s2n-quic-h3/Cargo.toml | 4 ++-- 6 files changed, 26 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a6ea2460..53a74b1a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ ## 0.9.0 (Unreleased) +## 0.8.1 + +### Improvement + +- Refactor: lots of minor improvements +- Deps + ## 0.8.0 ### Important Changes diff --git a/rpxy-bin/Cargo.toml b/rpxy-bin/Cargo.toml index 8c7df8f9..d571d1e5 100644 --- a/rpxy-bin/Cargo.toml +++ b/rpxy-bin/Cargo.toml @@ -30,7 +30,7 @@ rpxy-lib = { path = "../rpxy-lib/", default-features = false, features = [ mimalloc = { version = "*", default-features = false } anyhow = "1.0.86" rustc-hash = "2.0.0" -serde = { version = "1.0.203", default-features = false, features = ["derive"] } +serde = { version = "1.0.204", default-features = false, features = ["derive"] } tokio = { version = "1.38.0", default-features = false, features = [ "net", "rt-multi-thread", @@ -38,11 +38,11 @@ tokio = { version = "1.38.0", default-features = false, features = [ "sync", "macros", ] } -async-trait = "0.1.80" +async-trait = "0.1.81" # config -clap = { version = "4.5.8", features = ["std", "cargo", "wrap_help"] } +clap = { version = "4.5.9", features = ["std", "cargo", "wrap_help"] } toml = { version = "0.8.14", default-features = false, features = ["parse"] } hot_reload = "0.1.5" diff --git a/rpxy-certs/Cargo.toml b/rpxy-certs/Cargo.toml index 0cb9a876..1370e0b4 100644 --- a/rpxy-certs/Cargo.toml +++ b/rpxy-certs/Cargo.toml @@ -20,13 +20,13 @@ tracing = { version = "0.1.40" } derive_builder = { version = "0.20.0" } thiserror = { version = "1.0.61" } hot_reload = { version = "0.1.5" } -async-trait = { version = "0.1.80" } -rustls = { version = "0.23.10", default-features = false, features = [ +async-trait = { version = "0.1.81" } +rustls = { version = "0.23.11", default-features = false, features = [ "std", "aws_lc_rs", ] } rustls-pemfile = { version = "2.1.2" } -rustls-webpki = { version = "0.102.4", default-features = false, features = [ +rustls-webpki = { version = "0.102.5", default-features = false, features = [ "std", "aws_lc_rs", ] } diff --git a/rpxy-lib/Cargo.toml b/rpxy-lib/Cargo.toml index c841d6af..669a81fb 100644 --- a/rpxy-lib/Cargo.toml +++ b/rpxy-lib/Cargo.toml @@ -22,6 +22,7 @@ http3-s2n = [ "s2n-quic-rustls", "s2n-quic-h3", "rpxy-certs/http3", + "h3", ] cache = ["http-cache-semantics", "lru", "sha2", "base64"] sticky-cookie = ["base64", "sha2", "chrono"] @@ -44,7 +45,7 @@ tokio = { version = "1.38.0", default-features = false, features = [ "fs", ] } pin-project-lite = "0.2.14" -async-trait = "0.1.80" +async-trait = "0.1.81" # Error handling anyhow = "1.0.86" @@ -53,7 +54,7 @@ thiserror = "1.0.61" # http for both server and client http = "1.1.0" http-body-util = "0.1.2" -hyper = { version = "1.4.0", default-features = false } +hyper = { version = "1.4.1", default-features = false } hyper-util = { version = "0.1.6", features = ["full"] } futures-util = { version = "0.3.30", default-features = false } futures-channel = { version = "0.3.30", default-features = false } @@ -75,7 +76,7 @@ hyper-rustls = { git = "https://github.com/junkurihara/hyper-rustls", branch = " # tls and cert management for server rpxy-certs = { path = "../rpxy-certs/", default-features = false } hot_reload = "0.1.5" -rustls = { version = "0.23.10", default-features = false } +rustls = { version = "0.23.11", default-features = false } tokio-rustls = { version = "0.26.0", features = ["early-data"] } # logging @@ -88,11 +89,11 @@ h3-quinn = { version = "0.0.7", optional = true } s2n-quic-h3 = { path = "../submodules/s2n-quic-h3/", features = [ "tracing", ], optional = true } -s2n-quic = { version = "1.41.0", default-features = false, features = [ +s2n-quic = { version = "1.42.0", default-features = false, features = [ "provider-tls-rustls", ], optional = true } -s2n-quic-core = { version = "0.41.0", default-features = false, optional = true } -s2n-quic-rustls = { version = "0.41.0", optional = true } +s2n-quic-core = { version = "0.42.0", default-features = false, optional = true } +s2n-quic-rustls = { version = "0.42.0", optional = true } ########## # for UDP socket wit SO_REUSEADDR when h3 with quinn socket2 = { version = "0.5.7", features = ["all"], optional = true } diff --git a/rpxy-lib/src/error.rs b/rpxy-lib/src/error.rs index 3eb09e49..98ebf031 100644 --- a/rpxy-lib/src/error.rs +++ b/rpxy-lib/src/error.rs @@ -36,12 +36,12 @@ pub enum RpxyError { HyperBodyError(#[from] hyper::Error), // http/3 errors - #[cfg(feature = "http3-quinn")] + #[cfg(any(feature = "http3-quinn", feature = "http3-s2n"))] #[error("H3 error: {0}")] H3Error(#[from] h3::Error), - #[cfg(feature = "http3-s2n")] - #[error("H3 error: {0}")] - H3Error(#[from] s2n_quic_h3::h3::Error), + // #[cfg(feature = "http3-s2n")] + // #[error("H3 error: {0}")] + // H3Error(#[from] s2n_quic_h3::h3::Error), #[cfg(any(feature = "http3-quinn", feature = "http3-s2n"))] #[error("Exceeds max request body size for HTTP/3")] H3TooLargeBody, diff --git a/submodules/s2n-quic-h3/Cargo.toml b/submodules/s2n-quic-h3/Cargo.toml index f2a92dee..4a0c725d 100644 --- a/submodules/s2n-quic-h3/Cargo.toml +++ b/submodules/s2n-quic-h3/Cargo.toml @@ -15,8 +15,8 @@ futures = { version = "0.3", default-features = false } h3 = { version = "0.0.6", features = ["tracing"] } # s2n-quic = { path = "../s2n-quic" } # s2n-quic-core = { path = "../s2n-quic-core" } -s2n-quic = { version = "1.41.0" } -s2n-quic-core = { version = "0.41.0" } +s2n-quic = { version = "1.42.0" } +s2n-quic-core = { version = "0.42.0" } tracing = { version = "0.1.40", optional = true } [features]