m/cup
1
0
mirror of https://github.com/sergi0g/cup.git synced 2025-11-15 00:23:48 -05:00

Add better error handling

(mostly because I have bad internet)
This commit is contained in:
Sergio
2024-08-31 21:24:56 +03:00
parent 21c110011f
commit def2efa0d1

View File

@@ -2,7 +2,7 @@ use std::sync::Mutex;
use json::JsonValue; use json::JsonValue;
use rayon::iter::{IntoParallelRefIterator, ParallelIterator}; use rayon::iter::{IntoParallelRefIterator, ParallelIterator};
use ureq::Error; use ureq::{Error, ErrorKind};
use http_auth::parse_challenges; use http_auth::parse_challenges;
@@ -56,8 +56,20 @@ pub fn get_latest_digest(image: &Image, token: Option<&String>, config: &JsonVal
digest: None, digest: None,
..image.clone() ..image.clone()
} }
} },
Err(ureq::Error::Transport(e)) => error!("Failed to send request!\n{}", e), Err(Error::Transport(error)) => {
match error.kind() {
ErrorKind::Dns => {
warn!("Failed to lookup the IP of the registry, retrying.");
return get_latest_digest(image, token, config)
}, // If something goes really wrong, this can get stuck in a loop
ErrorKind::ConnectionFailed => {
warn!("Connection probably timed out, retrying.");
return get_latest_digest(image, token, config)
}, // Same here
_ => error!("Failed to retrieve image digest\n{}!", error)
}
},
}; };
match raw_response.header("docker-content-digest") { match raw_response.header("docker-content-digest") {
Some(digest) => Image { Some(digest) => Image {
@@ -83,7 +95,7 @@ pub fn get_latest_digests(images: Vec<&Image>, token: Option<&String>, config: &
pub fn get_token(images: Vec<&Image>, auth_url: &str, credentials: &Option<String>) -> String { pub fn get_token(images: Vec<&Image>, auth_url: &str, credentials: &Option<String>) -> String {
let mut final_url = auth_url.to_owned(); let mut final_url = auth_url.to_owned();
for image in images { for image in &images {
final_url = format!("{}&scope=repository:{}:pull", final_url, image.repository); final_url = format!("{}&scope=repository:{}:pull", final_url, image.repository);
} }
let mut base_request = ureq::get(&final_url).set("Accept", "application/vnd.oci.image.index.v1+json"); // Seems to be unnecesarry. Will probably remove in the future let mut base_request = ureq::get(&final_url).set("Accept", "application/vnd.oci.image.index.v1+json"); // Seems to be unnecesarry. Will probably remove in the future
@@ -99,6 +111,19 @@ pub fn get_token(images: Vec<&Image>, auth_url: &str, credentials: &Option<Strin
error!("Failed to parse response into string!\n{}", e) error!("Failed to parse response into string!\n{}", e)
} }
}, },
Err(Error::Transport(error)) => {
match error.kind() {
ErrorKind::Dns => {
warn!("Failed to lookup the IP of the registry, retrying.");
return get_token(images, auth_url, credentials)
}, // If something goes really wrong, this can get stuck in a loop
ErrorKind::ConnectionFailed => {
warn!("Connection probably timed out, retrying.");
return get_token(images, auth_url, credentials)
}, // Same here
_ => error!("Token request failed\n{}!", error)
}
},
Err(e) => { Err(e) => {
error!("Token request failed!\n{}", e) error!("Token request failed!\n{}", e)
} }