From 02a1213dac66477a391b7536de1c60c6a399c4b7 Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Wed, 5 Mar 2025 15:02:15 +0100 Subject: [PATCH] Parse response --- src/main.rs | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/src/main.rs b/src/main.rs index 11bf567..943d21a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,6 @@ use std::str::FromStr; use clap::Parser; +use http::StatusCode; /// Simple SCEP parser program #[derive(Parser, Debug)] @@ -61,6 +62,47 @@ fn parse_request(req: &[u8]) -> anyhow::Result>> { } } + +/// Parse HTTP response +fn parse_response(req: &[u8]) -> anyhow::Result>> { + // Extract first list + let first_line_end = find_in_bytes(req, b'\r').expect("No newline found in req"); + let first_line = String::from_utf8_lossy(&req[..first_line_end]); + let first_line = first_line.split(' ').collect::>(); + // let version = first_line[0]; + let status = first_line[1].parse::()?; + + let mut builder = http::Response::builder() + .status(StatusCode::from_u16(status)?) + .version(http::version::Version::HTTP_10); // FIXME: parse version properly + + let mut remainder = &req[first_line_end + 2..]; + + // Parse following lines + while remainder.len() > 2 { + let line_end = find_in_bytes(remainder, b'\r').expect("No newline found while parsing headers"); + + if line_end == 0 { + break; + } + + let line = String::from_utf8_lossy(&remainder[..line_end]); + + let (key, value) = line.split_once(": ").unwrap(); + builder = builder.header(key, value); + + remainder = &remainder[line_end + 2..]; + } + + if remainder.len() > 2 { + Ok(builder.body(remainder[2..].to_vec())?) + } + + else { + Ok(builder.body(Vec::new())?) + } +} + fn main() { env_logger::init_from_env(env_logger::Env::new().default_filter_or("info")); @@ -70,5 +112,9 @@ fn main() { let request = std::fs::read(&args.req_file).expect("Failed to read request file!"); let request = parse_request(&request).expect("Failed to parse request file!"); + let response = std::fs::read(&args.res_file).expect("Failed to read response file!"); + let response = parse_response(&response).expect("Failed to parse response file!"); + println!("Request: {:?}", request); + println!("Response: {:?}", response); }