Skip to content

Commit

Permalink
Fix change to 200 not notifying
Browse files Browse the repository at this point in the history
  • Loading branch information
scottmmjackson committed Sep 13, 2023
1 parent fffa312 commit 8ddfa7d
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 39 deletions.
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
[package]
name = "upnotify"
description = "A tool that prints to stdout when the status of a URL changes."
version = "0.1.1"
version = "0.1.2"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
reqwest = { version = "0.11.20", features = ["blocking", "native-tls-vendored"] }
http = "0.2"
clap = { version = "4.4.0", features = ["cargo"] }

[[bin]]
Expand Down
105 changes: 67 additions & 38 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,49 +31,78 @@ fn main() {
let mut previous_status_option: Result = Result::None;

loop {
match client.get(url).send() {
Ok(result) => {
let status_code = result.status();
match previous_status_option {
Result::StatusCode(previous_status)
if status_code.as_u16() != previous_status.as_u16() => {
println!("Status changed to {:?}", status_code)
}
Result::None => {
println!("Status changed to {:?}", status_code)
}
_ => {}
let response = dbg!(client.get(url).send());
previous_status_option = request_loop(response, previous_status_option);
sleep(Duration::from_secs(5));
}
}

fn request_loop(response: reqwest::Result<reqwest::blocking::Response>,
previous_status_option: Result) -> Result {
return match response {
Ok(result) => {
let status_code = result.status();
match previous_status_option {
Result::StatusCode(previous_status)
if status_code.as_u16() != previous_status.as_u16() => {
println!("Status changed to {:?}", status_code)
}
previous_status_option = Result::StatusCode(status_code);
Result::None | Result::TimeoutError(_) | Result::ConnectError(_) |
Result::RequestError(_) | Result::OtherError(_) => {
println!("Status changed to {:?}", status_code)
}
_ => {}
}
Err(error) => {
match previous_status_option {
Result::ConnectError(_error) if error.is_connect() => {}
Result::TimeoutError(_error) if error.is_timeout() => {}
Result::RequestError(_error) if error.is_request() => {}
_ => {
if error.is_connect() {
println!("Status changed to connection failed");
} else if error.is_timeout() {
println!("Status changed to timed out");
} else if error.is_request() {
println!("Status changed to request error");
} else {
println!("Error: {}", error);
}
Result::StatusCode(status_code)
}
Err(error) => {
match previous_status_option {
Result::ConnectError(_error) if error.is_connect() => {}
Result::TimeoutError(_error) if error.is_timeout() => {}
Result::RequestError(_error) if error.is_request() => {}
_ => {
if error.is_connect() {
println!("Status changed to connection failed");
} else if error.is_timeout() {
println!("Status changed to timed out");
} else if error.is_request() {
println!("Status changed to request error");
} else {
println!("Error: {}", error);
}
}
previous_status_option = if error.is_connect() {
Result::ConnectError(error)
} else if error.is_timeout() {
Result::TimeoutError(error)
} else if error.is_request() {
Result::RequestError(error)
} else {
Result::OtherError(error)
}
}
if error.is_connect() {
Result::ConnectError(error)
} else if error.is_timeout() {
Result::TimeoutError(error)
} else if error.is_request() {
Result::RequestError(error)
} else {
Result::OtherError(error)
}
}
sleep(Duration::from_secs(5));
}
}

#[cfg(test)]
mod tests {
use reqwest::blocking::Response;
use http::{Response as HttpResponse, StatusCode};
use crate::request_loop;
use crate::Result;

#[test]
fn test_request_loop() {
// Unfortunately, reqwest doesn't really let us mock results :(
let result200 = reqwest::Result::Ok(Response::from(
HttpResponse::builder().status(StatusCode::OK).body("").unwrap()
));
let result = request_loop(result200,
Result::StatusCode(StatusCode::NOT_FOUND));
match result {
Result::StatusCode(StatusCode::OK) => { /* ok */ },
_ => { panic!("Unexpected status code!", )}
}
}
}

0 comments on commit 8ddfa7d

Please sign in to comment.