summaryrefslogtreecommitdiff
path: root/vendor/hyper/src/service/http.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/hyper/src/service/http.rs')
-rw-r--r--vendor/hyper/src/service/http.rs52
1 files changed, 52 insertions, 0 deletions
diff --git a/vendor/hyper/src/service/http.rs b/vendor/hyper/src/service/http.rs
new file mode 100644
index 00000000..dd174316
--- /dev/null
+++ b/vendor/hyper/src/service/http.rs
@@ -0,0 +1,52 @@
+use std::error::Error as StdError;
+use std::future::Future;
+
+use crate::body::Body;
+use crate::service::service::Service;
+use crate::{Request, Response};
+
+/// An asynchronous function from `Request` to `Response`.
+pub trait HttpService<ReqBody>: sealed::Sealed<ReqBody> {
+ /// The `Body` body of the `http::Response`.
+ type ResBody: Body;
+
+ /// 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<Box<dyn StdError + Send + Sync>>;
+
+ /// The `Future` returned by this `Service`.
+ type Future: Future<Output = Result<Response<Self::ResBody>, Self::Error>>;
+
+ #[doc(hidden)]
+ fn call(&mut self, req: Request<ReqBody>) -> Self::Future;
+}
+
+impl<T, B1, B2> HttpService<B1> for T
+where
+ T: Service<Request<B1>, Response = Response<B2>>,
+ B2: Body,
+ T::Error: Into<Box<dyn StdError + Send + Sync>>,
+{
+ type ResBody = B2;
+
+ type Error = T::Error;
+ type Future = T::Future;
+
+ fn call(&mut self, req: Request<B1>) -> Self::Future {
+ Service::call(self, req)
+ }
+}
+
+impl<T, B1, B2> sealed::Sealed<B1> for T
+where
+ T: Service<Request<B1>, Response = Response<B2>>,
+ B2: Body,
+{
+}
+
+mod sealed {
+ pub trait Sealed<T> {}
+}