feat: add domain check

This commit is contained in:
2021-05-05 16:01:54 +08:00
parent 2f8f5d4c9d
commit e3d9979e48
4 changed files with 675 additions and 4 deletions

35
src/network.rs Normal file
View File

@@ -0,0 +1,35 @@
use serde::{Deserialize, Serialize};
use trust_dns_resolver::Resolver;
use trust_dns_resolver::config::{ResolverConfig, ResolverOpts};
use rust_util::XResult;
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PublicIpResponse {
pub status: i32,
pub message: String,
pub ip: String,
pub user_agent: Option<String>,
}
pub fn get_local_public_ip() -> XResult<String> {
let response = opt_result!(reqwest::blocking::get("https://hatter.ink/ip/ip.jsonp"), "Get local public ip failed: {}");
let response_text = opt_result!(response.text(), "Get local public ip failed: {}");
let response_json: PublicIpResponse = opt_result!(deser_hjson::from_str(&response_text), "Parse get public ip response failed: {}");
Ok(response_json.ip)
}
pub fn get_resolver() -> XResult<Resolver> {
Ok(Resolver::new(ResolverConfig::default(), ResolverOpts::default())?)
}
pub fn resolve_first_ipv4(resolver: &Resolver, domain: &str) -> XResult<Option<String>> {
let ip = opt_result!(resolver.ipv4_lookup(domain), "Resolve domain: {}, failed: {}", domain);
Ok(ip.iter().next().map(|i| i.to_string()))
}
#[test]
fn test() {
println!("{:?}", resolve_first_ipv4(&get_resolver().unwrap(),"hatter.ink"));
println!("{:?}", get_local_public_ip());
}