Skip to main content

ntex_h2/
message.rs

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