wiretrail 0.3.1

Fast, deterministic, agent-friendly HAR analyzer CLI. heaptrail for network captures.
Documentation
use serde::Deserialize;

#[derive(Debug, Deserialize)]
pub struct RawDoc {
    pub log: RawLog,
}

#[derive(Debug, Deserialize)]
pub struct RawLog {
    #[serde(default)]
    pub version: String,
    #[serde(default)]
    pub creator: RawCreator,
    #[serde(default)]
    pub browser: Option<RawCreator>,
    #[serde(default)]
    pub entries: Vec<RawEntry>,
}

#[derive(Debug, Default, Deserialize)]
pub struct RawCreator {
    #[serde(default)]
    pub name: String,
    #[serde(default)]
    pub version: String,
}

#[derive(Debug, Deserialize)]
pub struct RawEntry {
    #[serde(rename = "startedDateTime", default)]
    pub started_date_time: String,
    #[serde(default)]
    pub time: f64,
    pub request: RawRequest,
    pub response: RawResponse,
    #[serde(default)]
    pub timings: RawTimings,
    #[serde(rename = "serverIPAddress", default)]
    pub server_ip_address: Option<String>,
}

#[derive(Debug, Deserialize)]
pub struct RawRequest {
    #[serde(default)]
    pub method: String,
    #[serde(default)]
    pub url: String,
    #[serde(rename = "httpVersion", default)]
    pub http_version: String,
    #[serde(default)]
    pub headers: Vec<RawNameValue>,
    #[serde(rename = "queryString", default)]
    pub query_string: Vec<RawNameValue>,
    #[serde(rename = "postData", default)]
    pub post_data: Option<RawPostData>,
    #[serde(rename = "bodySize", default)]
    pub body_size: i64,
}

#[derive(Debug, Deserialize)]
pub struct RawResponse {
    #[serde(default)]
    pub status: i64,
    #[serde(rename = "statusText", default)]
    pub status_text: String,
    #[serde(rename = "httpVersion", default)]
    pub http_version: String,
    #[serde(default)]
    pub headers: Vec<RawNameValue>,
    #[serde(default)]
    pub content: RawContent,
    #[serde(rename = "redirectURL", default)]
    pub redirect_url: Option<String>,
    #[serde(rename = "headersSize", default)]
    pub headers_size: i64,
    #[serde(rename = "bodySize", default)]
    pub body_size: i64,
}

impl RawResponse {
    pub fn http_version_or_request(&self, req_version: &str) -> String {
        if self.http_version.is_empty() {
            req_version.to_string()
        } else {
            self.http_version.clone()
        }
    }
}

#[derive(Debug, Default, Deserialize)]
pub struct RawContent {
    #[serde(default)]
    pub size: i64,
    #[serde(rename = "mimeType", default)]
    pub mime_type: Option<String>,
    #[serde(default)]
    pub text: Option<String>,
}

#[derive(Debug, Default, Deserialize)]
pub struct RawPostData {
    #[serde(rename = "mimeType", default)]
    pub mime_type: String,
    #[serde(default)]
    pub text: Option<String>,
}

#[derive(Debug, Default, Deserialize)]
pub struct RawTimings {
    #[serde(default)]
    pub blocked: Option<f64>,
    #[serde(default)]
    pub dns: Option<f64>,
    #[serde(default)]
    pub connect: Option<f64>,
    #[serde(default)]
    pub send: f64,
    #[serde(default)]
    pub wait: f64,
    #[serde(default)]
    pub receive: f64,
    #[serde(default)]
    pub ssl: Option<f64>,
}

#[derive(Debug, Deserialize)]
pub struct RawNameValue {
    #[serde(default)]
    pub name: String,
    #[serde(default)]
    pub value: String,
}