1
1
use std:: str:: from_utf8_unchecked;
2
2
3
- use kawa:: { AsBuffer , Block , BlockConverter , Chunk , Flags , Kawa , Pair , StatusLine , Store } ;
4
-
5
- use crate :: protocol:: http:: parser:: compare_no_case;
3
+ use kawa:: {
4
+ AsBuffer , Block , BlockConverter , Chunk , Flags , Kawa , Pair , ParsingErrorKind , ParsingPhase ,
5
+ StatusLine , Store ,
6
+ } ;
6
7
7
- use super :: {
8
- parser:: { FrameHeader , FrameType , H2Error } ,
9
- serializer:: { gen_frame_header, gen_rst_stream} ,
10
- StreamId ,
8
+ use crate :: protocol:: {
9
+ http:: parser:: compare_no_case,
10
+ mux:: {
11
+ parser:: { str_to_error_code, FrameHeader , FrameType , H2Error } ,
12
+ serializer:: { gen_frame_header, gen_rst_stream} ,
13
+ StreamId ,
14
+ } ,
11
15
} ;
12
16
13
17
pub struct H2BlockConverter < ' a > {
@@ -17,6 +21,26 @@ pub struct H2BlockConverter<'a> {
17
21
}
18
22
19
23
impl < ' a , T : AsBuffer > BlockConverter < T > for H2BlockConverter < ' a > {
24
+ fn initialize ( & mut self , kawa : & mut Kawa < T > ) {
25
+ // This is very ugly... we may add a h2 variant in kawa::ParsingErrorKind
26
+ match kawa. parsing_phase {
27
+ ParsingPhase :: Error {
28
+ kind : ParsingErrorKind :: Processing { message } ,
29
+ ..
30
+ } => {
31
+ let error = str_to_error_code ( message) ;
32
+ let mut frame = [ 0 ; 13 ] ;
33
+ gen_rst_stream ( & mut frame, self . stream_id , error) . unwrap ( ) ;
34
+ kawa. push_out ( Store :: from_slice ( & frame) ) ;
35
+ }
36
+ ParsingPhase :: Error { .. } => {
37
+ let mut frame = [ 0 ; 13 ] ;
38
+ gen_rst_stream ( & mut frame, self . stream_id , H2Error :: InternalError ) . unwrap ( ) ;
39
+ kawa. push_out ( Store :: from_slice ( & frame) ) ;
40
+ }
41
+ _ => { }
42
+ }
43
+ }
20
44
fn call ( & mut self , block : Block , kawa : & mut Kawa < T > ) {
21
45
let buffer = kawa. storage . buffer ( ) ;
22
46
match block {
@@ -140,24 +164,18 @@ impl<'a, T: AsBuffer> BlockConverter<T> for H2BlockConverter<'a> {
140
164
kawa. push_out ( Store :: from_slice ( & header) ) ;
141
165
kawa. push_out ( Store :: Alloc ( payload. into_boxed_slice ( ) , 0 ) ) ;
142
166
} else if end_stream {
143
- if kawa. is_error ( ) {
144
- let mut frame = [ 0 ; 13 ] ;
145
- gen_rst_stream ( & mut frame, self . stream_id , H2Error :: InternalError ) . unwrap ( ) ;
146
- kawa. push_out ( Store :: from_slice ( & frame) ) ;
147
- } else {
148
- let mut header = [ 0 ; 9 ] ;
149
- gen_frame_header (
150
- & mut header,
151
- & FrameHeader {
152
- payload_len : 0 ,
153
- frame_type : FrameType :: Data ,
154
- flags : 1 ,
155
- stream_id : self . stream_id ,
156
- } ,
157
- )
158
- . unwrap ( ) ;
159
- kawa. push_out ( Store :: from_slice ( & header) ) ;
160
- }
167
+ let mut header = [ 0 ; 9 ] ;
168
+ gen_frame_header (
169
+ & mut header,
170
+ & FrameHeader {
171
+ payload_len : 0 ,
172
+ frame_type : FrameType :: Data ,
173
+ flags : 1 ,
174
+ stream_id : self . stream_id ,
175
+ } ,
176
+ )
177
+ . unwrap ( ) ;
178
+ kawa. push_out ( Store :: from_slice ( & header) ) ;
161
179
}
162
180
if end_header || end_stream {
163
181
kawa. push_delimiter ( )
0 commit comments