Parse response

This commit is contained in:
Pierre HUBERT 2025-03-05 15:02:15 +01:00
parent ce7535fa9d
commit 02a1213dac

View File

@ -1,5 +1,6 @@
use std::str::FromStr; use std::str::FromStr;
use clap::Parser; use clap::Parser;
use http::StatusCode;
/// Simple SCEP parser program /// Simple SCEP parser program
#[derive(Parser, Debug)] #[derive(Parser, Debug)]
@ -61,6 +62,47 @@ fn parse_request(req: &[u8]) -> anyhow::Result<http::Request<Vec<u8>>> {
} }
} }
/// Parse HTTP response
fn parse_response(req: &[u8]) -> anyhow::Result<http::Response<Vec<u8>>> {
// 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::<Vec<_>>();
// let version = first_line[0];
let status = first_line[1].parse::<u16>()?;
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() { fn main() {
env_logger::init_from_env(env_logger::Env::new().default_filter_or("info")); 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 = std::fs::read(&args.req_file).expect("Failed to read request file!");
let request = parse_request(&request).expect("Failed to parse 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!("Request: {:?}", request);
println!("Response: {:?}", response);
} }