Skip to main content

actix_http/h1/
mod.rs

1//! HTTP/1 protocol implementation.
2
3use bytes::{Bytes, BytesMut};
4
5mod chunked;
6mod client;
7mod codec;
8mod decoder;
9mod dispatcher;
10mod encoder;
11mod expect;
12mod payload;
13mod service;
14mod timer;
15mod upgrade;
16mod utils;
17
18pub use self::{
19    client::{ClientCodec, ClientPayloadCodec},
20    codec::Codec,
21    dispatcher::Dispatcher,
22    expect::ExpectHandler,
23    payload::Payload,
24    service::{H1Service, H1ServiceHandler},
25    upgrade::UpgradeHandler,
26    utils::SendResponse,
27};
28
29#[derive(Debug)]
30/// Codec message
31pub enum Message<T> {
32    /// HTTP message.
33    Item(T),
34
35    /// Payload chunk.
36    Chunk(Option<Bytes>),
37}
38
39impl<T> From<T> for Message<T> {
40    fn from(item: T) -> Self {
41        Message::Item(item)
42    }
43}
44
45/// Incoming request type
46#[derive(Debug, Clone, Copy, PartialEq, Eq)]
47pub enum MessageType {
48    None,
49    Payload,
50    Stream,
51}
52
53const LW: usize = 2 * 1024;
54const HW: usize = 32 * 1024;
55
56pub(crate) fn reserve_readbuf(src: &mut BytesMut) {
57    let cap = src.capacity();
58    if cap < LW {
59        src.reserve(HW - cap);
60    }
61}
62
63#[cfg(test)]
64mod tests {
65    use super::*;
66    use crate::Request;
67
68    impl Message<Request> {
69        pub fn message(self) -> Request {
70            match self {
71                Message::Item(req) => req,
72                _ => panic!("error"),
73            }
74        }
75
76        pub fn chunk(self) -> Bytes {
77            match self {
78                Message::Chunk(Some(data)) => data,
79                _ => panic!("error"),
80            }
81        }
82
83        pub fn eof(self) -> bool {
84            match self {
85                Message::Chunk(None) => true,
86                Message::Chunk(Some(_)) => false,
87                _ => panic!("error"),
88            }
89        }
90    }
91}