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.
- Ajoutez le crate
reqwest
avec la featureblocking
à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.
- Enrichissez le type
error::Error
de deux alternativesReqwestError
etParseIntError
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.
- 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.
- 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 formesuffixe: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.