aboutsummaryrefslogtreecommitdiff
path: root/brep/handler/handler.bash.in
diff options
context:
space:
mode:
Diffstat (limited to 'brep/handler/handler.bash.in')
-rw-r--r--brep/handler/handler.bash.in151
1 files changed, 151 insertions, 0 deletions
diff --git a/brep/handler/handler.bash.in b/brep/handler/handler.bash.in
new file mode 100644
index 0000000..89e7e21
--- /dev/null
+++ b/brep/handler/handler.bash.in
@@ -0,0 +1,151 @@
+# file : brep/handler/handler.bash.in
+# copyright : Copyright (c) 2014-2018 Code Synthesis Ltd
+# license : MIT; see accompanying LICENSE file
+
+# Utility functions useful for implementing request handlers.
+
+if [ "$brep_handler" ]; then
+ return 0
+else
+ brep_handler=true
+fi
+
+@import libbutl/manifest-parser@
+@import libbutl/manifest-serializer@
+
+# Diagnostics.
+#
+# We expect the user to set the verbose variable either to true or empty
+# (false).
+#
+if [ ! -v verbose ]; then
+ echo "error: variable 'verbose' is not set" >&2
+ exit 1
+fi
+
+# Normally the brep module's log record looks like this:
+#
+# [Mon Jul 23 17:48:46.945079 2018] [brep:error] [pid 123:tid 456] [brep::submit::init]: error description
+#
+# We will use the (almost) same format for our diagnostics (redirected to the
+# Apache's error_log), so it can easily be attributed to the brep module.
+#
+info_self="$(basename $0)"
+
+if [ "$#" -gt 0 ]; then
+ # Last argument is the request data directory which leaf component normally
+ # identifies the posted entity. A handler may overwrite this value if that's
+ # not the case.
+ #
+ info_ref="$(basename "${!#/}")"
+fi
+
+function info () # <severity> <text>
+{
+ local severity="$1"
+ shift
+
+ # Note: %N is Linux-specific.
+ #
+ local ts
+ if ! ts="$(date +"%a %b %d %H:%M:%S.%6N %Y")"; then
+ ts=
+ fi
+
+ echo "[$ts] [brep:$severity] [ref $info_ref] [$info_self]: $*" 1>&2;
+}
+
+function error () { info "error" "$*"; exit 1; }
+
+function trace () { if [ "$verbose" ]; then info "info" "$*"; fi }
+
+# Trace a command line, quoting empty arguments as well as those that contain
+# spaces.
+#
+function trace_cmd () # <cmd> <arg>...
+{
+ if [ "$verbose" ]; then
+ local s="+"
+ while [ $# -gt 0 ]; do
+ if [ -z "$1" -o -z "${1##* *}" ]; then
+ s="$s '$1'"
+ else
+ s="$s $1"
+ fi
+
+ shift
+ done
+
+ info "info" "$s"
+ fi
+}
+
+# Trace the current function name and arguments.
+#
+function trace_func () # <args>...
+{
+ trace_cmd "${FUNCNAME[1]}" "$@"
+}
+
+# Trace and run a command.
+#
+function run () # <cmd> <arg>...
+{
+ trace_cmd "$@"
+ "$@"
+}
+
+# Same as above but also redirect the command stderr to /dev/null, unless
+# running in the verbose mode.
+#
+# Note that we don't redirect stdout, so it can still be captured.
+#
+function run_silent () # <cmd> <arg>...
+{
+ trace_cmd "$@"
+
+ if [ "$verbose" ]; then
+ "$@"
+ else
+ "$@" 2>/dev/null
+ fi
+}
+
+# Wrap libbutl manifest parsing/serializing functions to shorten names and to
+# add tracing.
+#
+function manifest_parser_start () # [<file>]
+{
+ trace_func "$@"
+ butl_manifest_parser_start "$@"
+
+ manifest_parser_ofd="$butl_manifest_parser_ofd"
+}
+
+function manifest_parser_finish ()
+{
+ trace_func
+ butl_manifest_parser_finish
+}
+
+function manifest_serializer_start () # [<file>]
+{
+ trace_func "$@"
+ butl_manifest_serializer_start "$@"
+
+ manifest_serializer_ifd="$butl_manifest_serializer_ifd"
+}
+
+function manifest_serializer_finish ()
+{
+ trace_func
+ butl_manifest_serializer_finish
+}
+
+# Serialize one manifest name/value pair.
+#
+function manifest_serialize () # <name> <value>
+{
+# trace "$1: $2"
+ printf "%s:%s\0" "$1" "$2" >&"$manifest_serializer_ifd"
+}