Table of Contents
The htparser program is the root HTTP server of ashd(7). It listens to specified TCP ports, speaks HTTP with connecting clients, and passes requests on to the root handler program.
When htparser starts, it will first begin listening to all ports specified by PORTSPEC. Once all ports have been bound successfully, it will fork off and start the root handler specified by ROOT, searching the PATH environment variable if necessary, and passing it all the ARGS as command-line arguments. Only after that will htparser do any daemonizing or chrooting as specified by options.
The root handler must be a persistent program as specified in ashd(7). If the handler program exits, htparser will exit too, following the procedure described below under SIGNALS.
PORTSPEC is given in the form
HANDLER[:PAR[=VAL][(,PAR[=VAL])…]]. The
PAR=VAL pairs are used for specifying key-value arguments to the
HANDLER. An example of a valid PORTSPEC is plain:port=8080
.
Currently, the available HANDLERs are plain and ssl, for
handling plain TCP connections and SSL/TLS-protected connections,
respectively. For details regarding the arguments that each handler
accepts, simply run htparser with HANDLER:help. For example, the
command "htparser ssl:help
" will display help for the ssl handler
to standard output and then exit.
The port specifications must be followed by the --
argument to
distinguish them from the root handler specification.
If the -u, -r or -p option is presented with an empty argument, it will be treated as if the option had not been given.
htparser
closes all listening ports
and the socket to the root handler, but continues to serve all
currently ongoing requests until none remain, not keeping the
connections open for keep-alive. Upon second reception,
htparser
shuts down completely.
If the -p option is used to create a PID file, htparser
will
follow a simple protocol to allow state monitoring for clean shutdown
purposes. When htparser
is signalled to terminate, as described
under SIGNALS, then it appends a single newline at the end of the PID
file. Once all outstanding connections have been terminated, then
htparser
will truncate the PID file to zero size just prior to
exiting. Thus, init scripts or other state-monitoring tools can know
that htparser
is serving remaining connections as long as the PID
file contains two lines (the last of which is empty).
Further, when htparser
starts, it does not overwrite the contents of
an existing PID file, but rather creates a new file, replacing the old
file. Thus, if a new instance of htparser
is started while a
previous instance is still running (or serving remaining connections),
the PID file for the new instance will not be truncated when the
previous instance terminates.
The reason for the somewhat unorthodox protocol is that it works by
simply keeping the PID file open in the running process, allowing the
protocol to work without pathnames, and therefore even if htparser
is instructed to change root directory with the -r option.
htparser plain -- dirplex /srv/www
htparser plain:port=8080 -- dirplex /srv/www
htparser plain ssl:cert=/etc/ssl/private/web.pem -- dirplex /srv/www
/etc/ssl/private/web.pem
needs
to contain both the server certificate and its private key.
htparser plain -- sudo -u www-user dirplex /srv/www
htparser -f -u nobody -r /var/empty plain -- patplex /etc/ashd/rootpat
/etc/ashd/rootpat
file. htparser will
daemonize, change user-ID to nobody
and change its root
directory to /var/empty
once patplex has been
started. Note that patplex still runs as root in the normal
file system, so that it can start other handler programs as
needed.
htparser -f plain -- errlogger -n ashd dirplex /srv/www
htparser strips away all headers from incoming requests that begin
with the X-Ash-
prefix, and adds the following headers to requests:
Fredrik Tolf <fredrik@dolda2000.com>