rama_http/layer/dns/dns_resolve/
service.rs1use super::DnsResolveMode;
2use crate::{HeaderName, Request};
3use rama_core::error::ErrorContext;
4use rama_core::{Service, error::BoxError, extensions::ExtensionsRef};
5use rama_utils::macros::define_inner_service_accessors;
6
7#[derive(Debug, Clone)]
17pub struct DnsResolveModeService<S> {
18 inner: S,
19 header_name: HeaderName,
20}
21
22impl<S> DnsResolveModeService<S> {
23 pub const fn new(inner: S, header_name: HeaderName) -> Self {
25 Self { inner, header_name }
26 }
27
28 define_inner_service_accessors!();
29}
30
31impl<Body, S> Service<Request<Body>> for DnsResolveModeService<S>
32where
33 Body: Send + Sync + 'static,
34 S: Service<Request<Body>, Error: Into<rama_core::error::BoxError> + Send + Sync + 'static>,
35{
36 type Output = S::Output;
37 type Error = BoxError;
38
39 async fn serve(&self, request: Request<Body>) -> Result<Self::Output, Self::Error> {
40 if let Some(header_value) = request.headers().get(&self.header_name) {
41 let dns_resolve_mode: DnsResolveMode = header_value.try_into()?;
42 request.extensions().insert(dns_resolve_mode);
43 }
44
45 self.inner.serve(request).await.into_box_error()
46 }
47}