longbridge_httpcli/
geo.rs1use std::{cell::RefCell, time::Duration};
2
3thread_local! {
5 static REGION: RefCell<Option<String>> = const { RefCell::new(None) };
6}
7
8async fn region() -> Option<String> {
9 let user_region = std::env::var("LONGBRIDGE_REGION")
12 .ok()
13 .or_else(|| std::env::var("LONGPORT_REGION").ok());
14 if let Some(region) = user_region {
15 return Some(region);
16 }
17
18 ping().await
21}
22
23async fn ping() -> Option<String> {
24 if let Some(region) = REGION.with_borrow(Clone::clone) {
25 return Some(region.clone());
26 }
27
28 let Ok(resp) = reqwest::Client::new()
29 .get("https://api.lbkrs.com/_ping")
30 .timeout(Duration::from_secs(1))
31 .send()
32 .await
33 else {
34 return None;
35 };
36 let region = resp
37 .headers()
38 .get("X-Ip-Region")
39 .and_then(|v| v.to_str().ok())?;
40 REGION.set(Some(region.to_string()));
41 Some(region.to_string())
42}
43
44pub async fn is_cn() -> bool {
46 region()
47 .await
48 .is_some_and(|region| region.eq_ignore_ascii_case("CN"))
49}