1use 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)]
30pub enum Message<T> {
32 Item(T),
34
35 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#[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}