Files
ActivityPubD/source/webfinger.d

61 lines
1.3 KiB
D

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);
}