diff options
Diffstat (limited to 'web/apache/service.txx')
-rw-r--r-- | web/apache/service.txx | 85 |
1 files changed, 85 insertions, 0 deletions
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 <httpd/http_log.h> + +#include <exception> + +namespace web +{ + namespace apache + { + template <typename M> + int service:: + handle(request& r, log& l) noexcept + { + static const std::string func_name ( + "web::apache::service<" + name_ + ">::handle"); + + try + { + M m (static_cast<const M&> (exemplar_)); + static_cast<module&> (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; + } + } +} |