module webfinger; import std.algorithm; import std.array; import std.format; import std.json; import std.typecons; import requests; import net.request_pool; import singletons; enum AcceptedWebfingerContentType = "application/jrd+json, application/json"; private bool checkValidWebfingerResponse(Response rs) { return AcceptedWebfingerContentType.canFind(rs.responseHeaders()["content-type"].split(";")[0]); } PRequest buildRequest(string uri, string[string] params) { PRequest rq = PRequest(); rq.method = "GET"; rq.url = format("https://%s/.well-known/webfinger", uri); rq.headers["Accept"] = AcceptedWebfingerContentType; QueryParam[] p; foreach (k, v; params) p ~= tuple!("key", "value")(k, v); rq.params = p; return rq; } PRequest buildAcctRequest(string uri, string acct) { string[string] params = ["resource": format("acct:%s@%s", acct, uri)]; return buildRequest(uri, params); } JSONValue requestAcct(string uri, string acct) { Response rs = RP.request(buildAcctRequest(uri, acct), true); if (checkValidWebfingerResponse(rs) == false) throw new Exception("Invalid webfinger response"); return parseJSON(rs.responseBody().toString()); } JSONValue requestAcct(string handle) { string uri, acct; uri = handle.split("@")[$ - 1]; acct = handle.split("@")[$ - 2]; return requestAcct(uri, acct); }