1cfg_feature! {
4    #![feature = "http1"]
5
6    pub(crate) mod h1;
7
8    pub(crate) use self::h1::Conn;
9
10    #[cfg(feature = "client")]
11    pub(crate) use self::h1::dispatch;
12    #[cfg(feature = "server")]
13    pub(crate) use self::h1::ServerTransaction;
14}
15
16#[cfg(feature = "http2")]
17pub(crate) mod h2;
18
19#[cfg(feature = "http1")]
21#[derive(Debug, Default)]
22pub(crate) struct MessageHead<S> {
23    pub(crate) version: http::Version,
25    pub(crate) subject: S,
27    pub(crate) headers: http::HeaderMap,
29    extensions: http::Extensions,
31}
32
33#[cfg(feature = "http1")]
35pub(crate) type RequestHead = MessageHead<RequestLine>;
36
37#[derive(Debug, Default, PartialEq)]
38#[cfg(feature = "http1")]
39pub(crate) struct RequestLine(pub(crate) http::Method, pub(crate) http::Uri);
40
41#[cfg(all(feature = "http1", feature = "client"))]
43pub(crate) type ResponseHead = MessageHead<http::StatusCode>;
44
45#[derive(Debug)]
46#[cfg(feature = "http1")]
47pub(crate) enum BodyLength {
48    Known(u64),
50    Unknown,
52}
53
54pub(crate) enum Dispatched {
56    Shutdown,
58    #[cfg(feature = "http1")]
60    Upgrade(crate::upgrade::Pending),
61}
62
63#[cfg(all(feature = "client", feature = "http1"))]
64impl MessageHead<http::StatusCode> {
65    fn into_response<B>(self, body: B) -> http::Response<B> {
66        let mut res = http::Response::new(body);
67        *res.status_mut() = self.subject;
68        *res.headers_mut() = self.headers;
69        *res.version_mut() = self.version;
70        *res.extensions_mut() = self.extensions;
71        res
72    }
73}