use crate::runner::hex;
use crate::util::logger::Logger;
use super::header::HeaderVec;
use super::mimetype;
pub fn log_body(body: &[u8], headers: &HeaderVec, debug: bool, logger: &mut Logger) {
if let Some(content_type) = headers.content_type()
&& !mimetype::is_kind_of_text(content_type)
{
log_bytes(body, 64, debug, logger);
return;
}
let encoding = match headers.character_encoding() {
Ok(encoding) => encoding,
Err(_) => {
log_bytes(body, 64, debug, logger);
return;
}
};
match encoding.decode_without_bom_handling_and_without_replacement(body) {
Some(text) => log_text(&text, debug, logger),
None => log_bytes(body, 64, debug, logger),
}
}
pub fn log_text(text: &str, debug: bool, logger: &mut Logger) {
if text.is_empty() {
if debug {
logger.debug("");
} else {
logger.info("");
}
} else {
let lines = text.split('\n');
if debug {
lines.for_each(|l| logger.debug(l));
} else {
lines.for_each(|l| logger.info(l));
}
}
}
pub fn log_bytes(bytes: &[u8], max: usize, debug: bool, logger: &mut Logger) {
let bytes = if bytes.len() > max {
&bytes[..max]
} else {
bytes
};
let log = if bytes.is_empty() {
String::new()
} else {
format!("Bytes <{}...>", hex::encode(bytes))
};
if debug {
logger.debug(&log);
} else {
logger.info(&log);
}
}