diff -r 7b70918c30af -r 23c516259cc5 src/HTTPServer.cpp --- a/src/HTTPServer.cpp Tue Apr 05 23:46:34 2022 +0200 +++ b/src/HTTPServer.cpp Thu Apr 07 21:06:37 2022 +0200 @@ -16,6 +16,7 @@ */ #include +#include #include "HTTPServer.h" @@ -24,17 +25,44 @@ namespace httpd { class HTTPServer::HTTPServerImpl { +public: + MHD_Daemon* mhd = nullptr; }; HTTPServer* HTTPServer::create() { HTTPServer::HTTPServerImpl* impl = new HTTPServer::HTTPServerImpl(); + void* acceptCallbackData = nullptr; + MHD_AcceptPolicyCallback acceptCallback = [](void* cls, const struct sockaddr* addr, socklen_t addrlen) { + return MHD_YES; + }; - return new HTTPServer(impl); + void* accessCallbackData = nullptr; + MHD_AccessHandlerCallback accessCallback = [](void* cls, struct MHD_Connection* connection, const char* url, const char* method, const char* version, const char* upload_data, size_t* upload_data_size, void** con_cls) { + static const char html[] = "

Hello, relational world!

"; + struct MHD_Response* response = MHD_create_response_from_buffer(sizeof (html), (void*) html, MHD_RESPMEM_PERSISTENT); + MHD_queue_response(connection, 200, response); + MHD_destroy_response(response); + return MHD_YES; + }; + + + impl->mhd = MHD_start_daemon(MHD_USE_INTERNAL_POLLING_THREAD, + 8080, + acceptCallback, acceptCallbackData, + accessCallback, accessCallbackData, + MHD_OPTION_THREAD_POOL_SIZE, 10, + MHD_OPTION_CONNECTION_TIMEOUT, 60, + MHD_OPTION_END); + + + if (impl->mhd) return new HTTPServer(impl); + else throw std::logic_error("Unable to start MHD."); } HTTPServer::~HTTPServer() { - + MHD_stop_daemon(impl->mhd); + delete impl; }