v0.31.0
This commit is contained in:
1 parent
f213d853e2
commit
76b8bb7ee2
78 files changed
+7750
-5204
No files matched your search
@@ -0,0 +1,56 @@
|
||||
// Shared immutable precompressed responses for private panel HTML and assets.
|
||||
// Each embedded document is encoded once on first request, never per visitor.
|
||||
use crate::settings::PanelCompression;
|
||||
use axum::{body::Body, response::Response};
|
||||
use bytes::Bytes;
|
||||
use flate2::{write::GzEncoder, Compression};
|
||||
use http::{header, HeaderMap, HeaderValue};
|
||||
use std::io::Write;
|
||||
|
||||
pub(super) struct PanelContent {
|
||||
plain: Bytes,
|
||||
gzip: Bytes,
|
||||
brotli: Bytes,
|
||||
zstd: Bytes,
|
||||
}
|
||||
|
||||
impl PanelContent {
|
||||
pub(super) fn new(raw: &'static str) -> Self {
|
||||
let mut gzip = GzEncoder::new(Vec::new(), Compression::default());
|
||||
gzip.write_all(raw.as_bytes()).expect("compress panel gzip");
|
||||
let gzip = Bytes::from(gzip.finish().expect("finish panel gzip"));
|
||||
let mut br = Vec::new();
|
||||
{
|
||||
let mut writer = brotli::CompressorWriter::new(&mut br, 4096, 5, 22);
|
||||
writer.write_all(raw.as_bytes()).expect("compress panel Brotli");
|
||||
}
|
||||
let zstd = zstd::stream::encode_all(raw.as_bytes(), 3).expect("compress panel zstd");
|
||||
Self { plain: Bytes::from_static(raw.as_bytes()), gzip, brotli: Bytes::from(br), zstd: Bytes::from(zstd) }
|
||||
}
|
||||
|
||||
pub(super) fn response(&self, headers: &HeaderMap, codecs: &PanelCompression, mime: &'static str) -> Response {
|
||||
let settings = crate::compression::Settings {
|
||||
gzip: codecs.gzip, br: codecs.br, zstd: codecs.zstd,
|
||||
deflate: false, min_bytes: 1024,
|
||||
};
|
||||
let encoding = if crate::compression::no_transform(headers) {
|
||||
None
|
||||
} else {
|
||||
crate::compression::preferred_encoding(headers, &settings)
|
||||
};
|
||||
let (body, name) = match encoding.map(|codec| codec.as_str()) {
|
||||
Some("zstd") => (self.zstd.clone(), Some("zstd")),
|
||||
Some("br") => (self.brotli.clone(), Some("br")),
|
||||
Some("gzip") => (self.gzip.clone(), Some("gzip")),
|
||||
_ => (self.plain.clone(), None),
|
||||
};
|
||||
let mut response = Response::new(Body::from(body.clone()));
|
||||
response.headers_mut().insert(header::CONTENT_TYPE, HeaderValue::from_static(mime));
|
||||
response.headers_mut().insert(header::CONTENT_LENGTH, HeaderValue::from_str(&body.len().to_string()).expect("valid length"));
|
||||
if let Some(name) = name {
|
||||
response.headers_mut().insert(header::CONTENT_ENCODING, HeaderValue::from_static(name));
|
||||
}
|
||||
response.headers_mut().insert(header::VARY, HeaderValue::from_static("Accept-Encoding"));
|
||||
response
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user