Initial WebFinger
- Add headers to PRequest
This commit is contained in:
@@ -1,48 +1,73 @@
|
|||||||
module main;
|
module main;
|
||||||
|
|
||||||
|
import std.json;
|
||||||
|
|
||||||
|
import requests;
|
||||||
import slf4d;
|
import slf4d;
|
||||||
import slf4d.default_provider;
|
import slf4d.default_provider;
|
||||||
|
|
||||||
import config;
|
import config;
|
||||||
import singletons;
|
import singletons;
|
||||||
import db.db;
|
import db.db;
|
||||||
|
import net.request_pool;
|
||||||
|
import webfinger;
|
||||||
|
|
||||||
int main() {
|
void commonInit() {
|
||||||
auto provider = new DefaultProvider(true, Levels.DEBUG);
|
auto provider = new DefaultProvider(true, Levels.DEBUG);
|
||||||
configureLoggingProvider(provider);
|
configureLoggingProvider(provider);
|
||||||
|
|
||||||
Config cfg = new Config();
|
RP = new RequestPool();
|
||||||
|
RP.startBackground();
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
void main() {
|
||||||
cfg.load();
|
commonInit();
|
||||||
} catch (Exception e) {
|
|
||||||
error(e);
|
|
||||||
return 21;
|
|
||||||
}
|
|
||||||
|
|
||||||
DBSettings dbSettings;
|
|
||||||
auto dbCfg = cfg.v["db"];
|
|
||||||
with (dbSettings) {
|
|
||||||
host = dbCfg["host"].str;
|
|
||||||
port = cast(ushort) dbCfg["port"].integer;
|
|
||||||
username = dbCfg["username"].str;
|
|
||||||
password = dbCfg["password"].str;
|
|
||||||
dbname = dbCfg["dbName"].str;
|
|
||||||
|
|
||||||
switch (dbCfg["connector"].str) {
|
|
||||||
case "postgresql":
|
|
||||||
connector = DBConnector.DB_PGSQL;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Db = new DB(dbSettings);
|
|
||||||
Db.connect();
|
|
||||||
|
|
||||||
scope (exit)
|
scope (exit)
|
||||||
Db.close();
|
RP.stop();
|
||||||
|
|
||||||
return 0;
|
JSONValue js = requestAcct("localhost:8080", "admin");
|
||||||
|
|
||||||
|
infoF!"Response body: %s"(js.toJSON(true));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//int main() {
|
||||||
|
// auto provider = new DefaultProvider(true, Levels.DEBUG);
|
||||||
|
// configureLoggingProvider(provider);
|
||||||
|
//
|
||||||
|
// Config cfg = new Config();
|
||||||
|
//
|
||||||
|
// try {
|
||||||
|
// cfg.load();
|
||||||
|
// } catch (Exception e) {
|
||||||
|
// error(e);
|
||||||
|
// return 21;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// DBSettings dbSettings;
|
||||||
|
// auto dbCfg = cfg.v["db"];
|
||||||
|
// with (dbSettings) {
|
||||||
|
// host = dbCfg["host"].str;
|
||||||
|
// port = cast(ushort) dbCfg["port"].integer;
|
||||||
|
// username = dbCfg["username"].str;
|
||||||
|
// password = dbCfg["password"].str;
|
||||||
|
// dbname = dbCfg["dbName"].str;
|
||||||
|
//
|
||||||
|
// switch (dbCfg["connector"].str) {
|
||||||
|
// case "postgresql":
|
||||||
|
// connector = DBConnector.DB_PGSQL;
|
||||||
|
// break;
|
||||||
|
// default:
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// Db = new DB(dbSettings);
|
||||||
|
// Db.connect();
|
||||||
|
//
|
||||||
|
// scope (exit)
|
||||||
|
// Db.close();
|
||||||
|
//
|
||||||
|
// return 0;
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ struct PRequest {
|
|||||||
string url;
|
string url;
|
||||||
string method = "GET";
|
string method = "GET";
|
||||||
QueryParam[] params;
|
QueryParam[] params;
|
||||||
|
string[string] headers;
|
||||||
|
|
||||||
string body = "";
|
string body = "";
|
||||||
string contentType = "text/plain";
|
string contentType = "text/plain";
|
||||||
@@ -33,19 +34,25 @@ class RequestPool {
|
|||||||
this.m_taskPool = new TaskPool(this.m_totalWorkers);
|
this.m_taskPool = new TaskPool(this.m_totalWorkers);
|
||||||
}
|
}
|
||||||
|
|
||||||
void request(PRequest request) {
|
Response request(PRequest request, bool blocking = false) {
|
||||||
auto t = task(&this.m_run, request);
|
auto t = task(&this.m_run, request);
|
||||||
this.m_taskPool.put(t);
|
this.m_taskPool.put(t);
|
||||||
|
|
||||||
|
if (blocking)
|
||||||
|
return t.yieldForce();
|
||||||
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
void stop() {
|
void stop() {
|
||||||
this.m_taskPool.finish(true);
|
this.m_taskPool.finish(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void m_run(PRequest request) {
|
Response m_run(PRequest request) {
|
||||||
Request rq = Request();
|
Request rq = Request();
|
||||||
|
rq.addHeaders(request.headers);
|
||||||
|
|
||||||
_l.debugF!"Requesting [%s] %s"(request.method, request.url);
|
_l.debugF!"[%s] %s"(request.method, request.url);
|
||||||
|
|
||||||
Response rs;
|
Response rs;
|
||||||
|
|
||||||
@@ -60,10 +67,10 @@ class RequestPool {
|
|||||||
|
|
||||||
default:
|
default:
|
||||||
errorF!"Unknown request method: %s"(request.method);
|
errorF!"Unknown request method: %s"(request.method);
|
||||||
return;
|
return null;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_l.debugF!"Request %s result code: %d"(request.url, rs.code);
|
_l.debugF!"[%s] %s result code: %d"(request.method, request.url, rs.code);
|
||||||
|
return rs;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
module singletons;
|
module singletons;
|
||||||
|
|
||||||
import db.db;
|
import db.db;
|
||||||
|
import net.request_pool;
|
||||||
|
|
||||||
DB Db;
|
DB Db;
|
||||||
|
RequestPool RP;
|
||||||
|
|||||||
51
source/webfinger.d
Normal file
51
source/webfinger.d
Normal 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());
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user