|
|
|
@ -8,6 +8,12 @@ use ruma::{
|
|
|
|
|
use crate::api::server_server::FedDest;
|
|
|
|
|
|
|
|
|
|
use crate::{services, Config, Error, Result};
|
|
|
|
|
use futures_util::FutureExt;
|
|
|
|
|
use hyper::{
|
|
|
|
|
client::connect::dns::{GaiResolver, Name},
|
|
|
|
|
service::Service as HyperService,
|
|
|
|
|
};
|
|
|
|
|
use reqwest::dns::{Addrs, Resolve, Resolving};
|
|
|
|
|
use ruma::{
|
|
|
|
|
api::{
|
|
|
|
|
client::sync::sync_events,
|
|
|
|
@ -17,8 +23,10 @@ use ruma::{
|
|
|
|
|
};
|
|
|
|
|
use std::{
|
|
|
|
|
collections::{BTreeMap, HashMap},
|
|
|
|
|
error::Error as StdError,
|
|
|
|
|
fs,
|
|
|
|
|
future::Future,
|
|
|
|
|
future::{self, Future},
|
|
|
|
|
iter,
|
|
|
|
|
net::{IpAddr, SocketAddr},
|
|
|
|
|
path::PathBuf,
|
|
|
|
|
sync::{
|
|
|
|
@ -99,6 +107,35 @@ impl Default for RotationHandler {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub struct Resolver {
|
|
|
|
|
inner: GaiResolver,
|
|
|
|
|
overrides: Box<dyn Fn(&str) -> Option<SocketAddr> + Send + Sync>,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl Resolver {
|
|
|
|
|
pub fn new(overrides: Box<dyn Fn(&str) -> Option<SocketAddr> + Send + Sync>) -> Resolver {
|
|
|
|
|
Resolver {
|
|
|
|
|
inner: GaiResolver::new(),
|
|
|
|
|
overrides,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl Resolve for Resolver {
|
|
|
|
|
fn resolve(&self, name: Name) -> Resolving {
|
|
|
|
|
if let Some(addr) = (self.overrides)(name.as_str()) {
|
|
|
|
|
let once: Box<dyn Iterator<Item = SocketAddr> + Send> = Box::new(iter::once(addr));
|
|
|
|
|
return Box::pin(future::ready(Ok(once)));
|
|
|
|
|
}
|
|
|
|
|
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) })
|
|
|
|
|
}))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl Service {
|
|
|
|
|
pub fn load(db: &'static dyn Data, config: Config) -> Result<Self> {
|
|
|
|
|
let keypair = db.load_keypair();
|
|
|
|
@ -122,12 +159,12 @@ impl Service {
|
|
|
|
|
let default_client = reqwest_client_builder(&config)?.build()?;
|
|
|
|
|
let name_override = Arc::clone(&tls_name_override);
|
|
|
|
|
let federation_client = reqwest_client_builder(&config)?
|
|
|
|
|
.resolve_fn(move |domain| {
|
|
|
|
|
.dns_resolver(Arc::new(Resolver::new(Box::new(move |domain| {
|
|
|
|
|
let read_guard = name_override.read().unwrap();
|
|
|
|
|
let (override_name, port) = read_guard.get(&domain)?;
|
|
|
|
|
let (override_name, port) = read_guard.get(domain)?;
|
|
|
|
|
let first_name = override_name.get(0)?;
|
|
|
|
|
Some(SocketAddr::new(*first_name, *port))
|
|
|
|
|
})
|
|
|
|
|
}))))
|
|
|
|
|
.build()?;
|
|
|
|
|
|
|
|
|
|
// Supported and stable room versions
|
|
|
|
|