Initial WebFinger

- Add headers to PRequest
This commit is contained in:
2024-02-19 01:03:40 -03:00
parent b0847660cc
commit 58028ca68e
4 changed files with 122 additions and 37 deletions

51
source/webfinger.d Normal file
View File

@@ -0,0 +1,51 @@
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("http://%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());
}