#[cfg(feature = "tls")]
use crate::application::tls::RemoteAddr;
use axum::extract::ConnectInfo;
use axum::http::HeaderMap;
use hyper::header::CONTENT_TYPE;
use hyper::Request;
use opentelemetry::{global::get_text_map_propagator, Context};
use opentelemetry_http::HeaderExtractor;
use std::net::SocketAddr;
#[cfg(not(feature = "tls"))]
pub fn extract_remote_address<B>(request: &Request<B>) -> Option<&SocketAddr> {
request
.extensions()
.get::<ConnectInfo<SocketAddr>>()
.map(|ConnectInfo(addr)| addr)
}
#[cfg(feature = "tls")]
pub fn extract_remote_address<B>(request: &Request<B>) -> Option<&SocketAddr> {
request
.extensions()
.get::<ConnectInfo<RemoteAddr>>()
.map(|ConnectInfo(RemoteAddr(addr))| addr)
}
pub fn extract_context<B>(request: &Request<B>) -> Context {
get_text_map_propagator(|propagator| propagator.extract(&HeaderExtractor(request.headers())))
}
pub fn is_grpc(headers: &HeaderMap) -> bool {
headers.get(CONTENT_TYPE).map_or(false, |content_type| {
content_type.as_bytes().starts_with(b"application/grpc")
})
}