1 /* libhttpd.h - defines for libhttpd
3 ** Copyright © 1995,1998,1999,2000,2001 by Jef Poskanzer <jef@mail.acme.com>.
4 ** All rights reserved.
6 ** Redistribution and use in source and binary forms, with or without
7 ** modification, are permitted provided that the following conditions
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.
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
31 #include <sys/types.h>
33 #include <sys/param.h>
34 #include <sys/socket.h>
36 #include <netinet/in.h>
37 #include <arpa/inet.h>
40 #if defined(AF_INET6) && defined(IN6_IS_ADDR_V4MAPPED)
45 /* A few convenient defines. */
48 #define MAX(a,b) ((a) > (b) ? (a) : (b))
51 #define MIN(a,b) ((a) < (b) ? (a) : (b))
53 #define NEW(t,n) ((t*) malloc( sizeof(t) * (n) ))
54 #define RENEW(o,t,n) ((t*) realloc( (void*) o, sizeof(t) * (n) ))
57 /* The httpd structs. */
59 /* A multi-family sockaddr. */
62 struct sockaddr_in sa_in
;
64 struct sockaddr_in6 sa_in6
;
65 struct sockaddr_storage sa_stor
;
71 char* binding_hostname
;
72 char* server_hostname
;
75 int cgi_limit
, cgi_count
;
80 int listen4_fd
, listen6_fd
;
88 int no_empty_referers
;
98 httpd_sockaddr client_addr
;
100 size_t read_size
, read_idx
, checked_idx
;
127 size_t maxdecodedurl
, maxorigfilename
, maxexpnfilename
, maxencodings
,
128 maxpathinfo
, maxquery
, maxaccept
, maxaccepte
, maxreqhost
, maxhostdir
,
129 maxremoteuser
, maxresponse
;
133 #endif /* TILDE_MAP_2 */
135 time_t if_modified_since
, range_if
;
136 size_t contentlength
;
137 char* type
; /* not malloc()ed */
138 char* hostname
; /* not malloc()ed */
140 int one_one
; /* HTTP/1.1 or better */
142 int tildemapped
; /* this connection got tilde-mapped */
143 off_t first_byte_index
, last_byte_index
;
148 int processed_directory_index
;
152 #define METHOD_UNKNOWN 0
154 #define METHOD_HEAD 2
155 #define METHOD_POST 3
157 /* States for checked_state. */
158 #define CHST_FIRSTWORD 0
159 #define CHST_FIRSTWS 1
160 #define CHST_SECONDWORD 2
161 #define CHST_SECONDWS 3
162 #define CHST_THIRDWORD 4
163 #define CHST_THIRDWS 5
168 #define CHST_CRLFCR 10
169 #define CHST_BOGUS 11
175 /* Initializes. Does the socket(), bind(), and listen(). Returns an
176 ** httpd_server* which includes a socket fd that you can select() on.
177 ** Return (httpd_server*) 0 on error.
179 extern httpd_server
* httpd_initialize(
180 char* hostname
, httpd_sockaddr
* sa4P
, httpd_sockaddr
* sa6P
,
181 unsigned short port
, char* cgi_pattern
, int cgi_limit
, char* charset
,
182 char* p3p
, int max_age
, char* cwd
, int no_log
, FILE* logfp
,
183 int no_symlink_check
, int vhost
, int global_passwd
, char* url_pattern
,
184 char* local_pattern
, int no_empty_referers
);
186 /* PoorMan: Initialize_listen_socket() is changed from static to extern.
187 ** httpd_unlisten() needs an opposite operation that can be accessed from
188 ** outside libhttpd. So this is it.
190 extern int httpd_initialize_listen_socket( httpd_sockaddr
* saP
);
192 /* Change the log file. */
193 extern void httpd_set_logfp( httpd_server
* hs
, FILE* logfp
);
195 /* Call to unlisten/close socket(s) listening for new connections. */
196 extern void httpd_unlisten( httpd_server
* hs
);
198 /* Call to shut down. */
199 extern void httpd_terminate( httpd_server
* hs
);
202 /* When a listen fd is ready to read, call this. It does the accept() and
203 ** returns an httpd_conn* which includes the fd to read the request from and
204 ** write the response to. Returns an indication of whether the accept()
205 ** failed, succeeded, or if there were no more connections to accept.
207 ** In order to minimize malloc()s, the caller passes in the httpd_conn.
208 ** The caller is also responsible for setting initialized to zero before the
209 ** first call using each different httpd_conn.
211 extern int httpd_get_conn( httpd_server
* hs
, int listen_fd
, httpd_conn
* hc
);
216 /* Checks whether the data in hc->read_buf constitutes a complete request
217 ** yet. The caller reads data into hc->read_buf[hc->read_idx] and advances
218 ** hc->read_idx. This routine checks what has been read so far, using
219 ** hc->checked_idx and hc->checked_state to keep track, and returns an
220 ** indication of whether there is no complete request yet, there is a
221 ** complete request, or there won't be a valid request due to a syntax error.
223 extern int httpd_got_request( httpd_conn
* hc
);
224 #define GR_NO_REQUEST 0
225 #define GR_GOT_REQUEST 1
226 #define GR_BAD_REQUEST 2
228 /* Parses the request in hc->read_buf. Fills in lots of fields in hc,
229 ** like the URL and the various headers.
231 ** Returns -1 on error.
233 extern int httpd_parse_request( httpd_conn
* hc
);
235 /* Starts sending data back to the client. In some cases (directories,
236 ** CGI programs), finishes sending by itself - in those cases, hc->file_fd
237 ** is <0. If there is more data to be sent, then hc->file_fd is a file
238 ** descriptor for the file to send. If you don't have a current timeval
239 ** handy just pass in 0.
241 ** Returns -1 on error.
243 extern int httpd_start_request( httpd_conn
* hc
, struct timeval
* nowP
);
245 /* Actually sends any buffered response text. */
246 extern void httpd_write_response( httpd_conn
* hc
);
248 /* Call this to close down a connection and free the data. A fine point,
249 ** if you fork() with a connection open you should still call this in the
250 ** parent process - the connection will stay open in the child.
251 ** If you don't have a current timeval handy just pass in 0.
253 extern void httpd_close_conn( httpd_conn
* hc
, struct timeval
* nowP
);
255 /* Call this to de-initialize a connection struct and *really* free the
256 ** mallocced strings.
258 extern void httpd_destroy_conn( httpd_conn
* hc
);
261 /* Send an error message back to the client. */
262 extern void httpd_send_err(
263 httpd_conn
* hc
, int status
, char* title
, char* extraheads
, char* form
, char* arg
);
265 /* Some error messages. */
266 extern char* httpd_err400title
;
267 extern char* httpd_err400form
;
268 extern char* httpd_err408title
;
269 extern char* httpd_err408form
;
270 extern char* httpd_err503title
;
271 extern char* httpd_err503form
;
273 /* Generate a string representation of a method number. */
274 extern char* httpd_method_str( int method
);
276 /* Reallocate a string. */
277 extern void httpd_realloc_str( char** strP
, size_t* maxsizeP
, size_t size
);
279 /* Format a network socket to a string representation. */
280 extern char* httpd_ntoa( httpd_sockaddr
* saP
);
282 /* Set NDELAY mode on a socket. */
283 extern void httpd_set_ndelay( int fd
);
285 /* Clear NDELAY mode on a socket. */
286 extern void httpd_clear_ndelay( int fd
);
288 /* Read the requested buffer completely, accounting for interruptions. */
289 extern int httpd_read_fully( int fd
, void* buf
, size_t nbytes
);
291 /* Write the requested buffer completely, accounting for interruptions. */
292 extern int httpd_write_fully( int fd
, const void* buf
, size_t nbytes
);
294 /* Generate debugging statistics syslog message. */
295 extern void httpd_logstats( long secs
);
301 #endif /* _LIBHTTPD_H_ */