1 //! Pieces pertaining to the HTTP message protocol.
2 
3 cfg_http1! {
4     pub(crate) mod h1;
5 
6     pub(crate) use self::h1::Conn;
7 
8     #[cfg(feature = "client")]
9     pub(crate) use self::h1::dispatch;
10     #[cfg(feature = "server")]
11     pub(crate) use self::h1::ServerTransaction;
12 }
13 
14 cfg_http2! {
15     pub(crate) mod h2;
16 }
17 
18 /// An Incoming Message head. Includes request/status line, and headers.
19 #[derive(Debug, Default)]
20 pub(crate) struct MessageHead<S> {
21     /// HTTP version of the message.
22     pub(crate) version: http::Version,
23     /// Subject (request line or status line) of Incoming message.
24     pub(crate) subject: S,
25     /// Headers of the Incoming message.
26     pub(crate) headers: http::HeaderMap,
27     /// Extensions.
28     extensions: http::Extensions,
29 }
30 
31 /// An incoming request message.
32 #[cfg(feature = "http1")]
33 pub(crate) type RequestHead = MessageHead<RequestLine>;
34 
35 #[derive(Debug, Default, PartialEq)]
36 #[cfg(feature = "http1")]
37 pub(crate) struct RequestLine(pub(crate) http::Method, pub(crate) http::Uri);
38 
39 /// An incoming response message.
40 #[cfg(all(feature = "http1", feature = "client"))]
41 pub(crate) type ResponseHead = MessageHead<http::StatusCode>;
42 
43 #[derive(Debug)]
44 #[cfg(feature = "http1")]
45 pub(crate) enum BodyLength {
46     /// Content-Length
47     Known(u64),
48     /// Transfer-Encoding: chunked (if h1)
49     Unknown,
50 }
51 
52 /// Status of when a Disaptcher future completes.
53 pub(crate) enum Dispatched {
54     /// Dispatcher completely shutdown connection.
55     Shutdown,
56     /// Dispatcher has pending upgrade, and so did not shutdown.
57     #[cfg(feature = "http1")]
58     Upgrade(crate::upgrade::Pending),
59 }
60 
61 impl MessageHead<http::StatusCode> {
into_response<B>(self, body: B) -> http::Response<B>62     fn into_response<B>(self, body: B) -> http::Response<B> {
63         let mut res = http::Response::new(body);
64         *res.status_mut() = self.subject;
65         *res.headers_mut() = self.headers;
66         *res.version_mut() = self.version;
67         *res.extensions_mut() = self.extensions;
68         res
69     }
70 }
71