1
1
#![ warn( rust_2018_idioms) ]
2
2
extern crate conduit;
3
3
4
- use std :: error :: Error ;
4
+ use conduit :: { BoxError , Handler , RequestExt } ;
5
5
6
- use conduit:: { Handler , Request , Response } ;
6
+ pub type BeforeResult = Result < ( ) , BoxError > ;
7
+ pub type AfterResult = conduit:: HandlerResult ;
7
8
8
9
pub trait Middleware : Send + Sync + ' static {
9
- fn before ( & self , _: & mut dyn Request ) -> Result < ( ) , Box < dyn Error + Send > > {
10
+ fn before ( & self , _: & mut dyn RequestExt ) -> BeforeResult {
10
11
Ok ( ( ) )
11
12
}
12
13
13
- fn after (
14
- & self ,
15
- _: & mut dyn Request ,
16
- res : Result < Response , Box < dyn Error + Send > > ,
17
- ) -> Result < Response , Box < dyn Error + Send > > {
14
+ fn after ( & self , _: & mut dyn RequestExt , res : AfterResult ) -> AfterResult {
18
15
res
19
16
}
20
17
}
@@ -49,7 +46,7 @@ impl MiddlewareBuilder {
49
46
}
50
47
51
48
impl Handler for MiddlewareBuilder {
52
- fn call ( & self , req : & mut dyn Request ) -> Result < Response , Box < dyn Error + Send > > {
49
+ fn call ( & self , req : & mut dyn RequestExt ) -> AfterResult {
53
50
let mut error = None ;
54
51
55
52
for ( i, middleware) in self . middlewares . iter ( ) . enumerate ( ) {
@@ -79,9 +76,9 @@ impl Handler for MiddlewareBuilder {
79
76
80
77
fn run_afters (
81
78
middleware : & [ Box < dyn Middleware > ] ,
82
- req : & mut dyn Request ,
83
- res : Result < Response , Box < dyn Error + Send > > ,
84
- ) -> Result < Response , Box < dyn Error + Send > > {
79
+ req : & mut dyn RequestExt ,
80
+ res : AfterResult ,
81
+ ) -> AfterResult {
85
82
middleware
86
83
. iter ( )
87
84
. rev ( )
@@ -90,20 +87,17 @@ fn run_afters(
90
87
91
88
#[ cfg( test) ]
92
89
mod tests {
93
- extern crate semver;
94
-
95
- use { AroundMiddleware , Middleware , MiddlewareBuilder } ;
90
+ use { AfterResult , AroundMiddleware , BeforeResult , Middleware , MiddlewareBuilder } ;
96
91
97
92
use std:: any:: Any ;
98
- use std:: collections:: HashMap ;
99
- use std:: error:: Error ;
93
+ use std:: io;
100
94
use std:: io:: prelude:: * ;
101
- use std:: io:: { self , Cursor } ;
102
95
use std:: net:: SocketAddr ;
103
96
104
- use conduit;
105
- use conduit:: { Extensions , Headers , Host , Method , Request , Response , Scheme } ;
106
- use conduit:: { Handler , TypeMap } ;
97
+ use conduit:: {
98
+ box_error, static_to_body, vec_to_body, Body , Extensions , Handler , HeaderMap , Host , Method ,
99
+ RequestExt , Response , Scheme , StatusCode , TypeMap , Version ,
100
+ } ;
107
101
108
102
struct RequestSentinel {
109
103
path : String ,
@@ -121,15 +115,12 @@ mod tests {
121
115
}
122
116
}
123
117
124
- impl conduit:: Request for RequestSentinel {
125
- fn http_version ( & self ) -> semver:: Version {
126
- unimplemented ! ( )
127
- }
128
- fn conduit_version ( & self ) -> semver:: Version {
118
+ impl conduit:: RequestExt for RequestSentinel {
119
+ fn http_version ( & self ) -> Version {
129
120
unimplemented ! ( )
130
121
}
131
- fn method ( & self ) -> Method {
132
- self . method . clone ( )
122
+ fn method ( & self ) -> & Method {
123
+ & self . method
133
124
}
134
125
fn scheme ( & self ) -> Scheme {
135
126
unimplemented ! ( )
@@ -152,7 +143,7 @@ mod tests {
152
143
fn content_length ( & self ) -> Option < u64 > {
153
144
unimplemented ! ( )
154
145
}
155
- fn headers < ' a > ( & ' a self ) -> & ' a dyn Headers {
146
+ fn headers ( & self ) -> & HeaderMap {
156
147
unimplemented ! ( )
157
148
}
158
149
fn body < ' a > ( & ' a mut self ) -> & ' a mut dyn Read {
@@ -169,7 +160,7 @@ mod tests {
169
160
struct MyMiddleware ;
170
161
171
162
impl Middleware for MyMiddleware {
172
- fn before < ' a > ( & self , req : & ' a mut dyn Request ) -> Result < ( ) , Box < dyn Error + Send > > {
163
+ fn before < ' a > ( & self , req : & ' a mut dyn RequestExt ) -> BeforeResult {
173
164
req. mut_extensions ( ) . insert ( "hello" . to_string ( ) ) ;
174
165
Ok ( ( ) )
175
166
}
@@ -178,43 +169,32 @@ mod tests {
178
169
struct ErrorRecovery ;
179
170
180
171
impl Middleware for ErrorRecovery {
181
- fn after (
182
- & self ,
183
- _: & mut dyn Request ,
184
- res : Result < Response , Box < dyn Error + Send > > ,
185
- ) -> Result < Response , Box < dyn Error + Send > > {
172
+ fn after ( & self , _: & mut dyn RequestExt , res : AfterResult ) -> AfterResult {
186
173
res. or_else ( |e| {
187
- let e = e. to_string ( ) ;
188
- Ok ( Response {
189
- status : ( 500 , "Internal Server Error" ) ,
190
- headers : HashMap :: new ( ) ,
191
- body : Box :: new ( Cursor :: new ( e. into_bytes ( ) ) ) ,
192
- } )
174
+ let e = e. to_string ( ) . into_bytes ( ) ;
175
+ Response :: builder ( )
176
+ . status ( StatusCode :: INTERNAL_SERVER_ERROR )
177
+ . body ( vec_to_body ( e) )
178
+ . map_err ( box_error)
193
179
} )
194
180
}
195
181
}
196
182
197
183
struct ProducesError ;
198
184
199
185
impl Middleware for ProducesError {
200
- fn before ( & self , _: & mut dyn Request ) -> Result < ( ) , Box < dyn Error + Send > > {
186
+ fn before ( & self , _: & mut dyn RequestExt ) -> BeforeResult {
201
187
Err ( Box :: new ( io:: Error :: new ( io:: ErrorKind :: Other , "" ) ) )
202
188
}
203
189
}
204
190
205
191
struct NotReached ;
206
192
207
193
impl Middleware for NotReached {
208
- fn after (
209
- & self ,
210
- _: & mut dyn Request ,
211
- _: Result < Response , Box < dyn Error + Send > > ,
212
- ) -> Result < Response , Box < dyn Error + Send > > {
213
- Ok ( Response {
214
- status : ( 200 , "OK" ) ,
215
- headers : HashMap :: new ( ) ,
216
- body : Box :: new ( Cursor :: new ( vec ! [ ] ) ) ,
217
- } )
194
+ fn after ( & self , _: & mut dyn RequestExt , _: AfterResult ) -> AfterResult {
195
+ Response :: builder ( )
196
+ . body ( static_to_body ( b"" ) )
197
+ . map_err ( box_error)
218
198
}
219
199
}
220
200
@@ -237,34 +217,32 @@ mod tests {
237
217
}
238
218
239
219
impl Handler for MyAroundMiddleware {
240
- fn call ( & self , req : & mut dyn Request ) -> Result < Response , Box < dyn Error + Send > > {
220
+ fn call ( & self , req : & mut dyn RequestExt ) -> AfterResult {
241
221
req. mut_extensions ( ) . insert ( "hello" . to_string ( ) ) ;
242
222
self . handler . as_ref ( ) . unwrap ( ) . call ( req)
243
223
}
244
224
}
245
225
246
- fn get_extension < ' a , T : Any > ( req : & ' a dyn Request ) -> & ' a T {
226
+ fn get_extension < ' a , T : Any > ( req : & ' a dyn RequestExt ) -> & ' a T {
247
227
req. extensions ( ) . find :: < T > ( ) . unwrap ( )
248
228
}
249
229
250
- fn response ( string : String ) -> Response {
251
- Response {
252
- status : ( 200 , "OK" ) ,
253
- headers : HashMap :: new ( ) ,
254
- body : Box :: new ( Cursor :: new ( string. into_bytes ( ) ) ) ,
255
- }
230
+ fn response ( string : String ) -> Response < Body > {
231
+ Response :: builder ( )
232
+ . body ( vec_to_body ( string. into_bytes ( ) ) )
233
+ . unwrap ( )
256
234
}
257
235
258
- fn handler ( req : & mut dyn Request ) -> io:: Result < Response > {
236
+ fn handler ( req : & mut dyn RequestExt ) -> io:: Result < Response < Body > > {
259
237
let hello = get_extension :: < String > ( req) ;
260
238
Ok ( response ( hello. clone ( ) ) )
261
239
}
262
240
263
- fn error_handler ( _: & mut dyn Request ) -> io:: Result < Response > {
241
+ fn error_handler ( _: & mut dyn RequestExt ) -> io:: Result < Response < Body > > {
264
242
Err ( io:: Error :: new ( io:: ErrorKind :: Other , "Error in handler" ) )
265
243
}
266
244
267
- fn middle_handler ( req : & mut dyn Request ) -> io:: Result < Response > {
245
+ fn middle_handler ( req : & mut dyn RequestExt ) -> io:: Result < Response < Body > > {
268
246
let hello = get_extension :: < String > ( req) ;
269
247
let middle = get_extension :: < String > ( req) ;
270
248
@@ -276,11 +254,11 @@ mod tests {
276
254
let mut builder = MiddlewareBuilder :: new ( handler) ;
277
255
builder. add ( MyMiddleware ) ;
278
256
279
- let mut req = RequestSentinel :: new ( Method :: Get , "/" ) ;
257
+ let mut req = RequestSentinel :: new ( Method :: GET , "/" ) ;
280
258
let mut res = builder. call ( & mut req) . ok ( ) . expect ( "No response" ) ;
281
259
282
260
let mut s = Vec :: new ( ) ;
283
- res. body . write_body ( & mut s) . unwrap ( ) ;
261
+ res. body_mut ( ) . write_body ( & mut s) . unwrap ( ) ;
284
262
assert_eq ! ( s, b"hello" ) ;
285
263
}
286
264
@@ -292,23 +270,23 @@ mod tests {
292
270
// the error bubbles up from ProducesError and shouldn't reach here
293
271
builder. add ( NotReached ) ;
294
272
295
- let mut req = RequestSentinel :: new ( Method :: Get , "/" ) ;
273
+ let mut req = RequestSentinel :: new ( Method :: GET , "/" ) ;
296
274
let res = builder. call ( & mut req) . ok ( ) . expect ( "Error not handled" ) ;
297
275
298
- assert_eq ! ( res. status, ( 500 , "Internal Server Error" ) ) ;
276
+ assert_eq ! ( res. status( ) , StatusCode :: INTERNAL_SERVER_ERROR ) ;
299
277
}
300
278
301
279
#[ test]
302
280
fn test_error_recovery_in_handlers ( ) {
303
281
let mut builder = MiddlewareBuilder :: new ( error_handler) ;
304
282
builder. add ( ErrorRecovery ) ;
305
283
306
- let mut req = RequestSentinel :: new ( Method :: Get , "/" ) ;
284
+ let mut req = RequestSentinel :: new ( Method :: GET , "/" ) ;
307
285
let mut res = builder. call ( & mut req) . ok ( ) . expect ( "Error not handled" ) ;
308
286
309
- assert_eq ! ( res. status, ( 500 , "Internal Server Error" ) ) ;
287
+ assert_eq ! ( res. status( ) , StatusCode :: INTERNAL_SERVER_ERROR ) ;
310
288
let mut s = Vec :: new ( ) ;
311
- res. body . write_body ( & mut s) . unwrap ( ) ;
289
+ res. body_mut ( ) . write_body ( & mut s) . unwrap ( ) ;
312
290
assert_eq ! ( s, b"Error in handler" ) ;
313
291
}
314
292
@@ -318,11 +296,11 @@ mod tests {
318
296
builder. add ( MyMiddleware ) ;
319
297
builder. around ( MyAroundMiddleware :: new ( ) ) ;
320
298
321
- let mut req = RequestSentinel :: new ( Method :: Get , "/" ) ;
299
+ let mut req = RequestSentinel :: new ( Method :: GET , "/" ) ;
322
300
let mut res = builder. call ( & mut req) . ok ( ) . expect ( "No response" ) ;
323
301
324
302
let mut s = Vec :: new ( ) ;
325
- res. body . write_body ( & mut s) . unwrap ( ) ;
303
+ res. body_mut ( ) . write_body ( & mut s) . unwrap ( ) ;
326
304
assert_eq ! ( s, b"hello hello" ) ;
327
305
}
328
306
}
0 commit comments