1 //! Asynchronous Services
2 //!
3 //! A [`Service`](Service) is a trait representing an asynchronous
4 //! function of a request to a response. It's similar to
5 //! `async fn(Request) -> Result<Response, Error>`.
6 //!
7 //! The argument and return value isn't strictly required to be for HTTP.
8 //! Therefore, hyper uses several "trait aliases" to reduce clutter around
9 //! bounds. These are:
10 //!
11 //! - `HttpService`: This is blanketly implemented for all types that
12 //!   implement `Service<http::Request<B1>, Response = http::Response<B2>>`.
13 //! - `MakeService`: When a `Service` returns a new `Service` as its "response",
14 //!   we consider it a `MakeService`. Again, blanketly implemented in those cases.
15 //! - `MakeConnection`: A `Service` that returns a "connection", a type that
16 //!   implements `AsyncRead` and `AsyncWrite`.
17 //!
18 //! # HttpService
19 //!
20 //! In hyper, especially in the server setting, a `Service` is usually bound
21 //! to a single connection. It defines how to respond to **all** requests that
22 //! connection will receive.
23 //!
24 //! The helper [`service_fn`](service_fn) should be sufficient for most cases, but
25 //! if you need to implement `Service` for a type manually, you can follow the example
26 //! in `service_struct_impl.rs`.
27 //!
28 //! # MakeService
29 //!
30 //! Since a `Service` is bound to a single connection, a [`Server`](crate::Server)
31 //! needs a way to make them as it accepts connections. This is what a
32 //! `MakeService` does.
33 //!
34 //! Resources that need to be shared by all `Service`s can be put into a
35 //! `MakeService`, and then passed to individual `Service`s when `call`
36 //! is called.
37 
38 pub use tower_service::Service;
39 
40 mod http;
41 mod make;
42 #[cfg(all(any(feature = "http1", feature = "http2"), feature = "client"))]
43 mod oneshot;
44 mod util;
45 
46 pub(super) use self::http::HttpService;
47 #[cfg(all(any(feature = "http1", feature = "http2"), feature = "client"))]
48 pub(super) use self::make::MakeConnection;
49 #[cfg(all(any(feature = "http1", feature = "http2"), feature = "server"))]
50 pub(super) use self::make::MakeServiceRef;
51 #[cfg(all(any(feature = "http1", feature = "http2"), feature = "client"))]
52 pub(super) use self::oneshot::{oneshot, Oneshot};
53 
54 pub use self::make::make_service_fn;
55 pub use self::util::service_fn;
56