aboutsummaryrefslogtreecommitdiff
path: root/mod/external-handler.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'mod/external-handler.hxx')
-rw-r--r--mod/external-handler.hxx52
1 files changed, 52 insertions, 0 deletions
diff --git a/mod/external-handler.hxx b/mod/external-handler.hxx
new file mode 100644
index 0000000..45de711
--- /dev/null
+++ b/mod/external-handler.hxx
@@ -0,0 +1,52 @@
+// file : mod/external-handler.hxx -*- C++ -*-
+// copyright : Copyright (c) 2014-2018 Code Synthesis Ltd
+// license : MIT; see accompanying LICENSE file
+
+#ifndef MOD_EXTERNAL_HANDLER_HXX
+#define MOD_EXTERNAL_HANDLER_HXX
+
+#include <libbutl/manifest-parser.mxx>
+
+#include <libbrep/types.hxx>
+#include <libbrep/utility.hxx>
+
+#include <mod/diagnostics.hxx>
+
+namespace brep
+{
+ // Utility for running external handler programs.
+ //
+ namespace external_handler
+ {
+ // Run an external handler program and, if it exited normally with the
+ // zero exit status, return the result manifest it is expected to write to
+ // stdout, containing at least the HTTP status value. Otherwise, log an
+ // error and return nullopt. Redirect the program stderr to the web server
+ // error log.
+ //
+ // If the timeout (in seconds) is not zero and the handler program does
+ // not exit in the allotted time, then it is killed and its termination is
+ // treated as abnormal.
+ //
+ // Note that warnings can be logged regardless of the program success. If
+ // the trace argument is not NULL, then trace records are also logged.
+ //
+ struct result_manifest
+ {
+ uint16_t status;
+ vector<butl::manifest_name_value> values; // Note: all values, including
+ // status.
+ };
+
+ optional<result_manifest>
+ run (const path& handler,
+ const strings& args,
+ const dir_path& data_dir,
+ size_t timeout,
+ const basic_mark& error,
+ const basic_mark& warn,
+ const basic_mark* trace);
+ }
+}
+
+#endif // MOD_EXTERNAL_HANDLER_HXX