Skip to main content

rama_http/layer/dns/dns_resolve/
service.rs

1use 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/// Service to support configuring the DNS resolve mode.
8///
9/// By default DNS resolving is expected to only be done
10/// if it is needed (e.g. because we need to know the IP).
11/// Configuring this to be used as eager (when requested) is
12/// a way to have requested the intent
13/// to reoslve DNS even if it is not needed.
14///
15/// See `Dns` (`rama_core`) and [`DnsResolveMode`] for more information.
16#[derive(Debug, Clone)]
17pub struct DnsResolveModeService<S> {
18    inner: S,
19    header_name: HeaderName,
20}
21
22impl<S> DnsResolveModeService<S> {
23    /// Create a new instance of the [`DnsResolveModeService`].
24    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}