v0.35.1: performance, AGPL licensing and documentation overhaul

- Web Server reads static files inline; proxy middleware chain flattened
- About window with license summary and project links; AGPL-3.0-or-later
- Rewritten documentation: feature list, screenshots, performance guide
- Fix false spikes in per-Vhost request-rate charts
This commit is contained in:
gru committed 2026-11-05 18:29:56 +01:00
1 parent d3b492874b
commit eba9f89283
135 files changed
+1425 -1064

No files matched your search

+13 -14
View File
@@ -137,8 +137,8 @@ let origin_reason = (cache_ticket.is_some() && origin_plan.is_none()).then(|| {
let origin_no_transform = crate::transform::no_transform(response.headers());
let skip_compression = crate::compression::no_transform(response.headers());
let origin_validators = crate::transform::OriginValidators {
etag: response.headers().get("etag").cloned(),
last_modified: response.headers().get("last-modified").cloned(),
etag: response.headers().get(::http::header::ETAG).cloned(),
last_modified: response.headers().get(::http::header::LAST_MODIFIED).cloned(),
};
let (mut parts, body) = response.into_parts();
parts.extensions.insert(origin_validators);
@@ -147,8 +147,8 @@ if skip_compression || range_requested {
}
headers::strip_hop_by_hop(&mut parts.headers);
if websocket_legacy_support && handshake.is_some() {
parts.headers.remove("content-length");
parts.headers.remove("transfer-encoding");
parts.headers.remove(::http::header::CONTENT_LENGTH);
parts.headers.remove(::http::header::TRANSFER_ENCODING);
}
apply_response_rules(
&mut parts.headers,
@@ -161,7 +161,7 @@ if let Some(pool) = &route.pool {
pool.strip_affinity_response(&mut parts.headers);
}
if let Some(cookie) = active_affinity_cookie {
parts.headers.append("set-cookie", cookie);
parts.headers.append(::http::header::SET_COOKIE, cookie);
}
let h3_tunnel = handshake.as_ref().is_some_and(|handshake| handshake.h3())
&& upgraded.is_some();
@@ -208,9 +208,9 @@ let mut response = if h3_tunnel {
};
exchange.websocket_phase("tunnel_ready");
parts.status = StatusCode::OK;
parts.headers.remove("sec-websocket-accept");
parts.headers.remove("content-length");
parts.headers.remove("transfer-encoding");
parts.headers.remove(::http::header::SEC_WEBSOCKET_ACCEPT);
parts.headers.remove(::http::header::CONTENT_LENGTH);
parts.headers.remove(::http::header::TRANSFER_ENCODING);
parts.extensions.insert(crate::compression::Skip);
parts
.extensions
@@ -301,8 +301,8 @@ let mut response = if h3_tunnel {
"RustProxy: HTTP/2 WebSocket tunnel state unavailable\n",
);
};
parts.headers.remove("content-length");
parts.headers.remove("transfer-encoding");
parts.headers.remove(::http::header::CONTENT_LENGTH);
parts.headers.remove(::http::header::TRANSFER_ENCODING);
parts.extensions.insert(crate::compression::Skip);
Response::from_parts(
parts,
@@ -314,10 +314,10 @@ let mut response = if h3_tunnel {
{
parts
.headers
.insert("connection", HeaderValue::from_static("Upgrade"));
.insert(::http::header::CONNECTION, HeaderValue::from_static("Upgrade"));
parts
.headers
.insert("upgrade", HeaderValue::from_static("websocket"));
.insert(::http::header::UPGRADE, HeaderValue::from_static("websocket"));
websocket::spawn(
state.clone(),
downstream,
@@ -342,8 +342,7 @@ if intercept_origin_error {
Some(route),
admin_control_plane,
);
response.headers_mut().insert(
"cache-control",
response.headers_mut().insert(::http::header::CACHE_CONTROL,
HeaderValue::from_static("no-store"),
);
}