From 9b2209bcce908eac13a84976a98649bae0ca0999 Mon Sep 17 00:00:00 2001 From: MeexReay Date: Sun, 24 Nov 2024 11:21:43 +0300 Subject: [PATCH] chunked data reading --- src/flowgate/server.rs | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/flowgate/server.rs b/src/flowgate/server.rs index a84c59e..5e96bbd 100644 --- a/src/flowgate/server.rs +++ b/src/flowgate/server.rs @@ -425,7 +425,35 @@ impl FlowgateServer { if read >= content_length { break } } } else if is_chunked { - // write chunked logic + loop { + let mut length = Vec::new(); + { + let mut buf = [0; 1]; + let mut counter = 0; + + while let Ok(1) = stream.read(&mut buf) { + let byte = buf[0]; + length.push(byte); + + counter = match (counter, byte) { + (0, b'\r') => 1, + (1, b'\n') => break, + _ => 0, + }; + conn.stream.write_all(&buf).ok()?; + } + + length.truncate(length.len() - 2); + } + let length = usize::from_str_radix(String::from_utf8(length).ok()?.as_str(), 16).ok()?; + let mut data = vec![0; length+2]; + stream.read_exact(&mut data).ok()?; + conn.stream.write_all(&data).ok()?; + data.truncate(length); + if length == 0 { + break; + } + } } if conn.config.support_keep_alive {