#include using namespace std; #include "xmlrpc-c/AbyssServer.hpp" using xmlrpc_c::AbyssServer; #include "xmlrpc-c/registry.hpp" #include "xmlrpc-c/abyss_reqhandler_xmlrpc.hpp" namespace xmlrpc_c { abyssReqhandlerXmlrpc::abyssReqhandlerXmlrpc( xmlrpc_c::registryPtr const& registryP) : registryP(registryP) {} static void handleXmlRpc(AbyssServer::Session * const sessionP, xmlrpc_c::registry * const registryP, bool * const responseStartedP) { string const callXml(sessionP->body()); string responseXml; registryP->processCall(callXml, &responseXml); sessionP->setRespStatus(200); sessionP->setRespContentType("text/xml charset=utf-8"); sessionP->setRespContentLength(responseXml.size()); *responseStartedP = true; sessionP->writeResponse(responseXml); } void abyssReqhandlerXmlrpc::abortRequest( AbyssServer::Session * const sessionP, bool const responseStarted, AbyssServer::Exception const& e) { if (responseStarted) { // We can't send an error response because we failed // partway through sending a non-error response. All we can // do is perhaps log the error and then close the connection. this->handleUnreportableFailure(e); } else sessionP->sendErrorResponse(e); } void abyssReqhandlerXmlrpc::handleRequest( AbyssServer::Session * const sessionP, bool * const handledP) { bool responseStarted; // We have at least started to send an HTTP response. (This is // important in error handling, because it means it is too late to // send an error response). responseStarted = false; try { switch (sessionP->method()) { case AbyssServer::Session::METHOD_POST: { if (sessionP->uriPathName() == "/RPC2") { handleXmlRpc(sessionP, this->registryP.get(), &responseStarted); *handledP = true; } else *handledP = false; } break; default: *handledP = false; } } catch (AbyssServer::Exception const& e) { this->abortRequest(sessionP, responseStarted, e); *handledP = true; } catch (exception const& e) { this->abortRequest(sessionP, responseStarted, AbyssServer::Exception(500, e.what())); *handledP = true; } } void abyssReqhandlerXmlrpc::handleUnreportableFailure( AbyssServer::Exception const& ) { /*----------------------------------------------------------------------------- This is the default implementation of the virtual method. -----------------------------------------------------------------------------*/ } } // namespace