1- use serde:: { Serialize , Serializer } ;
1+ use serde:: Serialize ;
22
33use super :: { error:: Error , FrameType } ;
44
55/// An enum that lists all valid settings that can be sent in a SETTINGS
66/// frame.
77///
88/// Each setting has a value that is a 32 bit unsigned integer (6.5.1.).
9- #[ derive( Debug ) ]
9+ #[ derive( Debug , Serialize ) ]
1010pub enum Setting {
11- HeaderTableSize ( u16 , u32 ) ,
12- EnablePush ( u16 , u32 ) ,
13- MaxConcurrentStreams ( u16 , u32 ) ,
14- InitialWindowSize ( u16 , u32 ) ,
15- MaxFrameSize ( u16 , u32 ) ,
16- MaxHeaderListSize ( u16 , u32 ) ,
17- EnableConnectProtocol ( u16 , u32 ) ,
18- NoRfc7540Priorities ( u16 , u32 ) ,
19- Unknown ( u16 , u32 ) ,
11+ HeaderTableSize { id : u16 , value : u32 } ,
12+ EnablePush { id : u16 , value : u32 } ,
13+ MaxConcurrentStreams { id : u16 , value : u32 } ,
14+ InitialWindowSize { id : u16 , value : u32 } ,
15+ MaxFrameSize { id : u16 , value : u32 } ,
16+ MaxHeaderListSize { id : u16 , value : u32 } ,
17+ EnableConnectProtocol { id : u16 , value : u32 } ,
18+ NoRfc7540Priorities { id : u16 , value : u32 } ,
19+ Unknown { id : u16 , value : u32 } ,
2020}
2121
2222/// Representing a SETTINGS frame in HTTP/2.
@@ -32,67 +32,43 @@ pub struct SettingsFrame {
3232impl From < ( u16 , u32 ) > for Setting {
3333 fn from ( ( id, value) : ( u16 , u32 ) ) -> Self {
3434 match id {
35- 1 => Setting :: HeaderTableSize ( id, value) ,
36- 2 => Setting :: EnablePush ( id, value) ,
37- 3 => Setting :: MaxConcurrentStreams ( id, value) ,
38- 4 => Setting :: InitialWindowSize ( id, value) ,
39- 5 => Setting :: MaxFrameSize ( id, value) ,
40- 6 => Setting :: MaxHeaderListSize ( id, value) ,
41- 8 => Setting :: EnableConnectProtocol ( id, value) ,
42- 9 => Setting :: NoRfc7540Priorities ( id, value) ,
43- _ => Setting :: Unknown ( id, value) ,
35+ 1 => Setting :: HeaderTableSize { id, value } ,
36+ 2 => Setting :: EnablePush { id, value } ,
37+ 3 => Setting :: MaxConcurrentStreams { id, value } ,
38+ 4 => Setting :: InitialWindowSize { id, value } ,
39+ 5 => Setting :: MaxFrameSize { id, value } ,
40+ 6 => Setting :: MaxHeaderListSize { id, value } ,
41+ 8 => Setting :: EnableConnectProtocol { id, value } ,
42+ 9 => Setting :: NoRfc7540Priorities { id, value } ,
43+ _ => Setting :: Unknown { id, value } ,
4444 }
4545 }
4646}
4747
4848impl Setting {
4949 pub fn value ( & self ) -> ( u16 , u32 ) {
5050 match self {
51- Setting :: HeaderTableSize ( id, value) => ( * id, * value) ,
52- Setting :: EnablePush ( id, value) => ( * id, * value) ,
53- Setting :: MaxConcurrentStreams ( id, value) => ( * id, * value) ,
54- Setting :: InitialWindowSize ( id, value) => ( * id, * value) ,
55- Setting :: MaxFrameSize ( id, value) => ( * id, * value) ,
56- Setting :: MaxHeaderListSize ( id, value) => ( * id, * value) ,
57- Setting :: EnableConnectProtocol ( id, value) => ( * id, * value) ,
58- Setting :: NoRfc7540Priorities ( id, value) => ( * id, * value) ,
59- Setting :: Unknown ( id, value) => ( * id, * value) ,
51+ Setting :: HeaderTableSize { id, value } => ( * id, * value) ,
52+ Setting :: EnablePush { id, value } => ( * id, * value) ,
53+ Setting :: MaxConcurrentStreams { id, value } => ( * id, * value) ,
54+ Setting :: InitialWindowSize { id, value } => ( * id, * value) ,
55+ Setting :: MaxFrameSize { id, value } => ( * id, * value) ,
56+ Setting :: MaxHeaderListSize { id, value } => ( * id, * value) ,
57+ Setting :: EnableConnectProtocol { id, value } => ( * id, * value) ,
58+ Setting :: NoRfc7540Priorities { id, value } => ( * id, * value) ,
59+ Setting :: Unknown { id, value } => ( * id, * value) ,
6060 }
6161 }
6262}
6363
64- impl Serialize for Setting {
65- fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
66- where
67- S : Serializer ,
68- {
69- let value = match self {
70- Setting :: HeaderTableSize ( _, value) => format ! ( "HEADER_TABLE_SIZE = {value}" ) ,
71- Setting :: EnablePush ( _, value) => format ! ( "ENABLE_PUSH = {value}" ) ,
72- Setting :: MaxConcurrentStreams ( _, value) => {
73- format ! ( "MAX_CONCURRENT_STREAMS = {value}" )
74- }
75- Setting :: InitialWindowSize ( _, value) => format ! ( "INITIAL_WINDOW_SIZE = {value}" ) ,
76- Setting :: MaxFrameSize ( _, value) => format ! ( "MAX_FRAME_SIZE = {value}" ) ,
77- Setting :: MaxHeaderListSize ( _, value) => format ! ( "MAX_HEADER_LIST_SIZE = {value}" ) ,
78- Setting :: EnableConnectProtocol ( _, value) => {
79- format ! ( "ENABLE_CONNECT_PROTOCOL = {value}" )
80- }
81- Setting :: NoRfc7540Priorities ( _, value) => format ! ( "NO_RFC7540_PRIORITIES = {value}" ) ,
82- Setting :: Unknown ( _, value) => format ! ( "UNKNOWN_SETTING = {value}" ) ,
83- } ;
84-
85- serializer. serialize_str ( & value)
86- }
87- }
88-
8964// ==== impl SettingsFrame ====
9065
9166impl TryFrom < & [ u8 ] > for SettingsFrame {
9267 type Error = Error ;
9368
9469 fn try_from ( payload : & [ u8 ] ) -> Result < Self , Self :: Error > {
9570 if payload. is_empty ( ) {
71+ tracing:: debug!( "Invalid SETTINGS frame size: {}" , payload. len( ) ) ;
9672 return Err ( Error :: BadFrameSize ) ;
9773 }
9874
0 commit comments