sui_http/middleware/callback/
service.rs

1// Copyright (c) Mysten Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3
4use super::CallbackLayer;
5use super::MakeCallbackHandler;
6use super::ResponseBody;
7use super::ResponseFuture;
8use http::Request;
9use http::Response;
10use std::task::Context;
11use std::task::Poll;
12use tower::Service;
13
14/// Middleware that adds callbacks to a [`Service`].
15///
16/// See the [module docs](crate::middleware::callback) for an example.
17///
18/// [`Service`]: tower::Service
19#[derive(Debug, Clone, Copy)]
20pub struct Callback<S, M> {
21    pub(crate) inner: S,
22    pub(crate) make_callback_handler: M,
23}
24
25impl<S, M> Callback<S, M> {
26    /// Create a new [`Callback`].
27    pub fn new(inner: S, make_callback_handler: M) -> Self {
28        Self {
29            inner,
30            make_callback_handler,
31        }
32    }
33
34    /// Returns a new [`Layer`] that wraps services with a [`CallbackLayer`] middleware.
35    ///
36    /// [`Layer`]: tower::layer::Layer
37    pub fn layer(make_handler: M) -> CallbackLayer<M>
38    where
39        M: MakeCallbackHandler,
40    {
41        CallbackLayer::new(make_handler)
42    }
43
44    /// Gets a reference to the underlying service.
45    pub fn inner(&self) -> &S {
46        &self.inner
47    }
48
49    /// Gets a mutable reference to the underlying service.
50    pub fn inner_mut(&mut self) -> &mut S {
51        &mut self.inner
52    }
53
54    /// Consumes `self`, returning the underlying service.
55    pub fn into_inner(self) -> S {
56        self.inner
57    }
58}
59
60impl<S, M, RequestBody, ResponseBodyT> Service<Request<RequestBody>> for Callback<S, M>
61where
62    S: Service<
63            Request<RequestBody>,
64            Response = Response<ResponseBodyT>,
65            Error: std::fmt::Display + 'static,
66        >,
67    M: MakeCallbackHandler,
68    RequestBody: http_body::Body<Error: std::fmt::Display + 'static>,
69    ResponseBodyT: http_body::Body<Error: std::fmt::Display + 'static>,
70{
71    type Response = Response<ResponseBody<ResponseBodyT, M::Handler>>;
72    type Error = S::Error;
73    type Future = ResponseFuture<S::Future, M::Handler>;
74
75    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
76        self.inner.poll_ready(cx)
77    }
78
79    fn call(&mut self, request: Request<RequestBody>) -> Self::Future {
80        let (head, body) = request.into_parts();
81        let handler = self.make_callback_handler.make_handler(&head);
82        let request = Request::from_parts(head, body);
83
84        ResponseFuture {
85            inner: self.inner.call(request),
86            handler: Some(handler),
87        }
88    }
89}