Skip to main content

flowparser_sflow/flow_records/
http_request.rs

1use nom::IResult;
2use nom::number::complete::{be_u32, be_u64};
3use serde::{Deserialize, Serialize};
4
5use super::parse_sflow_string;
6
7#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
8pub struct HttpRequest {
9    pub method: u32,
10    pub protocol: u32,
11    pub uri: String,
12    pub host: String,
13    pub referer: String,
14    pub useragent: String,
15    pub xff: String,
16    pub authuser: String,
17    pub mime_type: String,
18    pub req_bytes: u64,
19    pub resp_bytes: u64,
20    pub duration_us: u32,
21    pub status: u32,
22}
23
24pub(crate) fn parse_http_request(input: &[u8]) -> IResult<&[u8], HttpRequest> {
25    let (input, method) = be_u32(input)?;
26    let (input, protocol) = be_u32(input)?;
27    let (input, uri) = parse_sflow_string(input)?;
28    let (input, host) = parse_sflow_string(input)?;
29    let (input, referer) = parse_sflow_string(input)?;
30    let (input, useragent) = parse_sflow_string(input)?;
31    let (input, xff) = parse_sflow_string(input)?;
32    let (input, authuser) = parse_sflow_string(input)?;
33    let (input, mime_type) = parse_sflow_string(input)?;
34    let (input, req_bytes) = be_u64(input)?;
35    let (input, resp_bytes) = be_u64(input)?;
36    let (input, duration_us) = be_u32(input)?;
37    let (input, status) = be_u32(input)?;
38
39    Ok((
40        input,
41        HttpRequest {
42            method,
43            protocol,
44            uri,
45            host,
46            referer,
47            useragent,
48            xff,
49            authuser,
50            mime_type,
51            req_bytes,
52            resp_bytes,
53            duration_us,
54            status,
55        },
56    ))
57}