11#![ warn( rust_2018_idioms) ]
22extern crate conduit;
33
4- use std :: error :: Error ;
4+ use conduit :: { BoxError , Handler , RequestExt } ;
55
6- use conduit:: { Handler , Request , Response } ;
6+ pub type BeforeResult = Result < ( ) , BoxError > ;
7+ pub type AfterResult = conduit:: HandlerResult ;
78
89pub 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 {
1011 Ok ( ( ) )
1112 }
1213
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 {
1815 res
1916 }
2017}
@@ -49,7 +46,7 @@ impl MiddlewareBuilder {
4946}
5047
5148impl 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 {
5350 let mut error = None ;
5451
5552 for ( i, middleware) in self . middlewares . iter ( ) . enumerate ( ) {
@@ -79,9 +76,9 @@ impl Handler for MiddlewareBuilder {
7976
8077fn run_afters (
8178 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 {
8582 middleware
8683 . iter ( )
8784 . rev ( )
@@ -90,20 +87,17 @@ fn run_afters(
9087
9188#[ cfg( test) ]
9289mod tests {
93- extern crate semver;
94-
95- use { AroundMiddleware , Middleware , MiddlewareBuilder } ;
90+ use { AfterResult , AroundMiddleware , BeforeResult , Middleware , MiddlewareBuilder } ;
9691
9792 use std:: any:: Any ;
98- use std:: collections:: HashMap ;
99- use std:: error:: Error ;
93+ use std:: io;
10094 use std:: io:: prelude:: * ;
101- use std:: io:: { self , Cursor } ;
10295 use std:: net:: SocketAddr ;
10396
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+ } ;
107101
108102 struct RequestSentinel {
109103 path : String ,
@@ -121,15 +115,12 @@ mod tests {
121115 }
122116 }
123117
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 {
129120 unimplemented ! ( )
130121 }
131- fn method ( & self ) -> Method {
132- self . method . clone ( )
122+ fn method ( & self ) -> & Method {
123+ & self . method
133124 }
134125 fn scheme ( & self ) -> Scheme {
135126 unimplemented ! ( )
@@ -152,7 +143,7 @@ mod tests {
152143 fn content_length ( & self ) -> Option < u64 > {
153144 unimplemented ! ( )
154145 }
155- fn headers < ' a > ( & ' a self ) -> & ' a dyn Headers {
146+ fn headers ( & self ) -> & HeaderMap {
156147 unimplemented ! ( )
157148 }
158149 fn body < ' a > ( & ' a mut self ) -> & ' a mut dyn Read {
@@ -169,7 +160,7 @@ mod tests {
169160 struct MyMiddleware ;
170161
171162 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 {
173164 req. mut_extensions ( ) . insert ( "hello" . to_string ( ) ) ;
174165 Ok ( ( ) )
175166 }
@@ -178,43 +169,32 @@ mod tests {
178169 struct ErrorRecovery ;
179170
180171 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 {
186173 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)
193179 } )
194180 }
195181 }
196182
197183 struct ProducesError ;
198184
199185 impl Middleware for ProducesError {
200- fn before ( & self , _: & mut dyn Request ) -> Result < ( ) , Box < dyn Error + Send > > {
186+ fn before ( & self , _: & mut dyn RequestExt ) -> BeforeResult {
201187 Err ( Box :: new ( io:: Error :: new ( io:: ErrorKind :: Other , "" ) ) )
202188 }
203189 }
204190
205191 struct NotReached ;
206192
207193 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)
218198 }
219199 }
220200
@@ -237,34 +217,32 @@ mod tests {
237217 }
238218
239219 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 {
241221 req. mut_extensions ( ) . insert ( "hello" . to_string ( ) ) ;
242222 self . handler . as_ref ( ) . unwrap ( ) . call ( req)
243223 }
244224 }
245225
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 {
247227 req. extensions ( ) . find :: < T > ( ) . unwrap ( )
248228 }
249229
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 ( )
256234 }
257235
258- fn handler ( req : & mut dyn Request ) -> io:: Result < Response > {
236+ fn handler ( req : & mut dyn RequestExt ) -> io:: Result < Response < Body > > {
259237 let hello = get_extension :: < String > ( req) ;
260238 Ok ( response ( hello. clone ( ) ) )
261239 }
262240
263- fn error_handler ( _: & mut dyn Request ) -> io:: Result < Response > {
241+ fn error_handler ( _: & mut dyn RequestExt ) -> io:: Result < Response < Body > > {
264242 Err ( io:: Error :: new ( io:: ErrorKind :: Other , "Error in handler" ) )
265243 }
266244
267- fn middle_handler ( req : & mut dyn Request ) -> io:: Result < Response > {
245+ fn middle_handler ( req : & mut dyn RequestExt ) -> io:: Result < Response < Body > > {
268246 let hello = get_extension :: < String > ( req) ;
269247 let middle = get_extension :: < String > ( req) ;
270248
@@ -276,11 +254,11 @@ mod tests {
276254 let mut builder = MiddlewareBuilder :: new ( handler) ;
277255 builder. add ( MyMiddleware ) ;
278256
279- let mut req = RequestSentinel :: new ( Method :: Get , "/" ) ;
257+ let mut req = RequestSentinel :: new ( Method :: GET , "/" ) ;
280258 let mut res = builder. call ( & mut req) . ok ( ) . expect ( "No response" ) ;
281259
282260 let mut s = Vec :: new ( ) ;
283- res. body . write_body ( & mut s) . unwrap ( ) ;
261+ res. body_mut ( ) . write_body ( & mut s) . unwrap ( ) ;
284262 assert_eq ! ( s, b"hello" ) ;
285263 }
286264
@@ -292,23 +270,23 @@ mod tests {
292270 // the error bubbles up from ProducesError and shouldn't reach here
293271 builder. add ( NotReached ) ;
294272
295- let mut req = RequestSentinel :: new ( Method :: Get , "/" ) ;
273+ let mut req = RequestSentinel :: new ( Method :: GET , "/" ) ;
296274 let res = builder. call ( & mut req) . ok ( ) . expect ( "Error not handled" ) ;
297275
298- assert_eq ! ( res. status, ( 500 , "Internal Server Error" ) ) ;
276+ assert_eq ! ( res. status( ) , StatusCode :: INTERNAL_SERVER_ERROR ) ;
299277 }
300278
301279 #[ test]
302280 fn test_error_recovery_in_handlers ( ) {
303281 let mut builder = MiddlewareBuilder :: new ( error_handler) ;
304282 builder. add ( ErrorRecovery ) ;
305283
306- let mut req = RequestSentinel :: new ( Method :: Get , "/" ) ;
284+ let mut req = RequestSentinel :: new ( Method :: GET , "/" ) ;
307285 let mut res = builder. call ( & mut req) . ok ( ) . expect ( "Error not handled" ) ;
308286
309- assert_eq ! ( res. status, ( 500 , "Internal Server Error" ) ) ;
287+ assert_eq ! ( res. status( ) , StatusCode :: INTERNAL_SERVER_ERROR ) ;
310288 let mut s = Vec :: new ( ) ;
311- res. body . write_body ( & mut s) . unwrap ( ) ;
289+ res. body_mut ( ) . write_body ( & mut s) . unwrap ( ) ;
312290 assert_eq ! ( s, b"Error in handler" ) ;
313291 }
314292
@@ -318,11 +296,11 @@ mod tests {
318296 builder. add ( MyMiddleware ) ;
319297 builder. around ( MyAroundMiddleware :: new ( ) ) ;
320298
321- let mut req = RequestSentinel :: new ( Method :: Get , "/" ) ;
299+ let mut req = RequestSentinel :: new ( Method :: GET , "/" ) ;
322300 let mut res = builder. call ( & mut req) . ok ( ) . expect ( "No response" ) ;
323301
324302 let mut s = Vec :: new ( ) ;
325- res. body . write_body ( & mut s) . unwrap ( ) ;
303+ res. body_mut ( ) . write_body ( & mut s) . unwrap ( ) ;
326304 assert_eq ! ( s, b"hello hello" ) ;
327305 }
328306}
0 commit comments