From 63229f465aaea8dd5553814535220817319a64f5 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Mon, 4 May 2015 21:22:14 +0200 Subject: Cleanup the code --- web/apache/service.txx | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 web/apache/service.txx (limited to 'web/apache/service.txx') diff --git a/web/apache/service.txx b/web/apache/service.txx new file mode 100644 index 0000000..06f3599 --- /dev/null +++ b/web/apache/service.txx @@ -0,0 +1,85 @@ +// file : web/apache/service.txx -*- C++ -*- +// copyright : Copyright (c) 2014-2015 Code Synthesis Tools CC +// license : MIT; see accompanying LICENSE file + +#include + +#include + +namespace web +{ + namespace apache + { + template + int service:: + handle(request& r, log& l) noexcept + { + static const std::string func_name ( + "web::apache::service<" + name_ + ">::handle"); + + try + { + M m (static_cast (exemplar_)); + static_cast (m).handle (r, r, l); + return r.flush (); + } + catch (const invalid_request& e) + { + if (!e.content.empty () && !r.get_write_state ()) + { + try + { + r.content (e.status, e.type) << e.content; + return r.flush (); + } + catch (const std::exception& e) + { + l.write (nullptr, 0, func_name.c_str (), APLOG_ERR, e.what ()); + } + } + + return e.status; + } + catch (const std::exception& e) + { + l.write (nullptr, 0, func_name.c_str (), APLOG_ERR, e.what ()); + + if (*e.what () && !r.get_write_state ()) + { + try + { + r.content (HTTP_INTERNAL_SERVER_ERROR, "text/plain;charset=utf-8") + << e.what (); + + return r.flush (); + } + catch (const std::exception& e) + { + l.write (nullptr, 0, func_name.c_str (), APLOG_ERR, e.what ()); + } + } + } + catch (...) + { + l.write (nullptr, 0, func_name.c_str (), APLOG_ERR, "unknown error"); + + if (!r.get_write_state ()) + { + try + { + r.content (HTTP_INTERNAL_SERVER_ERROR, "text/plain;charset=utf-8") + << "unknown error"; + + return r.flush (); + } + catch (const std::exception& e) + { + l.write (nullptr, 0, func_name.c_str (), APLOG_ERR, e.what ()); + } + } + } + + return HTTP_INTERNAL_SERVER_ERROR; + } + } +} -- cgit v1.1