From b9bf28c264f03c06d6483dab94ba2e60fbbca7b4 Mon Sep 17 00:00:00 2001 From: tastytea Date: Sat, 11 Jan 2020 19:21:34 +0100 Subject: [PATCH] Add Instance::get_nodeinfo(). --- include/instance.hpp | 16 ++++++++++++++++ src/instance.cpp | 31 +++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/include/instance.hpp b/include/instance.hpp index 543ec88..7b90c84 100644 --- a/include/instance.hpp +++ b/include/instance.hpp @@ -18,6 +18,7 @@ #define MASTODONPP_INSTANCE_HPP #include "curl_wrapper.hpp" +#include "answer.hpp" #include #include @@ -106,6 +107,9 @@ public: * Queries `/api/v1/instance` for `max_toot_chars'. If the instance doesn't * support it, the limit is assumed to be 500. * + * After the first call, the value is saved internally. Subsequent calls + * return the saved value. + * * @since 0.1.0 */ [[nodiscard]] @@ -135,6 +139,18 @@ public: return _proxy; } + /*! + * @brief Returns the NodeInfo of the instance. + * + * Attempts to download the [NodeInfo] + * (https://nodeinfo.diaspora.software/protocol.html) of the instance and + * returns it. Not every instance has it. + * + * @since 0.3.0 + */ + [[nodiscard]] + answer_type get_nodeinfo(); + private: const string _hostname; const string _baseuri; diff --git a/src/instance.cpp b/src/instance.cpp index b7f88cd..1c7491c 100644 --- a/src/instance.cpp +++ b/src/instance.cpp @@ -18,13 +18,17 @@ #include "instance.hpp" #include "log.hpp" +#include #include +#include namespace mastodonpp { +using std::sort; using std::stoull; using std::exception; +using std::vector; Instance::Instance(const string_view hostname, const string_view access_token) : _hostname{hostname} @@ -77,4 +81,31 @@ uint64_t Instance::get_max_chars() return _max_chars; } +answer_type Instance::get_nodeinfo() +{ + debuglog << "Finding location of NodeInfo on " << _hostname << "…\n"; + auto answer{make_request(http_method::GET, + _baseuri + "/.well-known/nodeinfo", {})}; + if (!answer) + { + debuglog << "NodeInfo not found.\n"; + return answer; + } + + size_t pos{0}; + vector hrefs; + constexpr string_view searchstring{R"("href":")"}; + while ((pos = answer.body.find(searchstring, pos)) != string::npos) + { + pos += searchstring.size(); + auto endpos{answer.body.find('"', pos)}; + hrefs.push_back(answer.body.substr(pos, endpos - pos)); + debuglog << "Found href: " << hrefs.back() << '\n'; + } + sort(hrefs.begin(), hrefs.end()); // We assume they are sortable strings. + debuglog << "Selecting href: " << hrefs.back() << '\n'; + + return make_request(http_method::GET, hrefs.back(), {}); +} + } // namespace mastodonpp