Skip to content

Instantly share code, notes, and snippets.

@jalcine
Created December 4, 2018 20:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jalcine/9ae3ce6a81c1122b2fd6e32962d3b534 to your computer and use it in GitHub Desktop.
Save jalcine/9ae3ce6a81c1122b2fd6e32962d3b534 to your computer and use it in GitHub Desktop.
QString extractUserName(const QString& path) {
const auto parts = path.split("/", QString::SkipEmptyParts);
if (path.startsWith("/@")) {
return parts.first();
}
if (path.startsWith("/users")) {
return parts.last();
}
return QString();
}
QUrl generateWebFingerUrlFromUrl(const QUrl& url) {
const auto domain = QString("%1://%2").arg(url.scheme()).arg(url.host());
const auto userName = extractUserName(url.path());
if (!userName.isEmpty()) {
return QUrl(QString("%1/.well-known/webfinger?resource=acct:%2@%3").arg(domain).arg(userName).arg(url.host()));
}
return QUrl();
}
WebFinger extractWebFingerFromData(const QByteArray& data) {
const QJsonDocument respJson(QJsonDocument::fromBinaryData(data));
WebFinger webFinger;
webFinger.subject = respJson.object().find("subject").value().toString();
webFinger.aliases = respJson.object().find("aliases").value().toVariant().toStringList();
return webFinger;
}
// TODO: Fetch JSON from server.
// TODO: Extract into body.
void WebFinger::discoverByUrl(const QUrl& url, function<void(WebFinger)> func) {
const QUrl webFingerUrl = generateWebFingerUrlFromUrl(url);
if (!url.isEmpty()) {
QSharedPointer<QNetworkAccessManager> manager(new QNetworkAccessManager());
QObject::connect(manager.get(), &QNetworkAccessManager::finished, QApplication::instance(), [=](QNetworkReply* reply){
const WebFinger webFinger = extractWebFingerFromData(reply->readAll());
func(webFinger);
});
QNetworkRequest request(webFingerUrl);
request.setRawHeader("Accept", "application/ld+json");
request.setHeader(QNetworkRequest::UserAgentHeader, "ActivityDesk/0.0.1 (https://activitydesk.black.af)");
manager->get(request);
} else {
WebFinger webFinger;
func(webFinger);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment