Bounded Debugging + Websocket Carriers + Carriers Negotiation

Co-Authored-By: brekotis <93345790+brekotis@users.noreply.github.com>
This commit is contained in:
Alexey
2026-08-26 17:00:20 +03:00
parent 43cd84aaa5
commit 923c79796a
52 changed files with 3450 additions and 980 deletions
+32 -18
View File
@@ -200,7 +200,6 @@ impl AsyncRead for ConnectionIo {
Poll::Ready(Ok(())) => {
let filled = limited.filled().len();
boundary.observe(limited.filled());
drop(limited);
buffer.advance(filled);
Poll::Ready(Ok(()))
}
@@ -244,6 +243,7 @@ struct ParsedUpgrade {
protocol: String,
accept: String,
carrier: ParsedCarrier,
acknowledge_commit: bool,
}
pub(super) async fn handle(
@@ -325,6 +325,7 @@ pub(super) async fn handle(
connection,
lane_reservation.take(),
trace_context,
parsed.acknowledge_commit,
)
.await;
});
@@ -376,21 +377,18 @@ fn parse_upgrade<B>(request: &Request<B>) -> Option<ParsedUpgrade> {
{
return None;
}
let (token, carrier) = if let Some(token) = protocol.strip_prefix("tproxy-v1.") {
(token, ParsedCarrier::Multiplex)
let (token, carrier, acknowledge_commit) = if let Some(token) =
protocol.strip_prefix("tproxy-auto-v1.")
{
(token, ParsedCarrier::Multiplex, true)
} else if let Some(lane) = protocol.strip_prefix("tproxy-auto-lane-v1.") {
let (token, lane_id) = parse_lane_protocol(lane)?;
(token, ParsedCarrier::Lane(lane_id), true)
} else if let Some(token) = protocol.strip_prefix("tproxy-v1.") {
(token, ParsedCarrier::Multiplex, false)
} else if let Some(lane) = protocol.strip_prefix("tproxy-lane-v1.") {
let (token, lane_id) = lane.split_once('.')?;
if lane_id.is_empty()
|| lane_id.starts_with('+')
|| (lane_id.len() > 1 && lane_id.starts_with('0'))
{
return None;
}
let lane_id = lane_id
.parse::<u32>()
.ok()
.filter(|value| (1..=crate::web::frame::MAX_STREAM_ID).contains(value))?;
(token, ParsedCarrier::Lane(lane_id))
let (token, lane_id) = parse_lane_protocol(lane)?;
(token, ParsedCarrier::Lane(lane_id), false)
} else {
return None;
};
@@ -412,13 +410,29 @@ fn parse_upgrade<B>(request: &Request<B>) -> Option<ParsedUpgrade> {
protocol: protocol.to_string(),
accept: base64::engine::general_purpose::STANDARD.encode(accept.finalize()),
carrier,
acknowledge_commit,
})
}
fn single_header<'a, B>(
request: &'a Request<B>,
fn parse_lane_protocol(value: &str) -> Option<(&str, u32)> {
let (token, lane_id) = value.split_once('.')?;
if lane_id.is_empty()
|| lane_id.starts_with('+')
|| (lane_id.len() > 1 && lane_id.starts_with('0'))
{
return None;
}
let lane_id = lane_id
.parse::<u32>()
.ok()
.filter(|value| (1..=crate::web::frame::MAX_STREAM_ID).contains(value))?;
Some((token, lane_id))
}
fn single_header<B>(
request: &Request<B>,
name: impl hyper::header::AsHeaderName,
) -> Option<&'a str> {
) -> Option<&str> {
let mut values = request.headers().get_all(name).iter();
let value = values.next()?.to_str().ok()?;
values.next().is_none().then_some(value)