doc: Describe htparser shutdown behavior.
[ashd.git] / doc / htparser.doc
CommitLineData
573c55e5
FT
1htparser(1)
2===========
3
4NAME
5----
e7e3e593 6htparser - Root HTTP server for use with ashd(7)
573c55e5
FT
7
8SYNOPSIS
9--------
10*htparser* [*-hSf*] [*-u* 'USER'] [*-r* 'ROOT'] [*-p* 'PIDFILE'] 'PORTSPEC'... `--` 'ROOT' ['ARGS'...]
11
12DESCRIPTION
13-----------
14
15The *htparser* program is the root HTTP server of *ashd*(7). It
16listens to specified TCP ports, speaks HTTP with connecting clients,
17and passes requests on to the root handler program.
18
19When *htparser* starts, it will first begin listening to all ports
20specified by 'PORTSPEC'. Once all ports have been bound successfully,
21it will fork off and start the root handler specified by 'ROOT',
22searching the *PATH* environment variable if necessary, and passing it
23all the 'ARGS' as command-line arguments. Only after that will
24*htparser* do any daemonizing or chrooting as specified by options.
25
26The root handler must be a persistent program as specified in
27*ashd*(7). If the handler program exits, *htparser* will exit too.
28
29PORT SPECIFICATION
30------------------
31
32'PORTSPEC' is given in the form
33'HANDLER'[*:*'PAR'[*=*'VAL'][(*,*'PAR'[*=*'VAL'])...]]. The
34'PAR'='VAL' pairs are used for specifying key-value arguments to the
35'HANDLER'. An example of a valid 'PORTSPEC' is `plain:port=8080`.
36
37Currently, the available 'HANDLERs' are *plain* and *ssl*, for
38handling plain TCP connections and SSL/TLS-protected connections,
39respectively. For details regarding the arguments that each handler
2824afab
FT
40accepts, simply run *htparser* with 'HANDLER'*:help*. For example, the
41command "`htparser ssl:help`" will display help for the *ssl* handler
42to standard output and then exit.
573c55e5
FT
43
44The port specifications must be followed by the `--` argument to
45distinguish them from the root handler specification.
46
47OPTIONS
48-------
49
50*-h*::
51
52 Print a brief usage message on standard output and exit.
53
54*-S*::
55
d341283f 56 Log messages to *syslog*(3) instead of standard error. Also
16c2bec3
FT
57 sets the ASHD_USESYSLOG environment variable in the root
58 handler process, which indicates to the standard ashd programs
59 to do the same thing.
573c55e5
FT
60
61*-f*::
62
63 Daemonize after all specified ports have been successfully
64 bound and the root handler has been started.
65
2824afab 66*-u* 'USER'::
573c55e5
FT
67
68 Change UID to 'USER' once all specified ports have been
69 successfully bound and the root handler has been
70 started. 'USER' must be specified symbolically (i.e. not as a
71 numeric UID).
72
2824afab 73*-r* 'ROOT'::
573c55e5
FT
74
75 Change root directory to 'ROOT' once all specified ports have
76 been successfully bound and the root handler has been started.
77
2824afab 78*-p* 'PIDFILE'::
573c55e5
FT
79
80 After having daemonized, write the PID of the new process to
81 'PIDFILE'.
82
c32f292e
FT
83SIGNALS
84-------
85
86SIGTERM, SIGINT::
87
88 Upon first reception, `htparser` closes all listening ports
89 and the socket to the root handler, but continues to serve all
90 currently ongoing requests until none remain. Upon second
91 reception, `htparser` shuts down completely.
92
36ee2230
FT
93EXAMPLES
94--------
95
96`htparser plain -- dirplex /srv/www`::
97
16c2bec3
FT
98 This simple invocation will listen for HTTP requests on port
99 80 and use *dirplex*(1) to serve files from the /srv/www
36ee2230
FT
100 directory.
101
102`htparser plain:port=8080 -- dirplex /srv/www`::
103
104 The same as the previous example, but uses port 8080 instead,
082441e4 105 so that it can be started without root privileges.
36ee2230
FT
106
107`htparser plain ssl:cert=/etc/ssl/private/web.pem -- dirplex /srv/www`::
108
109 The same as above, but will listen on port 443 for SSL
16c2bec3 110 connections as well. The file `/etc/ssl/private/web.pem` needs
36ee2230
FT
111 to contain both the server certificate and its private key.
112
113`htparser plain -- sudo -u www-user dirplex /srv/www`::
114
115 The same as above, but uses *sudo*(8) to ensure that *dirplex*
116 runs as a non-privileged user.
117
118`htparser -f -u nobody -r /var/empty plain -- patplex /etc/ashd/rootpat`::
119
120 Will listen to port 80 for plain HTTP requests and use the
121 *patplex*(1) program to serve requests based on patterns
122 specified in the `/etc/ashd/rootpat` file. *htparser* will
123 daemonize, change user-ID to `nobody` and change its root
124 directory to `/var/empty` once *patplex* has been
125 started. Note that *patplex* still runs as root in the normal
126 file system, so that it can start other handler programs as
127 needed.
128
16c2bec3
FT
129`htparser -f plain -- errlogger -n ashd dirplex /srv/www`::
130
131 The same as the first example, but will daemonize and use the
132 *errlogger*(1) program to ensure that any errors or other
133 messages written by any handler program to its stderr are
134 recorded in the *syslog*(3).
135
739f4959
FT
136X-ASH HEADERS
137-------------
138
139*htparser* strips away all headers from incoming requests that begin
140 with the `X-Ash-` prefix, and adds the following headers to requests:
141
142*X-Ash-Address*::
143
144 The IP address that the client connected from. May be an IPv6
145 address.
146
147*X-Ash-Port*::
148
149 The client-side port number of the TCP connection.
150
151*X-Ash-Server-Address*::
152
153 The IP address of the server where the connection was
154 accepted. May be an IPv6 address.
155
156*X-Ash-Server-Port*::
157
158 The server-side port number of the TCP connection.
159
160*X-Ash-Protocol*::
161
162 Either *http* or *https*, depending on whether the request was
163 received by the *plain* or the *ssl* handler.
164
573c55e5
FT
165AUTHOR
166------
167Fredrik Tolf <fredrik@dolda2000.com>
168
169SEE ALSO
170--------
171*ashd*(7)