ircd:Ⓜ️:fed: Add indirection interface.
This commit is contained in:
parent
4960912848
commit
267e978247
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -1448,6 +1448,93 @@ ircd::m::fed::request::request(const mutable_buffer &buf_,
|
|||
// fed/fed.h
|
||||
//
|
||||
|
||||
namespace ircd::m::fed
|
||||
{
|
||||
template<class closure>
|
||||
static decltype(auto)
|
||||
with_server(const string_view &,
|
||||
closure &&);
|
||||
}
|
||||
|
||||
template<class closure>
|
||||
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
|
||||
//
|
||||
|
|
Loading…
Reference in New Issue