From 6e98ee05aa018d435124c5e923036d579fb19f90 Mon Sep 17 00:00:00 2001 From: Julian Picht Date: Fri, 2 Oct 2015 17:04:05 +0200 Subject: [PATCH] FIX: do not call abort, throw an exception instead Calling abort is a really bad idea inside a library, because the whole application will die when just the HTTP server module has a problem. --- src/httpserver/webserver.hpp | 10 ++++++++++ src/webserver.cpp | 8 ++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/httpserver/webserver.hpp b/src/httpserver/webserver.hpp index 9a8e172f..06c58fb9 100644 --- a/src/httpserver/webserver.hpp +++ b/src/httpserver/webserver.hpp @@ -41,6 +41,7 @@ #include #include +#include #include "httpserver/create_webserver.hpp" @@ -66,6 +67,15 @@ namespace details { class comet_manager; } +class webserver_exception : public std::runtime_error +{ +public: + webserver_exception() + : std::runtime_error("httpserver runtime error") + { + } +}; + /** * Class representing the webserver. Main class of the apis. **/ diff --git a/src/webserver.cpp b/src/webserver.cpp index d1a3c930..fdf97ca0 100644 --- a/src/webserver.cpp +++ b/src/webserver.cpp @@ -280,7 +280,7 @@ void* webserver::select(void* self) FD_ZERO (&ws); FD_ZERO (&es); if (MHD_YES != MHD_get_fdset (di->daemon, &rs, &ws, &es, &max)) - abort(); /* fatal internal error */ + throw ::httpserver::webserver_exception(); /* fatal internal error */ unsigned long long timeout_microsecs = 0; unsigned long long timeout_secs = 0; @@ -563,7 +563,7 @@ bool webserver::start(bool blocking) { cout << gettext("Unable to connect daemon to port: ") << this->port << endl; - abort(); + throw ::httpserver::webserver_exception(); } details::daemon_item* di = new details::daemon_item(this, daemon); daemons.push_back(di); @@ -579,7 +579,7 @@ bool webserver::start(bool blocking) static_cast(di) )) { - abort(); + throw ::httpserver::webserver_exception(); } } } @@ -595,7 +595,7 @@ bool webserver::start(bool blocking) { cout << gettext("Unable to connect daemon to port: ") << this->port << endl; - abort(); + throw ::httpserver::webserver_exception(); } details::daemon_item* di = new details::daemon_item(this, daemon); daemons.push_back(di);