customizable http statuses

This commit is contained in:
Pierre Dubouilh
2025-02-07 13:36:21 +01:00
parent 676bc30af8
commit 4cb7fc694a
2 changed files with 35 additions and 7 deletions
+5 -4
View File
@@ -18,6 +18,11 @@ async fn run() -> Result<()> {
let args = utils::Args::parse();
let mut ml = MuxedLines::new()?;
// HTTP statuses
let ok_statuses = args.valid_http_statuses.clone();
let ok_statuses_parsed = parse_statuses(&ok_statuses)?;
let ok_statuses_ref = ok_statuses_parsed.as_ref();
// generic parser
let generic_path = args.generic_logpath.as_ref();
let generic_ip_re = args.generic_ip.as_ref();
@@ -65,10 +70,6 @@ async fn run() -> Result<()> {
bail!("no log files to parse, see --help");
}
// HTTP statuses
let ok_statuses = args.valid_http_statuses.clone();
let ok_statuses_ref = ok_statuses.as_ref();
// jail
let jail = Jail::new(args.allowance, args.jailtime)?;
+30 -3
View File
@@ -44,6 +44,33 @@ pub fn parse_regex(a: &str) -> Result<Regex> {
Ok(r)
}
pub fn parse_statuses(a: &str) -> Result<Vec<u32>> {
let mut statuses = vec![];
for s in a.split(',') {
if s.contains("xx") {
let range = s.replace("xx", "");
let range = range.parse::<u32>().context("invalid range")?;
let range = range * 100;
for i in 0..100 {
let status = range + i;
statuses.push(status);
}
} else if s.contains("x") {
let range = s.replace("x", "");
let range = range.parse::<u32>().context("invalid range")?;
let range = range * 10;
for i in 0..10 {
let status = range + i;
statuses.push(status);
}
} else {
let status = s.parse::<u32>().context("invalid status")?;
statuses.push(status);
}
}
Ok(statuses)
}
pub(crate) use log;
#[derive(Parser, Debug)]
@@ -110,7 +137,7 @@ pub struct Args {
#[clap(long)]
pub generic_negative: Option<String>,
/// valid http statuses (for CLF and JSON logs)
#[clap(long, default_values_t = [200,101])]
pub valid_http_statuses: Vec<u32>,
/// valid http statuses (for CLF and JSON logs). Coma separated list, accepts ranges with XX.
#[clap(long, default_value = "10x,20x,30x,404,408")]
pub valid_http_statuses: String,
}