1515
1616mod lib;
1717
18- use anyhow:: { Ok , Result } ;
18+ use anyhow:: Result ;
1919use core:: str;
2020use embedded_svc:: { http:: Method , io:: Write } ;
2121use esp_idf_svc:: {
@@ -25,9 +25,11 @@ use esp_idf_svc::{
2525 prelude:: * ,
2626 } ,
2727 http:: server:: { Configuration , EspHttpServer } ,
28+ io:: { EspIOError , Read } ,
2829} ;
2930use lib:: wifi:: wifi;
3031use shtcx:: { self , shtc3, PowerMode } ;
32+ use std:: result:: Result :: Ok ;
3133use 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