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
38pub use tower_service::Service;
39
40mod http;
41mod make;
42#[cfg(all(any(feature = "http1", feature = "http2"), feature = "client"))]
43mod oneshot;
44mod util;
45
46pub(super) use self::http::HttpService;
47#[cfg(all(any(feature = "http1", feature = "http2"), feature = "client"))]
48pub(super) use self::make::MakeConnection;
49#[cfg(all(any(feature = "http1", feature = "http2"), feature = "server"))]
50pub(super) use self::make::MakeServiceRef;
51#[cfg(all(any(feature = "http1", feature = "http2"), feature = "client"))]
52pub(super) use self::oneshot::{oneshot, Oneshot};
53
54pub use self::make::make_service_fn;
55pub use self::util::service_fn;
56