grapevine/src/api/well_known.rs
2025-02-21 20:45:58 +00:00

50 lines
1.5 KiB
Rust

#![warn(missing_docs, clippy::missing_docs_in_private_items)]
//! Handle requests for `/.well-known/matrix/...` files
use http::StatusCode;
use ruma::api::{
client::discovery::discover_homeserver as client,
federation::discovery::discover_homeserver as server,
};
use crate::{Ar, Ra, services};
/// Handler for `/.well-known/matrix/server`
pub(crate) async fn server(
_: Ar<server::Request>,
) -> Result<Ra<server::Response>, StatusCode> {
let Some(authority) =
services().globals.config.server_discovery.server.authority.clone()
else {
return Err(StatusCode::NOT_FOUND);
};
if authority == services().globals.config.server_name {
// Delegation isn't needed in this case
return Err(StatusCode::NOT_FOUND);
}
Ok(Ra(server::Response::new(authority)))
}
/// Handler for `/.well-known/matrix/client`
pub(crate) async fn client(_: Ar<client::Request>) -> Ra<client::Response> {
// I wish ruma used an actual URL type instead of `String`
let base_url =
services().globals.config.server_discovery.client.base_url.to_string();
Ra(client::Response {
homeserver: client::HomeserverInfo::new(base_url.clone()),
identity_server: None,
sliding_sync_proxy: services()
.globals
.config
.server_discovery
.client
.advertise_sliding_sync
.then_some(client::SlidingSyncProxyInfo {
url: base_url,
}),
})
}