1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
use solicit::StreamId;
use result::Result;
use solicit::frame::*;
use solicit::connection::HttpFrame;
#[derive(Debug)]
pub enum HttpFrameStream {
Data(DataFrame),
Headers(HeadersFrame),
Priority(PriorityFrame),
RstStream(RstStreamFrame),
PushPromise(PushPromiseFrame),
WindowUpdate(WindowUpdateFrame),
Continuation(ContinuationFrame),
}
impl HttpFrameStream {
#[allow(dead_code)]
pub fn into_frame(self) -> HttpFrame {
match self {
HttpFrameStream::Headers(f) => HttpFrame::Headers(f),
HttpFrameStream::Data(f) => HttpFrame::Data(f),
HttpFrameStream::Priority(f) => HttpFrame::Priority(f),
HttpFrameStream::WindowUpdate(f) => HttpFrame::WindowUpdate(f),
HttpFrameStream::RstStream(f) => HttpFrame::RstStream(f),
HttpFrameStream::PushPromise(f) => HttpFrame::PushPromise(f),
HttpFrameStream::Continuation(f) => HttpFrame::Continuation(f),
}
}
#[allow(dead_code)]
pub fn get_stream_id(&self) -> StreamId {
match self {
&HttpFrameStream::Data(ref f) => f.get_stream_id(),
&HttpFrameStream::Headers(ref f) => f.get_stream_id(),
&HttpFrameStream::Priority(ref f) => f.get_stream_id(),
&HttpFrameStream::WindowUpdate(ref f) => f.get_stream_id(),
&HttpFrameStream::RstStream(ref f) => f.get_stream_id(),
&HttpFrameStream::PushPromise(ref f) => f.get_stream_id(),
&HttpFrameStream::Continuation(ref f) => f.get_stream_id(),
}
}
#[allow(dead_code)]
pub fn is_end_of_stream(&self) -> bool {
match self {
&HttpFrameStream::Headers(ref f) => f.is_end_of_stream(),
&HttpFrameStream::Data(ref f) => f.is_end_of_stream(),
&HttpFrameStream::Priority(..) => false,
&HttpFrameStream::WindowUpdate(..) => false,
&HttpFrameStream::RstStream(..) => true,
&HttpFrameStream::PushPromise(..) => false,
&HttpFrameStream::Continuation(..) => panic!("end of stream is defined in HEADERS"),
}
}
}
#[derive(Debug)]
pub enum HttpFrameConn {
Settings(SettingsFrame),
Ping(PingFrame),
Goaway(GoawayFrame),
WindowUpdate(WindowUpdateFrame),
}
impl HttpFrameConn {
#[allow(dead_code)]
pub fn into_frame(self) -> HttpFrame {
match self {
HttpFrameConn::Settings(f) => HttpFrame::Settings(f),
HttpFrameConn::Ping(f) => HttpFrame::Ping(f),
HttpFrameConn::Goaway(f) => HttpFrame::Goaway(f),
HttpFrameConn::WindowUpdate(f) => HttpFrame::WindowUpdate(f),
}
}
}
#[derive(Debug)]
pub enum HttpFrameClassified {
Stream(HttpFrameStream),
Conn(HttpFrameConn),
Unknown(RawFrame),
}
impl HttpFrameClassified {
pub fn from(frame: HttpFrame) -> Self {
match frame {
HttpFrame::Data(f) => HttpFrameClassified::Stream(HttpFrameStream::Data(f)),
HttpFrame::Headers(f) => HttpFrameClassified::Stream(HttpFrameStream::Headers(f)),
HttpFrame::Priority(f) => HttpFrameClassified::Stream(HttpFrameStream::Priority(f)),
HttpFrame::RstStream(f) => HttpFrameClassified::Stream(HttpFrameStream::RstStream(f)),
HttpFrame::Settings(f) => HttpFrameClassified::Conn(HttpFrameConn::Settings(f)),
HttpFrame::PushPromise(f) => HttpFrameClassified::Stream(HttpFrameStream::PushPromise(f)),
HttpFrame::Ping(f) => HttpFrameClassified::Conn(HttpFrameConn::Ping(f)),
HttpFrame::Goaway(f) => HttpFrameClassified::Conn(HttpFrameConn::Goaway(f)),
HttpFrame::WindowUpdate(f) => {
if f.get_stream_id() != 0 {
HttpFrameClassified::Stream(HttpFrameStream::WindowUpdate(f))
} else {
HttpFrameClassified::Conn(HttpFrameConn::WindowUpdate(f))
}
},
HttpFrame::Continuation(f) => HttpFrameClassified::Stream(HttpFrameStream::Continuation(f)),
HttpFrame::Unknown(f) => HttpFrameClassified::Unknown(f),
}
}
pub fn from_raw(raw_frame: &RawFrame) -> Result<HttpFrameClassified> {
Ok(HttpFrameClassified::from(HttpFrame::from_raw(raw_frame)?))
}
}