torrust_tracker/servers/http/v1/handlers/common/
peer_ip.rs

1//! Logic to convert peer IP resolution errors into responses.
2//!
3//! The HTTP tracker may fail to resolve the peer IP address. This module
4//! contains the logic to convert those
5//! [`PeerIpResolutionError`]
6//! errors into responses.
7use crate::servers::http::v1::responses;
8use crate::servers::http::v1::services::peer_ip_resolver::PeerIpResolutionError;
9
10impl From<PeerIpResolutionError> for responses::error::Error {
11    fn from(err: PeerIpResolutionError) -> Self {
12        responses::error::Error {
13            failure_reason: format!("Error resolving peer IP: {err}"),
14        }
15    }
16}
17
18#[cfg(test)]
19mod tests {
20    use std::panic::Location;
21
22    use crate::servers::http::v1::responses;
23    use crate::servers::http::v1::services::peer_ip_resolver::PeerIpResolutionError;
24
25    fn assert_error_response(error: &responses::error::Error, error_message: &str) {
26        assert!(
27            error.failure_reason.contains(error_message),
28            "Error response does not contain message: '{error_message}'. Error: {error:?}"
29        );
30    }
31
32    #[test]
33    fn it_should_map_a_peer_ip_resolution_error_into_an_error_response() {
34        let response = responses::error::Error::from(PeerIpResolutionError::MissingRightMostXForwardedForIp {
35            location: Location::caller(),
36        });
37
38        assert_error_response(&response, "Error resolving peer IP");
39    }
40}