diff --git a/include/ircd/m/fed/fed.h b/include/ircd/m/fed/fed.h index 565c30845..bba934a27 100644 --- a/include/ircd/m/fed/fed.h +++ b/include/ircd/m/fed/fed.h @@ -14,13 +14,21 @@ /// Federation Interface namespace ircd::m::fed { - net::hostport matrix_service(net::hostport); - id::event::buf fetch_head(const id::room &room_id, const string_view &remote, const id::user &); id::event::buf fetch_head(const id::room &room_id, const string_view &remote); string_view fetch_well_known(const mutable_buffer &out, const string_view &origin); string_view well_known(const mutable_buffer &out, const string_view &origin); + + net::hostport matrix_service(net::hostport remote) noexcept; + net::hostport server(const mutable_buffer &out, const string_view &origin); + + bool errant(const string_view &origin); + bool linked(const string_view &origin); + bool exists(const string_view &origin); + bool avail(const string_view &origin); + + bool clear_error(const string_view &origin); } #include "request.h" @@ -46,7 +54,10 @@ namespace ircd::m::fed inline ircd::net::hostport ircd::m::fed::matrix_service(net::hostport remote) +noexcept { - net::service(remote) = net::service(remote)?: m::canon_service; + if(likely(!net::port(remote))) + net::service(remote) = net::service(remote)?: m::canon_service; + return remote; } diff --git a/matrix/fed.cc b/matrix/fed.cc index 27d059bcc..16bb9937c 100644 --- a/matrix/fed.cc +++ b/matrix/fed.cc @@ -1448,6 +1448,93 @@ ircd::m::fed::request::request(const mutable_buffer &buf_, // fed/fed.h // +namespace ircd::m::fed +{ + template + static decltype(auto) + with_server(const string_view &, + closure &&); +} + +template +decltype(auto) +ircd::m::fed::with_server(const string_view &origin, + closure&& c) +{ + char buf[rfc3986::DOMAIN_BUFSIZE]; + const auto remote + { + server(buf, origin) + }; + + return c(remote); +} + +bool +ircd::m::fed::clear_error(const string_view &origin) +{ + return with_server(origin, [] + (const auto &remote) + { + return server::errclear(remote); + }); +} + +bool +ircd::m::fed::avail(const string_view &origin) +{ + return with_server(origin, [] + (const auto &remote) + { + return server::avail(remote); + }); +} + +bool +ircd::m::fed::exists(const string_view &origin) +{ + return with_server(origin, [] + (const auto &remote) + { + return server::exists(remote); + }); +} + +bool +ircd::m::fed::linked(const string_view &origin) +{ + return with_server(origin, [] + (const auto &remote) + { + return server::linked(remote); + }); +} + +bool +ircd::m::fed::errant(const string_view &origin) +{ + return with_server(origin, [] + (const auto &remote) + { + return server::errant(remote); + }); +} + +ircd::net::hostport +ircd::m::fed::server(const mutable_buffer &buf, + const string_view &origin) +{ + net::hostport remote + { + origin + }; + + if(likely(!port(remote))) + remote = well_known(buf, host(remote)); + + return matrix_service(remote); +} + // // fetch_head util //