Parse response
This commit is contained in:
parent
ce7535fa9d
commit
02a1213dac
46
src/main.rs
46
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<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() {
|
||||
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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user