1
1
use super :: { DecoderError , NeedMore } ;
2
+ use crate :: ext:: Protocol ;
2
3
3
4
use bytes:: Bytes ;
4
5
use http:: header:: { HeaderName , HeaderValue } ;
@@ -14,6 +15,7 @@ pub enum Header<T = HeaderName> {
14
15
Method ( Method ) ,
15
16
Scheme ( BytesStr ) ,
16
17
Path ( BytesStr ) ,
18
+ Protocol ( Protocol ) ,
17
19
Status ( StatusCode ) ,
18
20
}
19
21
@@ -25,6 +27,7 @@ pub enum Name<'a> {
25
27
Method ,
26
28
Scheme ,
27
29
Path ,
30
+ Protocol ,
28
31
Status ,
29
32
}
30
33
@@ -51,6 +54,7 @@ impl Header<Option<HeaderName>> {
51
54
Method ( v) => Method ( v) ,
52
55
Scheme ( v) => Scheme ( v) ,
53
56
Path ( v) => Path ( v) ,
57
+ Protocol ( v) => Protocol ( v) ,
54
58
Status ( v) => Status ( v) ,
55
59
} )
56
60
}
@@ -79,6 +83,10 @@ impl Header {
79
83
let value = BytesStr :: try_from ( value) ?;
80
84
Ok ( Header :: Path ( value) )
81
85
}
86
+ b"protocol" => {
87
+ let value = Protocol :: try_from ( value) ?;
88
+ Ok ( Header :: Protocol ( value) )
89
+ }
82
90
b"status" => {
83
91
let status = StatusCode :: from_bytes ( & value) ?;
84
92
Ok ( Header :: Status ( status) )
@@ -104,6 +112,7 @@ impl Header {
104
112
Header :: Method ( ref v) => 32 + 7 + v. as_ref ( ) . len ( ) ,
105
113
Header :: Scheme ( ref v) => 32 + 7 + v. len ( ) ,
106
114
Header :: Path ( ref v) => 32 + 5 + v. len ( ) ,
115
+ Header :: Protocol ( ref v) => 32 + 9 + v. as_str ( ) . len ( ) ,
107
116
Header :: Status ( _) => 32 + 7 + 3 ,
108
117
}
109
118
}
@@ -116,6 +125,7 @@ impl Header {
116
125
Header :: Method ( ..) => Name :: Method ,
117
126
Header :: Scheme ( ..) => Name :: Scheme ,
118
127
Header :: Path ( ..) => Name :: Path ,
128
+ Header :: Protocol ( ..) => Name :: Protocol ,
119
129
Header :: Status ( ..) => Name :: Status ,
120
130
}
121
131
}
@@ -127,6 +137,7 @@ impl Header {
127
137
Header :: Method ( ref v) => v. as_ref ( ) . as_ref ( ) ,
128
138
Header :: Scheme ( ref v) => v. as_ref ( ) ,
129
139
Header :: Path ( ref v) => v. as_ref ( ) ,
140
+ Header :: Protocol ( ref v) => v. as_ref ( ) ,
130
141
Header :: Status ( ref v) => v. as_str ( ) . as_ref ( ) ,
131
142
}
132
143
}
@@ -156,6 +167,10 @@ impl Header {
156
167
Header :: Path ( ref b) => a == b,
157
168
_ => false ,
158
169
} ,
170
+ Header :: Protocol ( ref a) => match * other {
171
+ Header :: Protocol ( ref b) => a == b,
172
+ _ => false ,
173
+ } ,
159
174
Header :: Status ( ref a) => match * other {
160
175
Header :: Status ( ref b) => a == b,
161
176
_ => false ,
@@ -205,6 +220,7 @@ impl From<Header> for Header<Option<HeaderName>> {
205
220
Header :: Method ( v) => Header :: Method ( v) ,
206
221
Header :: Scheme ( v) => Header :: Scheme ( v) ,
207
222
Header :: Path ( v) => Header :: Path ( v) ,
223
+ Header :: Protocol ( v) => Header :: Protocol ( v) ,
208
224
Header :: Status ( v) => Header :: Status ( v) ,
209
225
}
210
226
}
@@ -221,6 +237,7 @@ impl<'a> Name<'a> {
221
237
Name :: Method => Ok ( Header :: Method ( Method :: from_bytes ( & * value) ?) ) ,
222
238
Name :: Scheme => Ok ( Header :: Scheme ( BytesStr :: try_from ( value) ?) ) ,
223
239
Name :: Path => Ok ( Header :: Path ( BytesStr :: try_from ( value) ?) ) ,
240
+ Name :: Protocol => Ok ( Header :: Protocol ( Protocol :: try_from ( value) ?) ) ,
224
241
Name :: Status => {
225
242
match StatusCode :: from_bytes ( & value) {
226
243
Ok ( status) => Ok ( Header :: Status ( status) ) ,
@@ -238,6 +255,7 @@ impl<'a> Name<'a> {
238
255
Name :: Method => b":method" ,
239
256
Name :: Scheme => b":scheme" ,
240
257
Name :: Path => b":path" ,
258
+ Name :: Protocol => b":protocol" ,
241
259
Name :: Status => b":status" ,
242
260
}
243
261
}
0 commit comments