Skip to content

Commit

Permalink
Merge pull request #55 from ipinfo/talhahwahla/ipv6-support
Browse files Browse the repository at this point in the history
Add `lookup_self_v6`
  • Loading branch information
UmanShahzad committed Jan 22, 2024
2 parents e085dd3 + 5752b5e commit 0a2eeac
Showing 1 changed file with 49 additions and 7 deletions.
56 changes: 49 additions & 7 deletions src/ipinfo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@ use tokio::time::timeout;

const COUNTRY_FLAG_URL: &str =
"https://cdn.ipinfo.io/static/images/countries-flags/";

const BASE_URL: &str = "https://ipinfo.io";
const BASE_URL_V6: &str = "https://v6.ipinfo.io";

/// IpInfo structure configuration.
pub struct IpInfoConfig {
/// IPinfo access token.
Expand Down Expand Up @@ -75,7 +79,6 @@ impl Default for IpInfoConfig {

/// IPinfo requests context structure.
pub struct IpInfo {
url: String,
token: Option<String>,
client: reqwest::Client,
cache: LruCache<String, IpDetails>,
Expand Down Expand Up @@ -116,10 +119,7 @@ impl IpInfo {
let client =
reqwest::Client::builder().timeout(config.timeout).build()?;

let url = "https://ipinfo.io".to_owned();

let mut ipinfo_obj = Self {
url,
client,
token: config.token,
cache: LruCache::new(
Expand Down Expand Up @@ -260,7 +260,7 @@ impl IpInfo {
) -> Result<HashMap<String, IpDetails>, IpError> {
// Lookup cache misses which are not bogon
let response = client
.post(&format!("{}/batch", self.url))
.post(&format!("{}/batch", BASE_URL))
.headers(Self::construct_headers())
.bearer_auth(self.token.as_deref().unwrap_or_default())
.json(&json!(ips))
Expand Down Expand Up @@ -303,6 +303,48 @@ impl IpInfo {
/// }
/// ```
pub async fn lookup(&mut self, ip: &str) -> Result<IpDetails, IpError> {
self._lookup(ip, BASE_URL).await
}

/// looks up IPDetails of your own v4 IP
///
/// # Example
///
/// ```no_run
/// use ipinfo::IpInfo;
///
/// #[tokio::main]
/// async fn main() {
/// let mut ipinfo = IpInfo::new(Default::default()).expect("should construct");
/// let res = ipinfo.lookup_self_v4().await.expect("should run");
/// }
/// ```
pub async fn lookup_self_v4(&mut self) -> Result<IpDetails, IpError> {
self._lookup("", BASE_URL).await
}

/// looks up IPDetails of your own v6 IP
///
/// # Example
///
/// ```no_run
/// use ipinfo::IpInfo;
///
/// #[tokio::main]
/// async fn main() {
/// let mut ipinfo = IpInfo::new(Default::default()).expect("should construct");
/// let res = ipinfo.lookup_self_v6().await.expect("should run");
/// }
/// ```
pub async fn lookup_self_v6(&mut self) -> Result<IpDetails, IpError> {
self._lookup("", BASE_URL_V6).await
}

async fn _lookup(
&mut self,
ip: &str,
base_url: &str,
) -> Result<IpDetails, IpError> {
if is_bogon(ip) {
return Ok(IpDetails {
ip: ip.to_string(),
Expand All @@ -321,7 +363,7 @@ impl IpInfo {
// lookup in case of a cache miss
let response = self
.client
.get(&format!("{}/{}", self.url, ip))
.get(&format!("{}/{}", base_url, ip))
.headers(Self::construct_headers())
.bearer_auth(self.token.as_deref().unwrap_or_default())
.send()
Expand Down Expand Up @@ -370,7 +412,7 @@ impl IpInfo {
return Err(err!(MapLimitError));
}

let map_url = &format!("{}/tools/map?cli=1", self.url);
let map_url = &format!("{}/tools/map?cli=1", BASE_URL);
let client = self.client.clone();
let json_ips = serde_json::json!(ips);

Expand Down

0 comments on commit 0a2eeac

Please sign in to comment.