|
|
|
@ -109,11 +109,11 @@ impl Default for RotationHandler { |
|
|
|
|
|
|
|
|
|
|
|
pub struct Resolver { |
|
|
|
pub struct Resolver { |
|
|
|
inner: GaiResolver, |
|
|
|
inner: GaiResolver, |
|
|
|
overrides: Box<dyn Fn(&str) -> Option<SocketAddr> + Send + Sync>, |
|
|
|
overrides: Arc<RwLock<TlsNameMap>>, |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
impl Resolver { |
|
|
|
impl Resolver { |
|
|
|
pub fn new(overrides: Box<dyn Fn(&str) -> Option<SocketAddr> + Send + Sync>) -> Resolver { |
|
|
|
pub fn new(overrides: Arc<RwLock<TlsNameMap>>) -> Self { |
|
|
|
Resolver { |
|
|
|
Resolver { |
|
|
|
inner: GaiResolver::new(), |
|
|
|
inner: GaiResolver::new(), |
|
|
|
overrides, |
|
|
|
overrides, |
|
|
|
@ -123,16 +123,26 @@ impl Resolver { |
|
|
|
|
|
|
|
|
|
|
|
impl Resolve for Resolver { |
|
|
|
impl Resolve for Resolver { |
|
|
|
fn resolve(&self, name: Name) -> Resolving { |
|
|
|
fn resolve(&self, name: Name) -> Resolving { |
|
|
|
if let Some(addr) = (self.overrides)(name.as_str()) { |
|
|
|
self.overrides |
|
|
|
let once: Box<dyn Iterator<Item = SocketAddr> + Send> = Box::new(iter::once(addr)); |
|
|
|
.read() |
|
|
|
return Box::pin(future::ready(Ok(once))); |
|
|
|
.expect("lock should not be poisoned") |
|
|
|
} |
|
|
|
.get(name.as_str()) |
|
|
|
let this = &mut self.inner.clone(); |
|
|
|
.and_then(|(override_name, port)| { |
|
|
|
Box::pin(HyperService::<Name>::call(this, name).map(|result| { |
|
|
|
override_name.get(0).map(|first_name| { |
|
|
|
result |
|
|
|
let x: Box<dyn Iterator<Item = SocketAddr> + Send> = |
|
|
|
.map(|addrs| -> Addrs { Box::new(addrs) }) |
|
|
|
Box::new(iter::once(SocketAddr::new(*first_name, *port))); |
|
|
|
.map_err(|err| -> Box<dyn StdError + Send + Sync> { Box::new(err) }) |
|
|
|
let x: Resolving = Box::pin(future::ready(Ok(x))); |
|
|
|
})) |
|
|
|
x |
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
.unwrap_or_else(|| { |
|
|
|
|
|
|
|
let this = &mut self.inner.clone(); |
|
|
|
|
|
|
|
Box::pin(HyperService::<Name>::call(this, name).map(|result| { |
|
|
|
|
|
|
|
result |
|
|
|
|
|
|
|
.map(|addrs| -> Addrs { Box::new(addrs) }) |
|
|
|
|
|
|
|
.map_err(|err| -> Box<dyn StdError + Send + Sync> { Box::new(err) }) |
|
|
|
|
|
|
|
})) |
|
|
|
|
|
|
|
}) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -157,14 +167,8 @@ impl Service { |
|
|
|
.map(|secret| jsonwebtoken::DecodingKey::from_secret(secret.as_bytes())); |
|
|
|
.map(|secret| jsonwebtoken::DecodingKey::from_secret(secret.as_bytes())); |
|
|
|
|
|
|
|
|
|
|
|
let default_client = reqwest_client_builder(&config)?.build()?; |
|
|
|
let default_client = reqwest_client_builder(&config)?.build()?; |
|
|
|
let name_override = Arc::clone(&tls_name_override); |
|
|
|
|
|
|
|
let federation_client = reqwest_client_builder(&config)? |
|
|
|
let federation_client = reqwest_client_builder(&config)? |
|
|
|
.dns_resolver(Arc::new(Resolver::new(Box::new(move |domain| { |
|
|
|
.dns_resolver(Arc::new(Resolver::new(tls_name_override.clone()))) |
|
|
|
let read_guard = name_override.read().unwrap(); |
|
|
|
|
|
|
|
let (override_name, port) = read_guard.get(domain)?; |
|
|
|
|
|
|
|
let first_name = override_name.get(0)?; |
|
|
|
|
|
|
|
Some(SocketAddr::new(*first_name, *port)) |
|
|
|
|
|
|
|
})))) |
|
|
|
|
|
|
|
.build()?; |
|
|
|
.build()?; |
|
|
|
|
|
|
|
|
|
|
|
// Supported and stable room versions
|
|
|
|
// Supported and stable room versions
|
|
|
|
|