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 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);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user