use http::HeaderMap;
use pingora_http::{RequestHeader, ResponseHeader};
use praxis_core::next_hop_headers::{
HopByHopTarget, StripHopByHopOptions, UpgradePreserve, strip_hop_by_hop, strip_reserved, strip_reserved_target,
};
pub(crate) const REQUEST_HOP_BY_HOP: &[&str] = praxis_core::reserved_headers::HOP_BY_HOP_HEADERS;
pub(crate) const RESPONSE_HOP_BY_HOP: &[&str] = praxis_core::reserved_headers::RESPONSE_HOP_BY_HOP_HEADERS;
pub(crate) use praxis_core::next_hop_headers::has_websocket_upgrade;
pub(crate) fn strip_hop_by_hop_header_map(headers: &mut HeaderMap, static_list: &[&str]) {
strip_hop_by_hop(
headers,
StripHopByHopOptions {
static_headers: static_list,
upgrade: UpgradePreserve::None,
restore_chunked_framing: false,
suppress_chunked_restore_on_websocket: false,
},
);
}
pub(crate) fn strip_reserved_internal_header_map(headers: &mut HeaderMap) {
strip_reserved(headers);
}
pub(crate) struct RequestHop<'a>(pub &'a mut RequestHeader);
impl HopByHopTarget for RequestHop<'_> {
fn headers(&self) -> &HeaderMap {
&self.0.headers
}
fn remove_by_name(&mut self, name: &str) {
drop(self.0.remove_header(name));
}
fn insert_transfer_encoding_chunked(&mut self) {
drop(self.0.insert_header(http::header::TRANSFER_ENCODING, "chunked"));
}
}
pub(crate) struct ResponseHop<'a>(pub &'a mut ResponseHeader);
impl HopByHopTarget for ResponseHop<'_> {
fn headers(&self) -> &HeaderMap {
&self.0.headers
}
fn remove_by_name(&mut self, name: &str) {
drop(self.0.remove_header(name));
}
fn insert_transfer_encoding_chunked(&mut self) {
drop(self.0.insert_header(http::header::TRANSFER_ENCODING, "chunked"));
}
}
pub(crate) trait RemoveHeader {
fn strip_reserved_internal(&mut self);
}
impl RemoveHeader for RequestHeader {
fn strip_reserved_internal(&mut self) {
strip_reserved_target(&mut RequestHop(self));
}
}
impl RemoveHeader for ResponseHeader {
fn strip_reserved_internal(&mut self) {
strip_reserved_target(&mut ResponseHop(self));
}
}