[MOD] Cache disco

This commit is contained in:
LDA 2024-08-30 18:13:24 +02:00
commit 9d9453f96a
7 changed files with 44 additions and 25 deletions

View file

@ -69,11 +69,17 @@ ParseeInitData(XMPPComponent *comp)
void
ParseeFreeData(ParseeData *data)
{
char *entity;
XMLElement *disco;
if (!data)
{
return;
}
while (HashMapIterate(data->oid_servers, &entity, (void **) &disco))
{
XMLFreeElement(disco);
}
HashMapFree(data->oid_servers);
pthread_mutex_destroy(&data->oidl);
Free(data->id);

View file

@ -206,7 +206,7 @@ RouteHead(RouteRoot, arr, argp)
P("Some clicky links relating to %s:", NAME);
P("<ul>");
{
const char *fedi = "https://ak.ari.lt/parsee";
const char *fedi = "https://tengu.kappach.at/parsee";
const char *icon = "https://kappach.at/parsee.gif";
P("<li><a href='%s'>Repository</a></li>", REPOSITORY);
P("<li><a href='%s'>Fediverse</a></li>", fedi);

View file

@ -235,21 +235,31 @@ XMPPHasError(XMLElement *stanza, char *type)
}
XMLElement *
XMPPSendDisco(XMPPComponent *jabber, char *from, char *to)
XMPPSendDisco(ParseeData *data, char *from, char *to)
{
XMPPComponent *jabber = data ? data->jabber : NULL;
XMLElement *ret, *iq;
char *identifier;
if (!jabber || !from || !to)
if (!data || !jabber || !from || !to)
{
return NULL;
}
pthread_mutex_lock(&data->oidl);
if ((ret = HashMapGet(data->oid_servers, to)))
{
ret = XMLCopy(ret);
pthread_mutex_unlock(&data->oidl);
return ret;
}
pthread_mutex_unlock(&data->oidl);
iq = XMLCreateTag("iq");
XMLAddAttr(iq, "type", "get");
XMLAddAttr(iq, "from", from);
XMLAddAttr(iq, "to", to);
XMLAddAttr(iq, "id", (identifier = StrRandom(69)));
XMLAddAttr(iq, "id", (identifier = StrRandom(64)));
{
XMLElement *query = XMLCreateTag("query");
XMLAddAttr(query, "xmlns", "http://jabber.org/protocol/disco#info");
@ -264,6 +274,15 @@ XMPPSendDisco(XMPPComponent *jabber, char *from, char *to)
ret = ParseeAwaitStanza(identifier, 1.25 SECONDS);
Free(identifier);
if (ret)
{
/* TODO: On my own instance, disco replies are _really_ expensive.
* About 120KB. This is sad. Really sad. */
pthread_mutex_lock(&data->oidl);
XMLFreeElement(HashMapSet(data->oid_servers, to, ret));
ret = XMLCopy(ret);
pthread_mutex_unlock(&data->oidl);
}
return ret;
}
bool

View file

@ -92,7 +92,7 @@ FormDelAdminCallback(XMPPCommandManager *m, XMPPCommand *cmd, char *from)
DbRef *admins;
Array *admin_list;
size_t i;
XMPPOption *admin_opt;
XMPPOption *admin_opt = NULL;
char *trimmed = ParseeTrimJID(from);
if (!ParseeIsAdmin(data, trimmed))
@ -104,14 +104,17 @@ FormDelAdminCallback(XMPPCommandManager *m, XMPPCommand *cmd, char *from)
}
Free(trimmed);
admin_opt = XMPPCreateList(true, false, "glob", "[NVM!]");
admins = DbLock(data->db, 1, "admins");
admin_list = GrabArray(DbJson(admins), 1, "admins");
for (i = 0; i < ArraySize(admin_list); i++)
{
char *glob = JsonValueAsString(ArrayGet(admin_list, i));
if (!admin_opt)
{
admin_opt = XMPPCreateList(true, false, "glob", glob);
continue;
}
XMPPAddListOption(admin_opt, glob);
}

View file

@ -145,26 +145,10 @@ ServerHasXEP421(ParseeData *data, char *from)
*(strchr(server, '/')) = '\0';
}
pthread_mutex_lock(&data->oidl);
ret = HashMapGet(data->oid_servers, server);
pthread_mutex_unlock(&data->oidl);
if (ret)
{
Log(LOG_DEBUG, "XEP-0421 is cached for '%s'", server);
Free(server);
return ret;
}
parsee = ParseeJID(data);
disco = XMPPSendDisco(data->jabber, parsee, server);
disco = XMPPSendDisco(data, parsee, server);
ret = XMPPDiscoAdvertises(disco, "urn:xmpp:occupant-id:0");
if (ret)
{
pthread_mutex_lock(&data->oidl);
HashMapSet(data->oid_servers, server, server);
pthread_mutex_unlock(&data->oidl);
}
XMLFreeElement(disco);
Free(parsee);

View file

@ -5,6 +5,7 @@
* <p>TODO: Consider separating some declarations here...</p>
* --------
* Writren-By: LDA */
typedef struct ParseeData ParseeData;
#include <Cytoplasm/HttpServer.h>
#include <Cytoplasm/HttpRouter.h>

View file

@ -102,7 +102,13 @@ extern void XMPPAnnotatePresence(XMLElement *presence);
extern bool XMPPHasError(XMLElement *stanza, char *type);
extern XMLElement * XMPPSendDisco(XMPPComponent *jabber, char *from, char *to);
#include <Parsee.h>
/** Sends a XMPP discovery request to an entity, and caches it if possible.
* ------------------------------------------------------------------------
* Returns: a valid XML element[HEAP]
* Modifies: the {data}'s cache
* Thrasher: XMLFreeElement */
extern XMLElement * XMPPSendDisco(ParseeData *data, char *from, char *to);
extern bool XMPPDiscoAdvertises(XMLElement *disco, char *var);