From 1419fece274960e7581f5efd7dff49c63cd99577 Mon Sep 17 00:00:00 2001 From: Vitaut Bajaryn Date: Fri, 10 Apr 2015 22:50:35 +0200 Subject: [PATCH 1/6] Rename cycle_callback -> data_callback; make data_callback a functor --- src/http_response.cpp | 5 +++-- src/httpserver/http_response.hpp | 22 +++++++++++++++++++--- src/httpserver/http_response_builder.hpp | 12 +++++++++--- 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/src/http_response.cpp b/src/http_response.cpp index 0d111255..02e2bc91 100644 --- a/src/http_response.cpp +++ b/src/http_response.cpp @@ -56,7 +56,7 @@ http_response::http_response(const http_response_builder& builder): ca(0x0), closure_data(0x0), ce(builder._ce), - cycle_callback(builder._cycle_callback), + data_callback(builder._data_callback), get_raw_response(this, builder._get_raw_response), decorate_response(this, builder._decorate_response), enqueue_response(this, builder._enqueue_response), @@ -70,6 +70,7 @@ http_response::~http_response() { if(ce != 0x0) webserver::unlock_cache_entry(ce); + delete data_callback; } size_t http_response::get_headers(std::map& result) const @@ -207,7 +208,7 @@ namespace details ssize_t cb(void* cls, uint64_t pos, char* buf, size_t max) { - ssize_t val = static_cast(cls)->cycle_callback(buf, max); + ssize_t val = (*static_cast(cls)->data_callback)(buf, max); if(val == -1) static_cast(cls)->completed = true; return val; diff --git a/src/httpserver/http_response.hpp b/src/httpserver/http_response.hpp index 942bf1c8..fa4c80bb 100644 --- a/src/httpserver/http_response.hpp +++ b/src/httpserver/http_response.hpp @@ -62,7 +62,23 @@ class bad_caching_attempt: public std::exception } }; -typedef ssize_t(*cycle_callback_ptr)(char*, size_t); +/** + * Callback called to obtain data from a deferred_response +**/ +class data_callback +{ +public: + /** + * @param buf Buffer to copy data to + * @param max Maximum number of bytes allowed to be copied + * @return number of bytes copied, or + * -1 for end of stream, or + * -2 for end with error + **/ + virtual ssize_t operator() (char* buf, size_t max) = 0; + + virtual ~data_callback() {} +}; /** * Class representing an abstraction for an Http Response. It is used from classes using these apis to send information through http protocol. @@ -97,7 +113,7 @@ class http_response ca(0x0), closure_data(0x0), ce(b.ce), - cycle_callback(b.cycle_callback), + data_callback(b.data_callback), get_raw_response(b.get_raw_response), decorate_response(b.decorate_response), enqueue_response(b.enqueue_response), @@ -259,7 +275,7 @@ class http_response void(*ca)(void*); void* closure_data; details::cache_entry* ce; - cycle_callback_ptr cycle_callback; + data_callback* data_callback; const get_raw_response_t get_raw_response; const decorate_response_t decorate_response; diff --git a/src/httpserver/http_response_builder.hpp b/src/httpserver/http_response_builder.hpp index c405e234..26a9dab7 100644 --- a/src/httpserver/http_response_builder.hpp +++ b/src/httpserver/http_response_builder.hpp @@ -93,6 +93,7 @@ class http_response_builder _keepalive_secs(-1), _keepalive_msg(""), _send_topic(""), + _data_callback(NULL), _ce(0x0), _get_raw_response(&http_response::get_raw_response_str), _decorate_response(&http_response::decorate_response_str), @@ -120,6 +121,7 @@ class http_response_builder _keepalive_secs(-1), _keepalive_msg(""), _send_topic(""), + _data_callback(NULL), _ce(0x0), _get_raw_response(&http_response::get_raw_response_str), _decorate_response(&http_response::decorate_response_str), @@ -142,6 +144,9 @@ class http_response_builder _keepalive_secs(b._keepalive_secs), _keepalive_msg(b._keepalive_msg), _send_topic(b._send_topic), + // Is copying the pointer a good idea? + // (since it is deleted in ~http_response) + _data_callback(b._data_callback), _ce(b._ce), _get_raw_response(b._get_raw_response), _decorate_response(b._decorate_response), @@ -164,6 +169,7 @@ class http_response_builder _keepalive_secs = b._keepalive_secs; _keepalive_msg = b._keepalive_msg; _send_topic = b._send_topic; + _data_callback = b._data_callback; _ce = b._ce; _get_raw_response = b._get_raw_response; _decorate_response = b._decorate_response; @@ -233,9 +239,9 @@ class http_response_builder return *this; } - http_response_builder& deferred_response(cycle_callback_ptr cycle_callback) + http_response_builder& deferred_response(data_callback* data_callback) { - _cycle_callback = cycle_callback; + _data_callback = data_callback; _get_raw_response = &http_response::get_raw_response_deferred; _decorate_response = &http_response::decorate_response_deferred; return *this; @@ -276,7 +282,7 @@ class http_response_builder int _keepalive_secs; std::string _keepalive_msg; std::string _send_topic; - cycle_callback_ptr _cycle_callback; + data_callback* _data_callback; details::cache_entry* _ce; void (http_response::*_get_raw_response)(MHD_Response**, webserver*); From ef45cd16fc5a31adfb24cbe753ef873467af7f60 Mon Sep 17 00:00:00 2001 From: Vitaut Bajaryn Date: Fri, 10 Apr 2015 23:10:22 +0200 Subject: [PATCH 2/6] Use MHD_ContentReaderFreeCallback free_cb to delete data_callback --- src/http_response.cpp | 8 ++++++-- src/httpserver/http_response.hpp | 2 ++ src/httpserver/http_response_builder.hpp | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/http_response.cpp b/src/http_response.cpp index 02e2bc91..bb733e80 100644 --- a/src/http_response.cpp +++ b/src/http_response.cpp @@ -70,7 +70,6 @@ http_response::~http_response() { if(ce != 0x0) webserver::unlock_cache_entry(ce); - delete data_callback; } size_t http_response::get_headers(std::map& result) const @@ -214,6 +213,11 @@ ssize_t cb(void* cls, uint64_t pos, char* buf, size_t max) return val; } +void free_cb(void* cls) +{ + delete static_cast(cls)->data_callback; +} + } void http_response::get_raw_response_deferred( @@ -227,7 +231,7 @@ void http_response::get_raw_response_deferred( 1024, &details::cb, this, - NULL + &details::free_cb ); else static_cast(this)->get_raw_response(response, ws); diff --git a/src/httpserver/http_response.hpp b/src/httpserver/http_response.hpp index fa4c80bb..cbbc542b 100644 --- a/src/httpserver/http_response.hpp +++ b/src/httpserver/http_response.hpp @@ -49,6 +49,7 @@ namespace details { struct http_response_ptr; ssize_t cb(void*, uint64_t, char*, size_t); + void free_cb(void*); struct cache_entry; }; @@ -314,6 +315,7 @@ class http_response friend class http_response_builder; friend void clone_response(const http_response& hr, http_response** dhr); friend ssize_t details::cb(void* cls, uint64_t pos, char* buf, size_t max); + friend void details::free_cb(void* cls); friend std::ostream &operator<< (std::ostream &os, const http_response &r); private: http_response& operator=(const http_response& b); diff --git a/src/httpserver/http_response_builder.hpp b/src/httpserver/http_response_builder.hpp index 26a9dab7..35941344 100644 --- a/src/httpserver/http_response_builder.hpp +++ b/src/httpserver/http_response_builder.hpp @@ -145,7 +145,7 @@ class http_response_builder _keepalive_msg(b._keepalive_msg), _send_topic(b._send_topic), // Is copying the pointer a good idea? - // (since it is deleted in ~http_response) + // (since it is deleted in details::free_cb) _data_callback(b._data_callback), _ce(b._ce), _get_raw_response(b._get_raw_response), From 149f93698f14e84679714bc17593cf3577e2fc85 Mon Sep 17 00:00:00 2001 From: Vitaut Bajaryn Date: Sat, 11 Apr 2015 00:11:48 +0200 Subject: [PATCH 3/6] Fix http_response::data_callback declaration --- src/httpserver/http_response.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/httpserver/http_response.hpp b/src/httpserver/http_response.hpp index cbbc542b..55547337 100644 --- a/src/httpserver/http_response.hpp +++ b/src/httpserver/http_response.hpp @@ -276,7 +276,7 @@ class http_response void(*ca)(void*); void* closure_data; details::cache_entry* ce; - data_callback* data_callback; + class data_callback* data_callback; const get_raw_response_t get_raw_response; const decorate_response_t decorate_response; From a0fedda206cf17900cb4c3b3849f844de0b32b1d Mon Sep 17 00:00:00 2001 From: Vitaut Bajaryn Date: Sun, 5 Jul 2015 23:18:38 +0200 Subject: [PATCH 4/6] Add CMake module to Makefile.am to be installed --- Makefile.am | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Makefile.am b/Makefile.am index 982cf3f1..6f99f6ea 100644 --- a/Makefile.am +++ b/Makefile.am @@ -34,6 +34,9 @@ DISTCLEANFILES = redhat/SOURCES/* redhat/SPEC/* redhat/RPMS/* redhat/SRPMS/* red pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libhttpserver.pc +cmakemoduledir = $(datadir)/cmake/Modules +cmakemodule_DATA = cmakemodule/FindLibHttpServer.cmake + include $(top_srcdir)/aminclude.am # Update libtool, if needed. From 818ef2a230fd2a753dfbdd42476ca67af95b6d2a Mon Sep 17 00:00:00 2001 From: Vitaut Bajaryn Date: Thu, 9 Jul 2015 21:28:05 +0200 Subject: [PATCH 5/6] Add ebuild --- ebuild/net-libs/libhttpserver/Manifest | 1 + .../libhttpserver/libhttpserver-9999.ebuild | 40 +++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 ebuild/net-libs/libhttpserver/Manifest create mode 100644 ebuild/net-libs/libhttpserver/libhttpserver-9999.ebuild diff --git a/ebuild/net-libs/libhttpserver/Manifest b/ebuild/net-libs/libhttpserver/Manifest new file mode 100644 index 00000000..c41c811a --- /dev/null +++ b/ebuild/net-libs/libhttpserver/Manifest @@ -0,0 +1 @@ +EBUILD libhttpserver-9999.ebuild 845 SHA256 ff32b201a143a14a14f1ff1aec3826ea140a780623ebdfd68dd8c86b4a64413e SHA512 448d535de2fb9ba9321d382fb8994c364776a34967dc21d316386556acc99a20ecd2cc0a3b38c240f57cf95a78af0bcf8e3c5405dc9ee4917c2f19a7abda734c WHIRLPOOL 5638ca796d9d1e1e46cd5f706c763d4eaf60e7abcf922d388788a8f4d5b46e3e4e2b2f508d9a8435535ac675b11873527a701ed1e9ecb95471ad9101268aa48f diff --git a/ebuild/net-libs/libhttpserver/libhttpserver-9999.ebuild b/ebuild/net-libs/libhttpserver/libhttpserver-9999.ebuild new file mode 100644 index 00000000..0f955e70 --- /dev/null +++ b/ebuild/net-libs/libhttpserver/libhttpserver-9999.ebuild @@ -0,0 +1,40 @@ +# Copyright 2015 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: $ + +EAPI="4" + +inherit git-r3 + +FORK="vozhyk-" # use "etr" for original version + +DESCRIPTION="C++ library for creating an embedded Rest HTTP server (and more)" +HOMEPAGE="http://github.com/${FORK}/${PN}" +#EGIT_REPO_URI="git://github.com/${FORK}/${PN}.git" +EGIT_REPO_URI="/home/vozhyk/dev/cpp/${PN}" + +LICENSE="LGPL-2.1" +SLOT="0" +KEYWORDS="~amd64" +IUSE="debug" + +RDEPEND=">=net-libs/libmicrohttpd-0.9.37" +DEPEND="${RDEPEND}" + +src_configure() { + ./bootstrap + + mkdir build + cd build && ECONF_SOURCE=.. econf \ + $(use_enable debug) \ + --disable-doxygen-doc # no useflag for now + # TODO configure checks for TLS +} + +src_compile() { + cd build && emake +} + +src_install() { + cd build && emake DESTDIR="${D}" install +} From a495f4549dfba0e6a82206dc7ada1beea72a149c Mon Sep 17 00:00:00 2001 From: Vitaut Bajaryn Date: Thu, 9 Jul 2015 21:33:18 +0200 Subject: [PATCH 6/6] ebuild: Change repo URI to github --- ebuild/net-libs/libhttpserver/Manifest | 2 +- ebuild/net-libs/libhttpserver/libhttpserver-9999.ebuild | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/ebuild/net-libs/libhttpserver/Manifest b/ebuild/net-libs/libhttpserver/Manifest index c41c811a..d93e1684 100644 --- a/ebuild/net-libs/libhttpserver/Manifest +++ b/ebuild/net-libs/libhttpserver/Manifest @@ -1 +1 @@ -EBUILD libhttpserver-9999.ebuild 845 SHA256 ff32b201a143a14a14f1ff1aec3826ea140a780623ebdfd68dd8c86b4a64413e SHA512 448d535de2fb9ba9321d382fb8994c364776a34967dc21d316386556acc99a20ecd2cc0a3b38c240f57cf95a78af0bcf8e3c5405dc9ee4917c2f19a7abda734c WHIRLPOOL 5638ca796d9d1e1e46cd5f706c763d4eaf60e7abcf922d388788a8f4d5b46e3e4e2b2f508d9a8435535ac675b11873527a701ed1e9ecb95471ad9101268aa48f +EBUILD libhttpserver-9999.ebuild 801 SHA256 339a46d12470a896c3068cee951e62bba0ddd6205629af7c81092766ba02e081 SHA512 2395d7c34eb0553ac78871dc0d18c9e83929d0a301c9e46227bc90961e324ee80afadb151cf8936f8cff157a271d7b0bd503e3129e8012d7ca784d5f5ab19678 WHIRLPOOL cce855b6906df88c6923bdc5f291a418ca96d95d4e3595b26b34fb0f2ca09ac9bd6da5b7b1822d6fa69c79694ee89ee261b2bb33d4c1096ac424c42e428eb733 diff --git a/ebuild/net-libs/libhttpserver/libhttpserver-9999.ebuild b/ebuild/net-libs/libhttpserver/libhttpserver-9999.ebuild index 0f955e70..7bf8e7ae 100644 --- a/ebuild/net-libs/libhttpserver/libhttpserver-9999.ebuild +++ b/ebuild/net-libs/libhttpserver/libhttpserver-9999.ebuild @@ -10,8 +10,7 @@ FORK="vozhyk-" # use "etr" for original version DESCRIPTION="C++ library for creating an embedded Rest HTTP server (and more)" HOMEPAGE="http://github.com/${FORK}/${PN}" -#EGIT_REPO_URI="git://github.com/${FORK}/${PN}.git" -EGIT_REPO_URI="/home/vozhyk/dev/cpp/${PN}" +EGIT_REPO_URI="git://github.com/${FORK}/${PN}.git" LICENSE="LGPL-2.1" SLOT="0"