From: Pieter Lexis Date: Wed, 18 Mar 2020 11:39:40 +0000 (+0100) Subject: Remote backend: throw DBExceptions on send/recv problems X-Git-Tag: dnsdist-1.5.0-rc3~26^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2dc4f42e436e02baaa5357c3113db1e54c076d37;p=thirdparty%2Fpdns.git Remote backend: throw DBExceptions on send/recv problems --- diff --git a/modules/remotebackend/remotebackend.cc b/modules/remotebackend/remotebackend.cc index b5862edbc2..77e74ab893 100644 --- a/modules/remotebackend/remotebackend.cc +++ b/modules/remotebackend/remotebackend.cc @@ -42,18 +42,27 @@ bool Connector::send(Json& value) { * result. Logging is performed here, too. */ bool Connector::recv(Json& value) { - if (recv_message(value)>0) { - bool rv = true; - // check for error - if (value["result"] == Json()) - return false; - if (value["result"].is_bool() && boolFromJson(value, "result", false) == false) - rv = false; - for(const auto& message: value["log"].array_items()) - g_log< 0) { + bool retval = true; + if (value["result"] == Json()) { + throw PDNSException("No 'result' field in response from remote process"); + } else if (value["result"].is_bool() && boolFromJson(value, "result", false) == false) { + retval = false; } - return false; + for(const auto& message: value["log"].array_items()) { + g_log<send(value); - } catch (PDNSException &ex) { - g_log<connector.reset(); - build(); - return false; + try { + if (!connector->send(value)) { + // XXX does this work work even though we throw? + this->connector.reset(); + build(); + throw DBException("Could not send a message to remote process"); + } + } catch (const PDNSException &ex) { + throw DBException("Exception caught when sending: " + ex.reason); + } + return true; } bool RemoteBackend::recv(Json& value) { - try { - return connector->recv(value); - } catch (PDNSException &ex) { - g_log<connector.reset(); - build(); - return false; + try { + return connector->recv(value); + } catch (const PDNSException &ex) { + this->connector.reset(); + build(); + throw DBException("Exception caught when receiving: " + ex.reason); + } catch (const std::exception &e) { + this->connector.reset(); + build(); + throw DBException("Exception caught when receiving: " + std::string(e.what())); + } } diff --git a/modules/remotebackend/remotebackend.hh b/modules/remotebackend/remotebackend.hh index 5f94d223bc..cadc8eed7e 100644 --- a/modules/remotebackend/remotebackend.hh +++ b/modules/remotebackend/remotebackend.hh @@ -207,6 +207,7 @@ class RemoteBackend : public DNSBackend bool send(Json &value); bool recv(Json &value); + void makeErrorAndThrow(Json &value); string asString(const Json& value) { if (value.is_number()) return std::to_string(value.int_value());