]> git.gir.st - ttxd.git/blob - src/thttpd-2.27/libhttpd.h
initial code import
[ttxd.git] / src / thttpd-2.27 / libhttpd.h
1 /* libhttpd.h - defines for libhttpd
2 **
3 ** Copyright © 1995,1998,1999,2000,2001 by Jef Poskanzer <jef@mail.acme.com>.
4 ** All rights reserved.
5 **
6 ** Redistribution and use in source and binary forms, with or without
7 ** modification, are permitted provided that the following conditions
8 ** are met:
9 ** 1. Redistributions of source code must retain the above copyright
10 ** notice, this list of conditions and the following disclaimer.
11 ** 2. Redistributions in binary form must reproduce the above copyright
12 ** notice, this list of conditions and the following disclaimer in the
13 ** documentation and/or other materials provided with the distribution.
14 **
15 ** THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 ** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 ** ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 ** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 ** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 ** OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 ** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 ** LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 ** OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 ** SUCH DAMAGE.
26 */
27
28 #ifndef _LIBHTTPD_H_
29 #define _LIBHTTPD_H_
30
31 #include <sys/types.h>
32 #include <sys/time.h>
33 #include <sys/param.h>
34 #include <sys/socket.h>
35 #include <netinet/in.h>
36 #include <arpa/inet.h>
37 #include <netdb.h>
38
39 #if defined(AF_INET6) && defined(IN6_IS_ADDR_V4MAPPED)
40 #define USE_IPV6
41 #endif
42
43
44 /* A few convenient defines. */
45
46 #ifndef MAX
47 #define MAX(a,b) ((a) > (b) ? (a) : (b))
48 #endif
49 #ifndef MIN
50 #define MIN(a,b) ((a) < (b) ? (a) : (b))
51 #endif
52 #define NEW(t,n) ((t*) malloc( sizeof(t) * (n) ))
53 #define RENEW(o,t,n) ((t*) realloc( (void*) o, sizeof(t) * (n) ))
54
55 /* Do overlapping strcpy safely, by using memmove. */
56 #define ol_strcpy(dst,src) memmove(dst,src,strlen(src)+1)
57
58
59 /* The httpd structs. */
60
61 /* A multi-family sockaddr. */
62 typedef union {
63 struct sockaddr sa;
64 struct sockaddr_in sa_in;
65 #ifdef USE_IPV6
66 struct sockaddr_in6 sa_in6;
67 struct sockaddr_storage sa_stor;
68 #endif /* USE_IPV6 */
69 } httpd_sockaddr;
70
71 /* A server. */
72 typedef struct {
73 char* binding_hostname;
74 char* server_hostname;
75 unsigned short port;
76 char* cgi_pattern;
77 int cgi_limit, cgi_count;
78 char* charset;
79 char* p3p;
80 int max_age;
81 char* cwd;
82 int listen4_fd, listen6_fd;
83 int no_log;
84 FILE* logfp;
85 int no_symlink_check;
86 int vhost;
87 int global_passwd;
88 char* url_pattern;
89 char* local_pattern;
90 int no_empty_referrers;
91 } httpd_server;
92
93 /* A connection. */
94 typedef struct {
95 int initialized;
96 httpd_server* hs;
97 httpd_sockaddr client_addr;
98 char* read_buf;
99 size_t read_size, read_idx, checked_idx;
100 int checked_state;
101 int method;
102 int status;
103 off_t bytes_to_send;
104 off_t bytes_sent;
105 char* encodedurl;
106 char* decodedurl;
107 char* protocol;
108 char* origfilename;
109 char* expnfilename;
110 char* encodings;
111 char* pathinfo;
112 char* query;
113 char* referrer;
114 char* useragent;
115 char* accept;
116 char* accepte;
117 char* acceptl;
118 char* cookie;
119 char* contenttype;
120 char* reqhost;
121 char* hdrhost;
122 char* hostdir;
123 char* authorization;
124 char* remoteuser;
125 char* response;
126 size_t maxdecodedurl, maxorigfilename, maxexpnfilename, maxencodings,
127 maxpathinfo, maxquery, maxaccept, maxaccepte, maxreqhost, maxhostdir,
128 maxremoteuser, maxresponse;
129 #ifdef TILDE_MAP_2
130 char* altdir;
131 size_t maxaltdir;
132 #endif /* TILDE_MAP_2 */
133 size_t responselen;
134 time_t if_modified_since, range_if;
135 size_t contentlength;
136 char* type; /* not malloc()ed */
137 char* hostname; /* not malloc()ed */
138 int mime_flag;
139 int one_one; /* HTTP/1.1 or better */
140 int got_range;
141 int tildemapped; /* this connection got tilde-mapped */
142 off_t first_byte_index, last_byte_index;
143 int keep_alive;
144 int should_linger;
145 struct stat sb;
146 int conn_fd;
147 char* file_address;
148 } httpd_conn;
149
150 /* Methods. */
151 #define METHOD_UNKNOWN 0
152 #define METHOD_GET 1
153 #define METHOD_HEAD 2
154 #define METHOD_POST 3
155
156 /* States for checked_state. */
157 #define CHST_FIRSTWORD 0
158 #define CHST_FIRSTWS 1
159 #define CHST_SECONDWORD 2
160 #define CHST_SECONDWS 3
161 #define CHST_THIRDWORD 4
162 #define CHST_THIRDWS 5
163 #define CHST_LINE 6
164 #define CHST_LF 7
165 #define CHST_CR 8
166 #define CHST_CRLF 9
167 #define CHST_CRLFCR 10
168 #define CHST_BOGUS 11
169
170
171 /* Initializes. Does the socket(), bind(), and listen(). Returns an
172 ** httpd_server* which includes a socket fd that you can select() on.
173 ** Return (httpd_server*) 0 on error.
174 */
175 httpd_server* httpd_initialize(
176 char* hostname, httpd_sockaddr* sa4P, httpd_sockaddr* sa6P,
177 unsigned short port, char* cgi_pattern, int cgi_limit, char* charset,
178 char* p3p, int max_age, char* cwd, int no_log, FILE* logfp,
179 int no_symlink_check, int vhost, int global_passwd, char* url_pattern,
180 char* local_pattern, int no_empty_referrers );
181
182 /* Change the log file. */
183 void httpd_set_logfp( httpd_server* hs, FILE* logfp );
184
185 /* Call to unlisten/close socket(s) listening for new connections. */
186 void httpd_unlisten( httpd_server* hs );
187
188 /* Call to shut down. */
189 void httpd_terminate( httpd_server* hs );
190
191
192 /* When a listen fd is ready to read, call this. It does the accept() and
193 ** returns an httpd_conn* which includes the fd to read the request from and
194 ** write the response to. Returns an indication of whether the accept()
195 ** failed, succeeded, or if there were no more connections to accept.
196 **
197 ** In order to minimize malloc()s, the caller passes in the httpd_conn.
198 ** The caller is also responsible for setting initialized to zero before the
199 ** first call using each different httpd_conn.
200 */
201 int httpd_get_conn( httpd_server* hs, int listen_fd, httpd_conn* hc );
202 #define GC_FAIL 0
203 #define GC_OK 1
204 #define GC_NO_MORE 2
205
206 /* Checks whether the data in hc->read_buf constitutes a complete request
207 ** yet. The caller reads data into hc->read_buf[hc->read_idx] and advances
208 ** hc->read_idx. This routine checks what has been read so far, using
209 ** hc->checked_idx and hc->checked_state to keep track, and returns an
210 ** indication of whether there is no complete request yet, there is a
211 ** complete request, or there won't be a valid request due to a syntax error.
212 */
213 int httpd_got_request( httpd_conn* hc );
214 #define GR_NO_REQUEST 0
215 #define GR_GOT_REQUEST 1
216 #define GR_BAD_REQUEST 2
217
218 /* Parses the request in hc->read_buf. Fills in lots of fields in hc,
219 ** like the URL and the various headers.
220 **
221 ** Returns -1 on error.
222 */
223 int httpd_parse_request( httpd_conn* hc );
224
225 /* Starts sending data back to the client. In some cases (directories,
226 ** CGI programs), finishes sending by itself - in those cases, hc->file_fd
227 ** is <0. If there is more data to be sent, then hc->file_fd is a file
228 ** descriptor for the file to send. If you don't have a current timeval
229 ** handy just pass in 0.
230 **
231 ** Returns -1 on error.
232 */
233 int httpd_start_request( httpd_conn* hc, struct timeval* nowP );
234
235 /* Actually sends any buffered response text. */
236 void httpd_write_response( httpd_conn* hc );
237
238 /* Call this to close down a connection and free the data. A fine point,
239 ** if you fork() with a connection open you should still call this in the
240 ** parent process - the connection will stay open in the child.
241 ** If you don't have a current timeval handy just pass in 0.
242 */
243 void httpd_close_conn( httpd_conn* hc, struct timeval* nowP );
244
245 /* Call this to de-initialize a connection struct and *really* free the
246 ** mallocced strings.
247 */
248 void httpd_destroy_conn( httpd_conn* hc );
249
250
251 /* Send an error message back to the client. */
252 void httpd_send_err(
253 httpd_conn* hc, int status, char* title, char* extraheads, char* form,
254 char* arg );
255
256 /* Some error messages. */
257 extern char* httpd_err400title;
258 extern char* httpd_err400form;
259 extern char* httpd_err408title;
260 extern char* httpd_err408form;
261 extern char* httpd_err503title;
262 extern char* httpd_err503form;
263
264 /* Generate a string representation of a method number. */
265 char* httpd_method_str( int method );
266
267 /* Reallocate a string. */
268 void httpd_realloc_str( char** strP, size_t* maxsizeP, size_t size );
269
270 /* Format a network socket to a string representation. */
271 char* httpd_ntoa( httpd_sockaddr* saP );
272
273 /* Set NDELAY mode on a socket. */
274 void httpd_set_ndelay( int fd );
275
276 /* Clear NDELAY mode on a socket. */
277 void httpd_clear_ndelay( int fd );
278
279 /* Read the requested buffer completely, accounting for interruptions. */
280 int httpd_read_fully( int fd, void* buf, size_t nbytes );
281
282 /* Write the requested buffer completely, accounting for interruptions. */
283 int httpd_write_fully( int fd, const char* buf, size_t nbytes );
284
285 /* Generate debugging statistics syslog message. */
286 void httpd_logstats( long secs );
287
288 #endif /* _LIBHTTPD_H_ */
Imprint / Impressum