Récupération des suffixes

Nous allons maintenant récupérer les suffixes correspondant à chaque préfixe depuis l'API v3 du site Have I been pwned?. Nous allons utiliser le crate reqwest pour faire des requêtes simples en mode bloquant.

  1. Ajoutez le crate reqwest avec la feature blocking à Cargo.toml.

Gestion des erreurs

Nous allons devoir gérer deux types d'erreurs supplémentaires :

  • des erreurs de type reqwest::Error en cas de problème de communication ;
  • des erreurs de type std::num::ParseIntError en cas de problème de parsing du résultat de l'API, car les lignes contiennent un suffixe suivi de deux points suivi d'un nombre qui représente le nombre d'occurrences, si celui-ci est incorrect cette erreur sera signalée.
  1. Enrichissez le type error::Error de deux alternatives ReqwestError et ParseIntError qui encapsulent les deux erreurs détaillez ci-dessus.

Accès réseau

Nous allons utiliser la méthode reqwest::blocking::get() du crate reqwest qui permet d'effectuer une requête GET vers l'API. Celle-ci peut signaler une erreur lors du get() lui-même ainsi que lors de l'utilisation de la méthode text() pour récupérer le contenu de la réponse.

  1. Ajoutez la fonction hibp::get_page() qui fait une requête à https://api.pwnedpasswords.com/range/PREFIX (où PREFIX est à remplacer par les 5 premiers caractères du SHA-1 en majuscules) et renvoie les lignes de la réponse :
fn get_page(prefix: &str) -> Result<Vec<String>, Error> {
  todo!()
}

On s'intéressera notamment à la méthode lines() sur les chaînes de caractère qui fournit un itérateur bien pratique.

  1. Ajoutez la fonction hibp::get_suffixes() qui, en utilisant la méthode précédente, renvoie à partir d'un préfixe une table de hashage précisant pour chaque suffixe trouvé dans la page le nombre d'occurrences trouvées dans des fuites de données. On rappelle que chaque ligne de la page renvoyée par l'API est de la forme suffixe:N où N est un entier représentant le nombre d'occurrences.
fn get_suffixes(prefix: &str) -> Result<HashMap<String, u64>, Error> {
  todo!()
}

La méthode parse::<T>() permet de transformer une chaîne de caractère en un autre type, notamment un type entier T. Dans ce cas, parse() renvoie un Result<T, ParseIntError>. On peut également utiliser u64::from_str_radix() qui renvoie le même type.