Skip to content

Commit 43ca91f

Browse files
committed
Add post handler and get the body
1 parent 77bdaa0 commit 43ca91f

File tree

1 file changed

+66
-8
lines changed

1 file changed

+66
-8
lines changed

src/main.rs

Lines changed: 66 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
mod lib;
1717

18-
use anyhow::{Ok, Result};
18+
use anyhow::Result;
1919
use core::str;
2020
use embedded_svc::{http::Method, io::Write};
2121
use esp_idf_svc::{
@@ -25,9 +25,11 @@ use esp_idf_svc::{
2525
prelude::*,
2626
},
2727
http::server::{Configuration, EspHttpServer},
28+
io::{EspIOError, Read},
2829
};
2930
use lib::wifi::wifi;
3031
use shtcx::{self, shtc3, PowerMode};
32+
use std::result::Result::Ok;
3133
use std::{
3234
sync::{Arc, Mutex},
3335
thread::sleep,
@@ -62,13 +64,69 @@ fn main() -> Result<()> {
6264
// `EspHttpServer` instance using a default configuration
6365
let mut server = EspHttpServer::new(&Configuration::default())?;
6466

65-
server.fn_handler("/", Method::Get, |request| {
66-
println!("request from: {:?}", request.header("user-agent"));
67-
let html = index_html();
68-
let mut response = request.into_ok_response()?;
69-
response.write_all(html.as_bytes())?;
70-
Ok(())
71-
})?;
67+
server.fn_handler(
68+
"/",
69+
Method::Get,
70+
|request| -> core::result::Result<(), EspIOError> {
71+
println!("request from: {:?}", request.header("user-agent"));
72+
let html = index_html();
73+
let mut response = request.into_ok_response()?;
74+
response.write_all(html.as_bytes())?;
75+
Ok(())
76+
},
77+
)?;
78+
79+
server.fn_handler(
80+
"/",
81+
Method::Post,
82+
|mut request| -> core::result::Result<(), EspIOError> {
83+
println!(
84+
"request from: {:?}",
85+
request.header("user-agent").unwrap_or("Unknown")
86+
);
87+
let (_headers, connection) = request.split();
88+
89+
const MAX_BODY_SIZE: usize = 4096; // 4KB
90+
let mut buffer: Vec<u8> = Vec::with_capacity(MAX_BODY_SIZE);
91+
let mut temp_buffer = [0u8; 1024];
92+
93+
loop {
94+
let bytes_read = connection.read(&mut temp_buffer)?;
95+
96+
if bytes_read == 0 {
97+
break;
98+
}
99+
100+
// exceed MAX_BODY_SIZE
101+
if buffer.len() + bytes_read > MAX_BODY_SIZE {
102+
println!("Exceed the body size");
103+
let mut response = request.into_status_response(413)?;
104+
response.write_all(b"Payload Too Large")?;
105+
return Ok(());
106+
}
107+
108+
buffer.extend_from_slice(&temp_buffer[..bytes_read]);
109+
}
110+
111+
let body_str = match std::str::from_utf8(&buffer) {
112+
Ok(s) => s,
113+
Err(_) => {
114+
println!("Cuerpo de la solicitud no es UTF-8 válido");
115+
let mut response = request.into_status_response(400)?;
116+
response.write_all(b"Invalid UTF-8 in body")?;
117+
return Ok(());
118+
}
119+
};
120+
121+
println!("request body: {:#?}", body_str);
122+
123+
let html = templated("post /");
124+
let mut response = request.into_ok_response()?;
125+
126+
response.write_all(html.as_bytes())?;
127+
Ok(())
128+
},
129+
)?;
72130

73131
println!("Server awaiting connection");
74132

0 commit comments

Comments
 (0)