#!/sbin/openrc-run

name="uHTTPd"
description="Tiny HTTP server from OpenWrt"

: ${command_user="uhttpd"}
: ${capabilities="^cap_net_bind_service"}
: ${error_logger="logger -t uhttpd -p daemon.err >/dev/null 2>&1"}

command="/usr/bin/uhttpd"
command_args="-f $command_args"
command_background="yes"
pidfile="/run/$RC_SVCNAME.pid"

depend() {
	need net
	after firewall
}

start_pre() {
	append_list -p "$listen_http" '0.0.0.0:80 [::]:80'
	append_list -s "$listen_https"
	append_bool -q "$redirect_https" no
	append_arg -h "$home" '/var/www'
	append_bool -R "$rfc1918_filter" yes
	append_arg -n "$max_requests" 3
	append_arg -N "$max_connections" 100
	append_arg -C "$cert"
	append_arg -K "$key"
	append_arg -x "$cgi_prefix" '/cgi-bin'
	append_list -i "$interpreter"
	append_handler_mapping lua "$lua_prefix"
	append_handler_mapping ucode "$ucode_prefix"

	append_arg -t "$script_timeout" 60
	append_arg -T "$network_timeout" 30
	append_arg -k "$http_keepalive" 20
	append_arg -A "$tcp_keepalive" 1
	append_arg -r "$realm" "$(hostname)"
	#append_arg -c "$config" # FIXME
	append_list -I "$index_file" 'index.html index.htm'
	append_arg -E "$error_page"
	append_bool -S "$no_symlinks" no
	append_bool -D "$no_dirlists" no
}

append_arg() {
	local flag="$1"
	local value="${2:-$3}"

	if [ "$value" ]; then
		command_args="$command_args $flag $value"
	fi
}

append_bool() {
	local flag="$1"
	local value="${2:-$3}"

	if yesno "$value"; then
		command_args="$command_args $flag"
	fi
}

append_list() {
	local flag="$1"
	local value="${2:-$3}"

	[ "$value" ] || return

	local item; for item in $value; do
		command_args="$command_args $flag $item"
	done
}

append_handler_mapping() {
	local lang="$1"
	local value="$2"

	[ "$value" ] || return

	if ! [ -f /usr/lib/uhttpd_$lang.so ]; then
		ewarn "uhttpd-mod-$lang is not installed, ignoring \$${lang}_prefix"
		return
	fi

	local prefix_flag handler_flag
	case "$lang" in
		lua) prefix_flag='-l'; handler_flag='-L';;
		ucode) prefix_flag='-o'; handler_flag='-O';;
	esac

	local item prefix handler
	for item in $value; do
		prefix="${item%%=*}"
		handler="${item#*=}"

		if [ "$prefix" != "$handler" ] && [ "$prefix" ] && [ -f "$handler" ]; then
			append_arg "$prefix_flag" "$prefix"
			append_arg "$handler_flag" "$handler"
		else
			ewarn "Skipping invalid $lang prefix \"$item\""
		fi
	done
}
