@@ -30,7 +30,8 @@ pub struct HttpServer {
3030 server : Http3Server ,
3131 /// Progress writing to each stream.
3232 remaining_data : HashMap < StreamId , SendData > ,
33- posts : HashMap < Http3OrWebTransportStream , usize > ,
33+ /// Tracks POST requests: (bytes received, optional response size from path)
34+ posts : HashMap < Http3OrWebTransportStream , ( usize , Option < usize > ) > ,
3435 is_qns_test : bool ,
3536}
3637
@@ -104,7 +105,10 @@ impl super::HttpServer for HttpServer {
104105 qdebug ! ( "Headers (request={stream} fin={fin}): {headers:?}" ) ;
105106
106107 if headers. contains_header ( ":method" , "POST" ) {
107- self . posts . insert ( stream, 0 ) ;
108+ let response_size = headers
109+ . find_header ( ":path" )
110+ . and_then ( |path| path. value ( ) . trim_matches ( '/' ) . parse :: < usize > ( ) . ok ( ) ) ;
111+ self . posts . insert ( stream, ( 0 , response_size) ) ;
108112 continue ;
109113 }
110114
@@ -162,17 +166,28 @@ impl super::HttpServer for HttpServer {
162166 }
163167
164168 Http3ServerEvent :: Data { stream, data, fin } => {
165- if let Some ( received) = self . posts . get_mut ( & stream) {
169+ if let Some ( ( received, _ ) ) = self . posts . get_mut ( & stream) {
166170 * received += data. len ( ) ;
167171 }
168172 if fin {
169- if let Some ( received) = self . posts . remove ( & stream) {
170- let msg = received. to_string ( ) . as_bytes ( ) . to_vec ( ) ;
173+ if let Some ( ( received, response_size) ) = self . posts . remove ( & stream) {
174+ let mut response = response_size. map_or_else (
175+ || SendData :: from ( received. to_string ( ) . into_bytes ( ) ) ,
176+ SendData :: zeroes,
177+ ) ;
178+
171179 stream
172- . send_headers ( & [ Header :: new ( ":status" , "200" ) ] )
180+ . send_headers ( & [
181+ Header :: new ( ":status" , "200" ) ,
182+ Header :: new ( "content-length" , response. len ( ) . to_string ( ) ) ,
183+ ] )
173184 . unwrap ( ) ;
174- stream. send_data ( & msg, now) . unwrap ( ) ;
175- stream. stream_close_send ( now) . unwrap ( ) ;
185+ let done = response. send ( |chunk| stream. send_data ( chunk, now) . unwrap ( ) ) ;
186+ if done {
187+ stream. stream_close_send ( now) . unwrap ( ) ;
188+ } else {
189+ self . remaining_data . insert ( stream. stream_id ( ) , response) ;
190+ }
176191 }
177192 }
178193 }
0 commit comments