@@ -1182,39 +1182,59 @@ fn httpd(
11821182 mutex : Arc < ( Mutex < Option < u32 > > , Condvar ) > ,
11831183) -> Result < esp_idf_svc:: http:: server:: EspHttpServer > {
11841184 use embedded_svc:: http:: server:: {
1185- handler, Connection , FnHandler , Handler , HandlerResult , Method , Middleware , Request ,
1186- Response ,
1185+ Connection , Handler , HandlerResult , Method , Middleware , Query , Request , Response ,
11871186 } ;
11881187 use embedded_svc:: io:: Write ;
1189- use esp_idf_svc:: http:: server:: EspHttpConnection ;
1188+ use esp_idf_svc:: http:: server:: { fn_handler , EspHttpConnection , EspHttpServer } ;
11901189
11911190 struct SampleMiddleware { }
11921191
11931192 impl < C > Middleware < C > for SampleMiddleware
11941193 where
11951194 C : Connection ,
11961195 {
1197- fn handle < ' a , H > ( & ' a self , connection : C , handler : & ' a H ) -> HandlerResult
1196+ fn handle < ' a , H > ( & ' a self , connection : & ' a mut C , handler : & ' a H ) -> HandlerResult
11981197 where
11991198 H : Handler < C > ,
12001199 {
1201- info ! ( "Middleware called" ) ;
1200+ let req = Request :: wrap ( connection ) ;
12021201
1203- handler. handle ( connection)
1202+ info ! ( "Middleware called with uri: {}" , req. uri( ) ) ;
1203+
1204+ let connection = req. release ( ) ;
1205+
1206+ if let Err ( err) = handler. handle ( connection) {
1207+ if !connection. is_response_initiated ( ) {
1208+ let mut resp = Request :: wrap ( connection) . into_status_response ( 500 ) ?;
1209+
1210+ write ! ( & mut resp, "ERROR: {}" , err) ?;
1211+ } else {
1212+ // Nothing can be done as the error happened after the response was initiated, propagate further
1213+ return Err ( err) ;
1214+ }
1215+ }
1216+
1217+ Ok ( ( ) )
12041218 }
12051219 }
12061220
1207- // Necessary, until I figure out a more decent solution that does not
1208- // refer to `EspHttpConnection`, but to the Connection trait instead
1209- // (if at all possible)
1210- fn fix_hrtb < F > ( f : F ) -> F
1221+ struct SampleMiddleware2 { }
1222+
1223+ impl < C > Middleware < C > for SampleMiddleware2
12111224 where
1212- F : for < ' a , ' b > Fn ( Request < & ' a mut EspHttpConnection < ' b > > ) -> HandlerResult ,
1225+ C : Connection ,
12131226 {
1214- f
1227+ fn handle < ' a , H > ( & ' a self , connection : & ' a mut C , handler : & ' a H ) -> HandlerResult
1228+ where
1229+ H : Handler < C > ,
1230+ {
1231+ info ! ( "Middleware2 called" ) ;
1232+
1233+ handler. handle ( connection)
1234+ }
12151235 }
12161236
1217- let mut server = esp_idf_svc :: http :: server :: EspHttpServer :: new ( & Default :: default ( ) ) ?;
1237+ let mut server = EspHttpServer :: new ( & Default :: default ( ) ) ?;
12181238
12191239 server
12201240 . fn_handler ( "/" , Method :: Get , |req| {
@@ -1223,7 +1243,7 @@ fn httpd(
12231243
12241244 Ok ( ( ) )
12251245 } ) ?
1226- . fn_handler ( "/foo" , Method :: Get , |_req | {
1246+ . fn_handler ( "/foo" , Method :: Get , |_ | {
12271247 Result :: Err ( "Boo, something happened!" . into ( ) )
12281248 } ) ?
12291249 . fn_handler ( "/bar" , Method :: Get , |req| {
@@ -1232,15 +1252,20 @@ fn httpd(
12321252
12331253 Ok ( ( ) )
12341254 } ) ?
1235- . fn_handler ( "/panic" , Method :: Get , |req| {
1236- panic ! ( "User requested a panic!" )
1237- } ) ?
1255+ . fn_handler ( "/panic" , Method :: Get , |_| panic ! ( "User requested a panic!" ) ) ?
12381256 . handler (
12391257 "/middleware" ,
12401258 Method :: Get ,
1241- SampleMiddleware { } . compose ( handler ( fix_hrtb ( |req| {
1259+ SampleMiddleware { } . compose ( fn_handler ( |_| {
1260+ Result :: Err ( "Boo, something happened!" . into ( ) )
1261+ } ) ) ,
1262+ ) ?
1263+ . handler (
1264+ "/middleware2" ,
1265+ Method :: Get ,
1266+ SampleMiddleware2 { } . compose ( SampleMiddleware { } . compose ( fn_handler ( |req| {
12421267 req. into_ok_response ( ) ?
1243- . write_all ( "Middleware handler called" . as_bytes ( ) ) ?;
1268+ . write_all ( "Middleware2 handler called" . as_bytes ( ) ) ?;
12441269
12451270 Ok ( ( ) )
12461271 } ) ) ) ,
0 commit comments