ntex_h2/
message.rs

1use ntex_bytes::Bytes;
2use ntex_http::HeaderMap;
3
4use crate::error::{OperationError, StreamError};
5use crate::frame::{PseudoHeaders, StreamId};
6use crate::stream::{Capacity, StreamRef};
7
8#[derive(Debug)]
9pub struct Message {
10    pub stream: StreamRef,
11    pub kind: MessageKind,
12}
13
14#[derive(Debug)]
15pub enum MessageKind {
16    Headers {
17        pseudo: PseudoHeaders,
18        headers: HeaderMap,
19        eof: bool,
20    },
21    Data(Bytes, Capacity),
22    Eof(StreamEof),
23    Disconnect(OperationError),
24}
25
26#[derive(Debug, Clone)]
27pub enum StreamEof {
28    Data(Bytes),
29    Trailers(HeaderMap),
30    Error(StreamError),
31}
32
33impl Message {
34    pub(crate) fn new(
35        pseudo: PseudoHeaders,
36        headers: HeaderMap,
37        eof: bool,
38        stream: &StreamRef,
39    ) -> Self {
40        Message {
41            stream: stream.clone(),
42            kind: MessageKind::Headers {
43                pseudo,
44                headers,
45                eof,
46            },
47        }
48    }
49
50    pub(crate) fn data(data: Bytes, capacity: Capacity, stream: &StreamRef) -> Self {
51        Message {
52            stream: stream.clone(),
53            kind: MessageKind::Data(data, capacity),
54        }
55    }
56
57    pub(crate) fn eof_data(data: Bytes, stream: &StreamRef) -> Self {
58        Message {
59            stream: stream.clone(),
60            kind: MessageKind::Eof(StreamEof::Data(data)),
61        }
62    }
63
64    pub(crate) fn trailers(hdrs: HeaderMap, stream: &StreamRef) -> Self {
65        Message {
66            stream: stream.clone(),
67            kind: MessageKind::Eof(StreamEof::Trailers(hdrs)),
68        }
69    }
70
71    pub(crate) fn error(err: StreamError, stream: &StreamRef) -> Self {
72        Message {
73            stream: stream.clone(),
74            kind: MessageKind::Eof(StreamEof::Error(err)),
75        }
76    }
77
78    pub(crate) fn disconnect(err: OperationError, stream: StreamRef) -> Self {
79        Message {
80            stream,
81            kind: MessageKind::Disconnect(err),
82        }
83    }
84
85    #[inline]
86    pub fn id(&self) -> StreamId {
87        self.stream.id()
88    }
89
90    #[inline]
91    pub fn kind(&self) -> &MessageKind {
92        &self.kind
93    }
94
95    #[inline]
96    pub fn stream(&self) -> &StreamRef {
97        &self.stream
98    }
99}