use std::error::Error as StdError; use crate::body::HttpBody; use crate::common::{task, Future, Poll}; use crate::{Request, Response}; /// An asynchronous function from `Request` to `Response`. pub trait HttpService: sealed::Sealed { /// The `HttpBody` body of the `http::Response`. type ResBody: HttpBody; /// The error type that can occur within this `Service`. /// /// Note: Returning an `Error` to a hyper server will cause the connection /// to be abruptly aborted. In most cases, it is better to return a `Response` /// with a 4xx or 5xx status code. type Error: Into>; /// The `Future` returned by this `Service`. type Future: Future, Self::Error>>; #[doc(hidden)] fn poll_ready(&mut self, cx: &mut task::Context<'_>) -> Poll>; #[doc(hidden)] fn call(&mut self, req: Request) -> Self::Future; } impl HttpService for T where T: tower_service::Service, Response = Response>, B2: HttpBody, T::Error: Into>, { type ResBody = B2; type Error = T::Error; type Future = T::Future; fn poll_ready(&mut self, cx: &mut task::Context<'_>) -> Poll> { tower_service::Service::poll_ready(self, cx) } fn call(&mut self, req: Request) -> Self::Future { tower_service::Service::call(self, req) } } impl sealed::Sealed for T where T: tower_service::Service, Response = Response>, B2: HttpBody, { } mod sealed { pub trait Sealed {} }