Merge branch 'develop' into main
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
This commit is contained in:
commit
746d57fbc6
115
.drone.yml
115
.drone.yml
|
@ -1,6 +1,6 @@
|
||||||
# -*- fill-column: 1000 -*-
|
# -*- fill-column: 1000 -*-
|
||||||
kind: pipeline
|
kind: pipeline
|
||||||
name: build x86_64
|
name: Build x86_64
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
- name: debian-package-cache
|
- name: debian-package-cache
|
||||||
|
@ -83,3 +83,116 @@ steps:
|
||||||
from_secret: email_password
|
from_secret: email_password
|
||||||
when:
|
when:
|
||||||
status: [ changed, failure ]
|
status: [ changed, failure ]
|
||||||
|
|
||||||
|
---
|
||||||
|
kind: pipeline
|
||||||
|
name: Packages x86_64
|
||||||
|
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- name: debian-package-cache
|
||||||
|
host:
|
||||||
|
path: /var/cache/debian-package-cache
|
||||||
|
- name: centos-package-cache
|
||||||
|
host:
|
||||||
|
path: /var/cache/centos-package-cache
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
event:
|
||||||
|
- tag
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Debian buster
|
||||||
|
image: debian:buster-slim
|
||||||
|
pull: always
|
||||||
|
environment:
|
||||||
|
CXX: g++-8
|
||||||
|
CXXFLAGS: -pipe -O2
|
||||||
|
DEBIAN_FRONTEND: noninteractive
|
||||||
|
LANG: C.utf8
|
||||||
|
commands:
|
||||||
|
- rm /etc/apt/apt.conf.d/docker-clean
|
||||||
|
- alias apt-get='rm -f /var/cache/apt/archives/lock && apt-get'
|
||||||
|
- apt-get update -q
|
||||||
|
- apt-get install -qq build-essential cmake lsb-release
|
||||||
|
- apt-get install -qq libcurl4-openssl-dev
|
||||||
|
- rm -rf build && mkdir -p build && cd build
|
||||||
|
- cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=/usr -DWITH_DEB=YES ..
|
||||||
|
- make
|
||||||
|
- make install DESTDIR=install
|
||||||
|
- make package
|
||||||
|
- cp -v libmastodon-cpp_${DRONE_TAG}-0_amd64_buster.deb ..
|
||||||
|
volumes:
|
||||||
|
- name: debian-package-cache
|
||||||
|
path: /var/cache/apt/archives
|
||||||
|
|
||||||
|
- name: Ubuntu bionic
|
||||||
|
image: ubuntu:bionic
|
||||||
|
pull: always
|
||||||
|
environment:
|
||||||
|
CXX: g++-7
|
||||||
|
CXXFLAGS: -pipe -O2
|
||||||
|
DEBIAN_FRONTEND: noninteractive
|
||||||
|
LANG: C.utf8
|
||||||
|
commands:
|
||||||
|
- rm /etc/apt/apt.conf.d/docker-clean
|
||||||
|
- alias apt-get='rm -f /var/cache/apt/archives/lock && apt-get'
|
||||||
|
- apt-get update -q
|
||||||
|
- apt-get install -qq build-essential cmake lsb-release
|
||||||
|
- apt-get install -qq libcurl4-openssl-dev
|
||||||
|
- rm -rf build && mkdir -p build && cd build
|
||||||
|
- cmake -G "Unix Makefiles" -SCMAKE_INSTALL_PREFIX=/usr -DWITH_DEB=YES ..
|
||||||
|
- make
|
||||||
|
- make install DESTDIR=install
|
||||||
|
- make package
|
||||||
|
- cp -v libmastodon-cpp_${DRONE_TAG}-0_amd64_bionic.deb ..
|
||||||
|
volumes:
|
||||||
|
- name: debian-package-cache
|
||||||
|
path: /var/cache/apt/archives
|
||||||
|
|
||||||
|
- name: CentOS 8
|
||||||
|
image: centos:8
|
||||||
|
pull: always
|
||||||
|
environment:
|
||||||
|
CXX: g++
|
||||||
|
CXXFLAGS: -pipe -O2
|
||||||
|
LANG: C.utf8
|
||||||
|
commands:
|
||||||
|
- sed -i 's/keepcache=0/keepcache=1/' /etc/yum.conf
|
||||||
|
- yum install -qy gcc-c++ cmake rpm-build redhat-lsb-core
|
||||||
|
- yum install -qy libcurl-devel
|
||||||
|
- rm -rf build && mkdir -p build && cd build
|
||||||
|
- cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=/usr -DWITH_RPM=YES ..
|
||||||
|
- make
|
||||||
|
- make install DESTDIR=install
|
||||||
|
- make package
|
||||||
|
- cp -v libmastodonpp-${DRONE_TAG}-0.x86_64.centos8.rpm ..
|
||||||
|
|
||||||
|
- name: gitea_release
|
||||||
|
image: plugins/gitea-release
|
||||||
|
pull: always
|
||||||
|
settings:
|
||||||
|
base_url: https://schlomp.space
|
||||||
|
api_key:
|
||||||
|
from_secret: gitea_token
|
||||||
|
title: ${DRONE_TAG}
|
||||||
|
prerelease: true
|
||||||
|
files:
|
||||||
|
- libmastodonpp_${DRONE_TAG}-0_buster_amd64.deb
|
||||||
|
- libmastodonpp_${DRONE_TAG}-0_bionic_amd64.deb
|
||||||
|
- libmastodonpp-${DRONE_TAG}-0.x86_64.centos8.rpm
|
||||||
|
checksum:
|
||||||
|
- sha512
|
||||||
|
|
||||||
|
- name: notification
|
||||||
|
image: drillster/drone-email
|
||||||
|
pull: always
|
||||||
|
settings:
|
||||||
|
host: cryptoparty-celle.de
|
||||||
|
from: drone@tzend.de
|
||||||
|
username:
|
||||||
|
from_secret: email_username
|
||||||
|
password:
|
||||||
|
from_secret: email_password
|
||||||
|
when:
|
||||||
|
status: [ changed, failure ]
|
||||||
|
|
|
@ -20,8 +20,8 @@ list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
|
||||||
# Project build options.
|
# Project build options.
|
||||||
option(WITH_TESTS "Compile tests." NO)
|
option(WITH_TESTS "Compile tests." NO)
|
||||||
option(WITH_EXAMPLES "Compile examples." NO)
|
option(WITH_EXAMPLES "Compile examples." NO)
|
||||||
# option(WITH_DEB "Prepare for the building of .deb packages." NO)
|
option(WITH_DEB "Prepare for the building of .deb packages." NO)
|
||||||
# option(WITH_RPM "Prepare for the building of .rpm packages." NO)
|
option(WITH_RPM "Prepare for the building of .rpm packages." NO)
|
||||||
|
|
||||||
set(CMAKE_CXX_STANDARD 17)
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
@ -48,4 +48,4 @@ if(WITH_EXAMPLES)
|
||||||
add_subdirectory(examples)
|
add_subdirectory(examples)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# include(cmake/packages.cmake)
|
include(cmake/packages.cmake)
|
||||||
|
|
12
README.adoc
12
README.adoc
|
@ -12,15 +12,15 @@
|
||||||
:uri-catch: https://github.com/catchorg/Catch2
|
:uri-catch: https://github.com/catchorg/Catch2
|
||||||
:uri-dpkg: https://packages.qa.debian.org/dpkg
|
:uri-dpkg: https://packages.qa.debian.org/dpkg
|
||||||
:uri-rpm-build: http://www.rpm.org
|
:uri-rpm-build: http://www.rpm.org
|
||||||
:uri-curl: https://curl.haxx.se/
|
:uri-libcurl: https://curl.haxx.se/libcurl/
|
||||||
|
|
||||||
*{project}* is a C++ wrapper for the Mastodon API. It replaces
|
*{project}* is a C++ wrapper for the Mastodon API. It replaces
|
||||||
link:{uri-mastodon-cpp}[mastodon-cpp].
|
link:{uri-mastodon-cpp}[mastodon-cpp].
|
||||||
|
|
||||||
We aim to create a library that is comfortable, yet minimal. All API endpoints
|
We aim to create a library that is comfortable, yet minimal. All API endpoints
|
||||||
from Mastodon and Pleroma are stored in `enum class`es, to counteract typos and
|
from Mastodon and Pleroma are stored in ``enum class``es, to counteract typos and
|
||||||
make your life easier. The network-facing code is built on
|
make your life easier. The network-facing code is built on
|
||||||
link:{uri-curl}[libcurl], a mature and stable library that is available on
|
link:{uri-libcurl}[libcurl], a mature and stable library that is available on
|
||||||
virtually every operating system. The library does not parse the responses
|
virtually every operating system. The library does not parse the responses
|
||||||
itself, but returns to you the raw data, because we know everyone has their
|
itself, but returns to you the raw data, because we know everyone has their
|
||||||
favorite JSON library and we don't want to impose our choice on you!
|
favorite JSON library and we don't want to impose our choice on you!
|
||||||
|
@ -84,12 +84,12 @@ link:{uri-reference}/examples.html[More examples] are included in the reference.
|
||||||
* Tested OS: Linux
|
* Tested OS: Linux
|
||||||
* C++ compiler (tested: link:{uri-gcc}[GCC] 7/8/9, link:{uri-lang}[clang] 6/7)
|
* C++ compiler (tested: link:{uri-gcc}[GCC] 7/8/9, link:{uri-lang}[clang] 6/7)
|
||||||
* link:{uri-cmake}[CMake] (at least: 3.9)
|
* link:{uri-cmake}[CMake] (at least: 3.9)
|
||||||
* link:{uri-curl}[curl] (at least: 7.32)
|
* link:{uri-libcurl}[libcurl] (at least: 7.32)
|
||||||
* Optional
|
* Optional
|
||||||
** Documentation: link:{uri-doxygen}[Doxygen] (tested: 1.8)
|
** Documentation: link:{uri-doxygen}[Doxygen] (tested: 1.8)
|
||||||
** Tests: link:{uri-catch}[Catch] (tested: 2.5 / 1.2)
|
** Tests: link:{uri-catch}[Catch] (tested: 2.5 / 1.2)
|
||||||
// ** DEB package: link:{uri-dpkg}[dpkg] (tested: 1.18)
|
** DEB package: link:{uri-dpkg}[dpkg] (tested: 1.18)
|
||||||
// ** RPM package: link:{uri-rpm-build}[rpm-build] (tested: 4.11)
|
** RPM package: link:{uri-rpm-build}[rpm-build] (tested: 4.11)
|
||||||
|
|
||||||
==== Get sourcecode
|
==== Get sourcecode
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
include(GNUInstallDirs)
|
||||||
|
|
||||||
|
set(CPACK_PACKAGE_NAME ${PROJECT_NAME})
|
||||||
|
set(CPACK_PACKAGE_VERSION_MAJOR ${${PROJECT_NAME}_VERSION_MAJOR})
|
||||||
|
set(CPACK_PACKAGE_VERSION_MINOR ${${PROJECT_NAME}_VERSION_MINOR})
|
||||||
|
set(CPACK_PACKAGE_VERSION_PATCH ${${PROJECT_NAME}_VERSION_PATCH})
|
||||||
|
set(CPACK_PACKAGE_VERSION ${${PROJECT_NAME}_VERSION})
|
||||||
|
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${PROJECT_DESCRIPTION}")
|
||||||
|
set(CPACK_PACKAGE_CONTACT "tastytea <tastytea@tastytea.de>")
|
||||||
|
set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE")
|
||||||
|
set(CPACK_RESOURCE_FILE_README "${PROJECT_SOURCE_DIR}/README.adoc")
|
||||||
|
|
||||||
|
execute_process(COMMAND uname -m
|
||||||
|
OUTPUT_VARIABLE CPACK_PACKAGE_ARCHITECTURE OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
|
set(CPACK_PACKAGE_FILE_NAME
|
||||||
|
"${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}_${CPACK_PACKAGE_ARCHITECTURE}")
|
||||||
|
set(CPACK_GENERATOR "TGZ")
|
||||||
|
|
||||||
|
if(WITH_DEB)
|
||||||
|
set(CPACK_PACKAGE_NAME "lib${PROJECT_NAME}")
|
||||||
|
set(CPACK_GENERATOR "DEB")
|
||||||
|
set(CPACK_DEBIAN_PACKAGE_HOMEPAGE
|
||||||
|
"https://schlomp.space/tastytea/${PROJECT_NAME}")
|
||||||
|
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
|
||||||
|
|
||||||
|
execute_process(COMMAND dpkg --print-architecture
|
||||||
|
OUTPUT_VARIABLE CPACK_DEBIAN_PACKAGE_ARCHITECTURE
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
|
execute_process(COMMAND lsb_release --codename --short
|
||||||
|
OUTPUT_VARIABLE DEBIAN_CODENAME
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
|
set(CPACK_PACKAGE_FILE_NAME
|
||||||
|
"${CPACK_PACKAGE_NAME}_${CPACK_PACKAGE_VERSION}-0_${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}_${DEBIAN_CODENAME}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(WITH_RPM)
|
||||||
|
set(CPACK_PACKAGE_NAME "lib${PROJECT_NAME}")
|
||||||
|
set(CPACK_GENERATOR "RPM")
|
||||||
|
set(CPACK_RPM_PACKAGE_LICENSE "AGPL-3")
|
||||||
|
set(CPACK_RPM_PACKAGE_URL "https://schlomp.space/tastytea/${PROJECT_NAME}")
|
||||||
|
set(CPACK_RPM_PACKAGE_REQUIRES "libcurl >= 7.32")
|
||||||
|
list(APPEND CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION
|
||||||
|
"${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/cmake"
|
||||||
|
"${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/pkgconfig")
|
||||||
|
|
||||||
|
set(CPACK_PACKAGE_FILE_NAME
|
||||||
|
"${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-0.${CPACK_PACKAGE_ARCHITECTURE}")
|
||||||
|
execute_process(COMMAND lsb_release --id --short
|
||||||
|
OUTPUT_VARIABLE OS
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
|
if("${OS}" STREQUAL "CentOS")
|
||||||
|
execute_process(COMMAND rpm -E %{rhel}
|
||||||
|
OUTPUT_VARIABLE OS_RELEASE
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
|
set(CPACK_PACKAGE_FILE_NAME
|
||||||
|
"${CPACK_PACKAGE_FILE_NAME}.centos${OS_RELEASE}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
include(CPack)
|
|
@ -65,9 +65,13 @@ int main(int argc, char *argv[])
|
||||||
// Print new events every 2 seconds, for 10 seconds.
|
// Print new events every 2 seconds, for 10 seconds.
|
||||||
for (auto counter{0}; counter < 5; ++counter)
|
for (auto counter{0}; counter < 5; ++counter)
|
||||||
{
|
{
|
||||||
cout << "----------------------------------------" << endl;
|
|
||||||
sleep_for(2s);
|
sleep_for(2s);
|
||||||
cout << connection.get_new_stream_contents() << endl;
|
for (const auto &event : connection.get_new_events())
|
||||||
|
{
|
||||||
|
// Print typo of event and the beginning of the data.
|
||||||
|
cout << event.type << ": "
|
||||||
|
<< event.data.substr(0, 70) << " …" << endl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cancel the stream, …
|
// Cancel the stream, …
|
||||||
|
|
|
@ -99,6 +99,17 @@ struct answer_type
|
||||||
*/
|
*/
|
||||||
friend std::ostream &operator <<(std::ostream &out,
|
friend std::ostream &operator <<(std::ostream &out,
|
||||||
const answer_type &answer);
|
const answer_type &answer);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Returns the value of a header field.
|
||||||
|
*
|
||||||
|
* Is only valid for as long as the answer_type is in scope.
|
||||||
|
*
|
||||||
|
* @param field Case insensitive, only ASCII.
|
||||||
|
*
|
||||||
|
* @since 0.1.0
|
||||||
|
*/
|
||||||
|
string_view get_header(string_view field) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace mastodonpp
|
} // namespace mastodonpp
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <string_view>
|
#include <string_view>
|
||||||
#include <variant>
|
#include <variant>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
namespace mastodonpp
|
namespace mastodonpp
|
||||||
{
|
{
|
||||||
|
@ -32,6 +33,7 @@ namespace mastodonpp
|
||||||
using std::string;
|
using std::string;
|
||||||
using std::string_view;
|
using std::string_view;
|
||||||
using std::variant;
|
using std::variant;
|
||||||
|
using std::vector;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief An endpoint. Either API::endpoint_type or `std::string_view`.
|
* @brief An endpoint. Either API::endpoint_type or `std::string_view`.
|
||||||
|
@ -40,6 +42,29 @@ using std::variant;
|
||||||
*/
|
*/
|
||||||
using endpoint_variant = variant<API::endpoint_type,string_view>;
|
using endpoint_variant = variant<API::endpoint_type,string_view>;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief A stream event.
|
||||||
|
*
|
||||||
|
* @since 0.1.0
|
||||||
|
*
|
||||||
|
* @headerfile connection.hpp mastodonpp/connection.hpp
|
||||||
|
*/
|
||||||
|
struct event_type
|
||||||
|
{
|
||||||
|
/*!
|
||||||
|
* @brief The type of the event.
|
||||||
|
*
|
||||||
|
* Can be: “update”, “notification”, “delete” or “filters_changed”. For
|
||||||
|
* more information consult [the Mastodon documentation]
|
||||||
|
* (https://docs.joinmastodon.org/methods/timelines/streaming/
|
||||||
|
* #event-types-a-idevent-typesa).
|
||||||
|
*/
|
||||||
|
string type;
|
||||||
|
|
||||||
|
//! The payload.
|
||||||
|
string data;
|
||||||
|
};
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief Represents a connection to an instance. Used for requests.
|
* @brief Represents a connection to an instance. Used for requests.
|
||||||
*
|
*
|
||||||
|
@ -99,13 +124,6 @@ public:
|
||||||
return get(endpoint, {});
|
return get(endpoint, {});
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! @copydoc CURLWrapper::set_proxy(string_view)
|
|
||||||
*
|
|
||||||
* Sets also the proxy for the Instance you used to initialize this
|
|
||||||
* Connection.
|
|
||||||
*/
|
|
||||||
void set_proxy(string_view proxy);
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief Copy new stream contents and delete the “original”.
|
* @brief Copy new stream contents and delete the “original”.
|
||||||
*
|
*
|
||||||
|
@ -113,10 +131,19 @@ public:
|
||||||
* that you are calling this function mid-transfer. You have to check the
|
* that you are calling this function mid-transfer. You have to check the
|
||||||
* data integrity yourself.
|
* data integrity yourself.
|
||||||
*
|
*
|
||||||
|
* Using get_new_events() instead is recommended.
|
||||||
|
*
|
||||||
* @since 0.1.0
|
* @since 0.1.0
|
||||||
*/
|
*/
|
||||||
string get_new_stream_contents();
|
string get_new_stream_contents();
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Get new stream events.
|
||||||
|
*
|
||||||
|
* @since 0.1.0
|
||||||
|
*/
|
||||||
|
vector<event_type> get_new_events();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Instance &_instance;
|
Instance &_instance;
|
||||||
const string_view _baseuri;
|
const string_view _baseuri;
|
||||||
|
|
|
@ -53,7 +53,7 @@ enum class http_method
|
||||||
};
|
};
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief std::map of parameters for API calls.
|
* @brief std::map of parameters for %API calls.
|
||||||
*
|
*
|
||||||
* Example:
|
* Example:
|
||||||
* @code
|
* @code
|
||||||
|
|
|
@ -95,11 +95,35 @@ public:
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
uint64_t get_max_chars();
|
uint64_t get_max_chars();
|
||||||
|
|
||||||
|
/*! @copydoc CURLWrapper::set_proxy(string_view)
|
||||||
|
*
|
||||||
|
* Sets also the proxy for all Connection%s that are initialized with this
|
||||||
|
* Instance afterwards.
|
||||||
|
*/
|
||||||
|
void set_proxy(const string_view proxy)
|
||||||
|
{
|
||||||
|
_proxy = proxy;
|
||||||
|
CURLWrapper::set_proxy(proxy);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Returns the proxy string that was previously set.
|
||||||
|
*
|
||||||
|
* Does not return the proxy if it was set from an environment variable.
|
||||||
|
*
|
||||||
|
* @since 0.1.0
|
||||||
|
*/
|
||||||
|
string_view get_proxy() const
|
||||||
|
{
|
||||||
|
return _proxy;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const string _hostname;
|
const string _hostname;
|
||||||
const string _baseuri;
|
const string _baseuri;
|
||||||
string _access_token;
|
string _access_token;
|
||||||
uint64_t _max_chars;
|
uint64_t _max_chars;
|
||||||
|
string _proxy;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace mastodonpp
|
} // namespace mastodonpp
|
||||||
|
|
|
@ -88,6 +88,14 @@
|
||||||
* (https://curl.haxx.se/libcurl/c/curl_global_cleanup.html) is called. Both
|
* (https://curl.haxx.se/libcurl/c/curl_global_cleanup.html) is called. Both
|
||||||
* are not thread safe.
|
* are not thread safe.
|
||||||
*
|
*
|
||||||
|
* Do not make 2 requests with the same @link mastodonpp::Connection Connection
|
||||||
|
* @endlink at the same time. You can create as many @link
|
||||||
|
* mastodonpp::Connection Connection@endlink%s as you want from one @link
|
||||||
|
* mastodonpp::Instance Instance@endlink.
|
||||||
|
*
|
||||||
|
* If you are using libcurl with OpenSSL before 1.1.0, please read
|
||||||
|
* [libcurl-thread(3)](https://curl.haxx.se/libcurl/c/threadsafe.html).
|
||||||
|
*
|
||||||
* @example example01_instance_info.cpp
|
* @example example01_instance_info.cpp
|
||||||
* @example example02_streaming.cpp
|
* @example example02_streaming.cpp
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -16,9 +16,15 @@
|
||||||
|
|
||||||
#include "answer.hpp"
|
#include "answer.hpp"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <cctype>
|
||||||
|
|
||||||
namespace mastodonpp
|
namespace mastodonpp
|
||||||
{
|
{
|
||||||
|
|
||||||
|
using std::search;
|
||||||
|
using std::tolower;
|
||||||
|
|
||||||
answer_type::operator bool() const
|
answer_type::operator bool() const
|
||||||
{
|
{
|
||||||
return (curl_error_code == 0 && http_status == 200);
|
return (curl_error_code == 0 && http_status == 200);
|
||||||
|
@ -35,4 +41,23 @@ std::ostream &operator <<(std::ostream &out, const answer_type &answer)
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string_view answer_type::get_header(const string_view field) const
|
||||||
|
{
|
||||||
|
const string_view searchstring{string(field) += ':'};
|
||||||
|
auto it{search(headers.begin(), headers.end(),
|
||||||
|
searchstring.begin(), searchstring.end(),
|
||||||
|
[](unsigned char a, unsigned char b)
|
||||||
|
{ return tolower(a) == tolower(b); })};
|
||||||
|
|
||||||
|
if (it != headers.end())
|
||||||
|
{
|
||||||
|
auto pos{static_cast<size_t>(it - headers.begin())};
|
||||||
|
pos = headers.find(':', pos) + 2;
|
||||||
|
const auto endpos{headers.find('\n', pos)};
|
||||||
|
return string_view(&headers[pos], endpos - pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace mastodonpp
|
} // namespace mastodonpp
|
||||||
|
|
|
@ -24,7 +24,13 @@ using std::holds_alternative;
|
||||||
Connection::Connection(Instance &instance)
|
Connection::Connection(Instance &instance)
|
||||||
: _instance{instance}
|
: _instance{instance}
|
||||||
, _baseuri{instance.get_baseuri()}
|
, _baseuri{instance.get_baseuri()}
|
||||||
{}
|
{
|
||||||
|
auto proxy{_instance.get_proxy()};
|
||||||
|
if (!proxy.empty())
|
||||||
|
{
|
||||||
|
CURLWrapper::set_proxy(proxy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
answer_type Connection::get(const endpoint_variant &endpoint,
|
answer_type Connection::get(const endpoint_variant &endpoint,
|
||||||
const parametermap ¶meters)
|
const parametermap ¶meters)
|
||||||
|
@ -36,18 +42,12 @@ answer_type Connection::get(const endpoint_variant &endpoint,
|
||||||
return string(_baseuri)
|
return string(_baseuri)
|
||||||
+= API{std::get<API::endpoint_type>(endpoint)}.to_string_view();
|
+= API{std::get<API::endpoint_type>(endpoint)}.to_string_view();
|
||||||
}
|
}
|
||||||
return string(std::get<string_view>(endpoint));
|
return string(_baseuri) += std::get<string_view>(endpoint);
|
||||||
}()};
|
}()};
|
||||||
|
|
||||||
return make_request(http_method::GET, uri, parameters);
|
return make_request(http_method::GET, uri, parameters);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Connection::set_proxy(const string_view proxy)
|
|
||||||
{
|
|
||||||
CURLWrapper::set_proxy(proxy);
|
|
||||||
_instance.set_proxy(proxy);
|
|
||||||
}
|
|
||||||
|
|
||||||
string Connection::get_new_stream_contents()
|
string Connection::get_new_stream_contents()
|
||||||
{
|
{
|
||||||
buffer_mutex.lock();
|
buffer_mutex.lock();
|
||||||
|
@ -58,4 +58,33 @@ string Connection::get_new_stream_contents()
|
||||||
return buffer_copy;
|
return buffer_copy;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vector<event_type> Connection::get_new_events()
|
||||||
|
{
|
||||||
|
buffer_mutex.lock();
|
||||||
|
auto &buffer{get_buffer()};
|
||||||
|
vector<event_type> events;
|
||||||
|
|
||||||
|
size_t pos{0};
|
||||||
|
while ((pos = buffer.find("event: ")) != string::npos)
|
||||||
|
{
|
||||||
|
const auto endpos{buffer.find("\n\n", pos)};
|
||||||
|
if (endpos == string::npos)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
event_type event;
|
||||||
|
pos += 7; // Length of "event: ".
|
||||||
|
event.type = buffer.substr(pos, buffer.find('\n', pos) - pos);
|
||||||
|
pos = buffer.find("data: ") + 6;
|
||||||
|
event.data = buffer.substr(pos, endpos - pos);
|
||||||
|
events.push_back(event);
|
||||||
|
|
||||||
|
buffer.erase(0, endpos);
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer_mutex.unlock();
|
||||||
|
return events;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace mastodonpp
|
} // namespace mastodonpp
|
||||||
|
|
|
@ -36,6 +36,7 @@ using std::atomic;
|
||||||
using std::uint8_t;
|
using std::uint8_t;
|
||||||
using std::uint16_t;
|
using std::uint16_t;
|
||||||
|
|
||||||
|
// No one will ever need more than 65535 connections. 😉
|
||||||
static atomic<uint16_t> curlwrapper_instances{0};
|
static atomic<uint16_t> curlwrapper_instances{0};
|
||||||
|
|
||||||
CURLWrapper::CURLWrapper()
|
CURLWrapper::CURLWrapper()
|
||||||
|
@ -83,6 +84,8 @@ answer_type CURLWrapper::make_request(const http_method &method, string uri,
|
||||||
const parametermap ¶meters)
|
const parametermap ¶meters)
|
||||||
{
|
{
|
||||||
_stream_cancelled = false;
|
_stream_cancelled = false;
|
||||||
|
_curl_buffer_headers.clear();
|
||||||
|
_curl_buffer_body.clear();
|
||||||
|
|
||||||
CURLcode code;
|
CURLcode code;
|
||||||
switch (method)
|
switch (method)
|
||||||
|
|
Loading…
Reference in New Issue