Skip to content
This repository was archived by the owner on Aug 1, 2024. It is now read-only.

Commit 3ca587c

Browse files
committed
Reuse middleware connection after handler was called
1 parent de8ada5 commit 3ca587c

File tree

2 files changed

+47
-22
lines changed

2 files changed

+47
-22
lines changed

Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "rust-esp32-std-demo"
3-
version = "0.28.0"
3+
version = "0.29.0"
44
authors = ["ivmarkov"]
55
edition = "2018"
66
categories = ["embedded", "hardware-support"]
@@ -67,9 +67,9 @@ anyhow = {version = "1", features = ["backtrace"]}
6767
log = "0.4"
6868
url = "2"
6969
esp-idf-sys = { version = "0.32", features = ["binstart"] }
70-
esp-idf-svc = "0.44"
70+
esp-idf-svc = "0.45"
7171
esp-idf-hal = "0.40"
72-
embedded-svc = "0.23"
72+
embedded-svc = "0.24"
7373
embedded-hal = "0.2"
7474
embedded-graphics = "0.7"
7575
display-interface = "0.4"

src/main.rs

Lines changed: 44 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)