Don't panic on unknown status codes (#234)

This commit is contained in:
Matthias 2021-09-08 01:14:20 +02:00 committed by GitHub
parent fa920d24b8
commit e188e72fc0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 14 additions and 3 deletions

View file

@ -16,7 +16,7 @@ pub(crate) fn color_response(response: &ResponseBody) -> String {
Status::Ok(_) => style(response).green().bright(),
Status::Excluded | Status::Unsupported(_) => style(response).dim(),
Status::Redirected(_) => style(response),
Status::Timeout(_) => style(response).yellow().bright(),
Status::UnknownStatusCode(_) | Status::Timeout(_) => style(response).yellow().bright(),
Status::Error(_) => style(response).red().bright(),
};
out.to_string()
@ -27,6 +27,7 @@ pub(crate) struct ResponseStats {
total: usize,
successful: usize,
failures: usize,
unknown: usize,
timeouts: usize,
redirects: usize,
excludes: usize,
@ -52,6 +53,7 @@ impl ResponseStats {
match status {
Status::Ok(_) => self.successful += 1,
Status::Error(_) => self.failures += 1,
Status::UnknownStatusCode(_) => self.unknown += 1,
Status::Timeout(_) => self.timeouts += 1,
Status::Redirected(_) => self.redirects += 1,
Status::Excluded => self.excludes += 1,
@ -105,6 +107,7 @@ impl Display for ResponseStats {
write_stat(f, "\u{23f3} Timeouts", self.timeouts, true)?; // ⏳
write_stat(f, "\u{1f500} Redirected", self.redirects, true)?; // 🔀
write_stat(f, "\u{1f47b} Excluded", self.excludes, true)?; // 👻
write_stat(f, "\u{26a0} Unknown", self.unknown, true)?; // ⚠️
write_stat(f, "\u{1f6ab} Errors", self.errors + self.failures, false)?; // 🚫
for (input, responses) in &self.fail_map {

View file

@ -40,6 +40,7 @@ mod cli {
total: usize,
successful: usize,
failures: usize,
unknown: usize,
timeouts: usize,
redirects: usize,
excludes: usize,
@ -53,6 +54,7 @@ mod cli {
"total": {},
"successful": {},
"failures": {},
"unknown": {},
"timeouts": {},
"redirects": {},
"excludes": {},
@ -62,6 +64,7 @@ mod cli {
self.total,
self.successful,
self.failures,
self.unknown,
self.timeouts,
self.redirects,
self.excludes,
@ -364,7 +367,7 @@ mod cli {
.assert()
.success();
let expected = r#"{"total":10,"successful":10,"failures":0,"timeouts":0,"redirects":0,"excludes":0,"errors":0,"fail_map":{}}"#;
let expected = r#"{"total":10,"successful":10,"failures":0,"unknown":0,"timeouts":0,"redirects":0,"excludes":0,"errors":0,"fail_map":{}}"#;
let output = fs::read_to_string(&outfile)?;
assert_eq!(output.split_whitespace().collect::<String>(), expected);
fs::remove_file(outfile)?;

View file

@ -10,6 +10,7 @@ const ICON_OK: &str = "\u{2714}"; // ✔
const ICON_REDIRECTED: &str = "\u{21c4}"; // ⇄
const ICON_EXCLUDED: &str = "\u{003f}"; // ?
const ICON_UNSUPPORTED: &str = "\u{003f}"; // ? (using same icon, but under different name for explicitness)
const ICON_UNKNOWN: &str = "\u{003f}"; // ?
const ICON_ERROR: &str = "\u{2717}"; // ✗
const ICON_TIMEOUT: &str = "\u{29d6}"; // ⧖
@ -25,6 +26,8 @@ pub enum Status {
Timeout(Option<StatusCode>),
/// Got redirected to different resource
Redirected(StatusCode),
/// The given status code is not known by lychee
UnknownStatusCode(StatusCode),
/// Resource was excluded from checking
Excluded,
/// The request type is currently not supported,
@ -38,6 +41,7 @@ impl Display for Status {
match self {
Status::Ok(c) => write!(f, "OK ({})", c),
Status::Redirected(c) => write!(f, "Redirect ({})", c),
Status::UnknownStatusCode(c) => write!(f, "Unknown status: {}", c),
Status::Excluded => f.write_str("Excluded"),
Status::Timeout(Some(c)) => write!(f, "Timeout ({})", c),
Status::Timeout(None) => f.write_str("Timeout"),
@ -69,8 +73,8 @@ impl Status {
match response.error_for_status_ref() {
Ok(_) if code.is_success() => Self::Ok(code),
Ok(_) if code.is_redirection() => Self::Redirected(code),
Ok(_) => Self::UnknownStatusCode(code),
Err(e) => e.into(),
Ok(_) => unreachable!(),
}
}
}
@ -116,6 +120,7 @@ impl Status {
match self {
Status::Ok(_) => ICON_OK,
Status::Redirected(_) => ICON_REDIRECTED,
Status::UnknownStatusCode(_) => ICON_UNKNOWN,
Status::Excluded => ICON_EXCLUDED,
Status::Error(_) => ICON_ERROR,
Status::Timeout(_) => ICON_TIMEOUT,