///|
pub struct HeaderCheck {
code : String
detail : String
} derive(Eq, Debug)
///|
pub fn check_headers(headers : Array[Header]) -> Array[HeaderCheck] {
let out : Array[HeaderCheck] = []
check_duplicate_singleton(headers, out, "From")
check_duplicate_singleton(headers, out, "Subject")
check_duplicate_singleton(headers, out, "Date")
check_duplicate_singleton(headers, out, "Message-ID")
for header in headers {
if header.name == "" {
out.push({ code: "header.name.empty", detail: header.value })
}
if header.value == "" {
out.push({ code: "header.value.empty", detail: header.name })
}
if header.name.contains(" ") {
out.push({ code: "header.name.space", detail: header.name })
}
}
out
}
///|
fn check_duplicate_singleton(
headers : Array[Header],
out : Array[HeaderCheck],
name : String,
) -> Unit {
let count = all_header_values(headers, name).length()
if count > 1 {
out.push({
code: "header.duplicate." + lower_ascii(name),
detail: count.to_string(),
})
}
}
///|
pub fn check_message_headers(message : MailMessage) -> Array[HeaderCheck] {
check_headers(message.headers)
}
///|
pub fn has_header_check(checks : Array[HeaderCheck], code : String) -> Bool {
for item in checks {
if item.code == code {
return true
}
}
false
}