Render a pretty hexdump in the logs
This commit is contained in:
parent
f7edffc6cc
commit
53e5c929ca
6 changed files with 34 additions and 8 deletions
|
@ -14,6 +14,7 @@ include = ["src/**/*", "Cargo.toml", "LICENSE-*.txt"]
|
|||
[dependencies]
|
||||
log = "0.4"
|
||||
nom = "6.0"
|
||||
pretty-hex = "0.2"
|
||||
|
||||
[dev-dependencies]
|
||||
simplelog = "0.8"
|
||||
|
|
27
src/error.rs
Normal file
27
src/error.rs
Normal file
|
@ -0,0 +1,27 @@
|
|||
use nom::error::Error;
|
||||
use nom::Err;
|
||||
use pretty_hex::pretty_hex;
|
||||
|
||||
fn error_to_string(e: Error<&[u8]>) -> String {
|
||||
format!(
|
||||
"parsing error: {:?}: input:{}",
|
||||
e.code,
|
||||
get_pretty_hex(&e.input)
|
||||
)
|
||||
}
|
||||
|
||||
pub(crate) fn get_pretty_hex(input: &[u8]) -> String {
|
||||
let mut s = String::new();
|
||||
for l in pretty_hex(&input).split('\n') {
|
||||
s += &format!("\n{}", l);
|
||||
}
|
||||
s
|
||||
}
|
||||
|
||||
pub(crate) fn nom_err_to_string(e: Err<Error<&[u8]>>) -> String {
|
||||
match e {
|
||||
Err::Incomplete(_) => e.to_string(),
|
||||
Err::Error(er) => error_to_string(er),
|
||||
Err::Failure(er) => error_to_string(er),
|
||||
}
|
||||
}
|
|
@ -1,3 +1,4 @@
|
|||
use crate::error::get_pretty_hex;
|
||||
use std::io::{self, ErrorKind, Read};
|
||||
use std::sync::mpsc::Sender;
|
||||
|
||||
|
@ -34,7 +35,7 @@ fn do_read_stdin(tx: &Sender<Vec<u8>>) -> Result<(), String> {
|
|||
let pos = id + 1;
|
||||
let mut line = Vec::with_capacity(pos);
|
||||
line.extend_from_slice(&line_buffer[..pos]);
|
||||
log::trace!("new line: {:?}", &line);
|
||||
log::trace!("new line:{}", get_pretty_hex(&line));
|
||||
tx.send(line).unwrap();
|
||||
line_buffer.drain(..pos);
|
||||
}
|
||||
|
|
|
@ -45,6 +45,7 @@
|
|||
|
||||
mod data_line;
|
||||
mod data_structures;
|
||||
mod error;
|
||||
mod filter;
|
||||
mod io;
|
||||
mod parsers;
|
||||
|
|
|
@ -339,12 +339,7 @@ mod tests {
|
|||
|
||||
#[test]
|
||||
fn test_invalid_parse_filter_auth() {
|
||||
let test_vectors = vec![
|
||||
"|\n",
|
||||
"|\r\n",
|
||||
"|derp",
|
||||
"|derp|derpson\n",
|
||||
];
|
||||
let test_vectors = vec!["|\n", "|\r\n", "|derp", "|derp|derpson\n"];
|
||||
for test in test_vectors {
|
||||
let res = parse_filter_auth(test.as_bytes());
|
||||
assert!(!res.is_ok());
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
use crate::error::nom_err_to_string;
|
||||
use crate::parsers::entry::{parse_entry, EntryOption};
|
||||
use crate::parsers::parameters::{
|
||||
parse_filter_auth, parse_filter_connect, parse_filter_data_line, parse_filter_ehlo,
|
||||
|
@ -147,7 +148,7 @@ pub(crate) fn line<T>(user_object: &mut T, input: &[u8]) -> Result<(), String>
|
|||
where
|
||||
T: Filter,
|
||||
{
|
||||
let (input, entry) = parse_entry(input).map_err(|e| e.to_string())?;
|
||||
let (input, entry) = parse_entry(input).map_err(nom_err_to_string)?;
|
||||
match entry {
|
||||
EntryOption::Report(r) => handle_reports!(user_object, r, input),
|
||||
EntryOption::Filter(f) => {
|
||||
|
|
Reference in a new issue