Annotation of embedaddon/thttpd/libhttpd.h, revision 1.1
1.1 ! misho 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:
! 56: /* The httpd structs. */
! 57:
! 58: /* A multi-family sockaddr. */
! 59: typedef union {
! 60: struct sockaddr sa;
! 61: struct sockaddr_in sa_in;
! 62: #ifdef USE_IPV6
! 63: struct sockaddr_in6 sa_in6;
! 64: struct sockaddr_storage sa_stor;
! 65: #endif /* USE_IPV6 */
! 66: } httpd_sockaddr;
! 67:
! 68: /* A server. */
! 69: typedef struct {
! 70: char* binding_hostname;
! 71: char* server_hostname;
! 72: unsigned short port;
! 73: char* cgi_pattern;
! 74: int cgi_limit, cgi_count;
! 75: char* charset;
! 76: char* p3p;
! 77: int max_age;
! 78: char* cwd;
! 79: int listen4_fd, listen6_fd;
! 80: int no_log;
! 81: FILE* logfp;
! 82: int no_symlink_check;
! 83: int vhost;
! 84: int global_passwd;
! 85: char* url_pattern;
! 86: char* local_pattern;
! 87: int no_empty_referers;
! 88: } httpd_server;
! 89:
! 90: /* A connection. */
! 91: typedef struct {
! 92: int initialized;
! 93: httpd_server* hs;
! 94: httpd_sockaddr client_addr;
! 95: char* read_buf;
! 96: size_t read_size, read_idx, checked_idx;
! 97: int checked_state;
! 98: int method;
! 99: int status;
! 100: off_t bytes_to_send;
! 101: off_t bytes_sent;
! 102: char* encodedurl;
! 103: char* decodedurl;
! 104: char* protocol;
! 105: char* origfilename;
! 106: char* expnfilename;
! 107: char* encodings;
! 108: char* pathinfo;
! 109: char* query;
! 110: char* referer;
! 111: char* useragent;
! 112: char* accept;
! 113: char* accepte;
! 114: char* acceptl;
! 115: char* cookie;
! 116: char* contenttype;
! 117: char* reqhost;
! 118: char* hdrhost;
! 119: char* hostdir;
! 120: char* authorization;
! 121: char* remoteuser;
! 122: char* response;
! 123: size_t maxdecodedurl, maxorigfilename, maxexpnfilename, maxencodings,
! 124: maxpathinfo, maxquery, maxaccept, maxaccepte, maxreqhost, maxhostdir,
! 125: maxremoteuser, maxresponse;
! 126: #ifdef TILDE_MAP_2
! 127: char* altdir;
! 128: size_t maxaltdir;
! 129: #endif /* TILDE_MAP_2 */
! 130: size_t responselen;
! 131: time_t if_modified_since, range_if;
! 132: size_t contentlength;
! 133: char* type; /* not malloc()ed */
! 134: char* hostname; /* not malloc()ed */
! 135: int mime_flag;
! 136: int one_one; /* HTTP/1.1 or better */
! 137: int got_range;
! 138: int tildemapped; /* this connection got tilde-mapped */
! 139: off_t first_byte_index, last_byte_index;
! 140: int keep_alive;
! 141: int should_linger;
! 142: struct stat sb;
! 143: int conn_fd;
! 144: char* file_address;
! 145: #ifdef USE_SENDFILE
! 146: int file_fd;
! 147: #endif
! 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: extern 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_referers );
! 181:
! 182: /* Change the log file. */
! 183: extern void httpd_set_logfp( httpd_server* hs, FILE* logfp );
! 184:
! 185: /* Call to unlisten/close socket(s) listening for new connections. */
! 186: extern void httpd_unlisten( httpd_server* hs );
! 187:
! 188: /* Call to shut down. */
! 189: extern 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: extern 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: extern 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: extern 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: extern int httpd_start_request( httpd_conn* hc, struct timeval* nowP );
! 234:
! 235: /* Actually sends any buffered response text. */
! 236: extern 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: extern 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: extern void httpd_destroy_conn( httpd_conn* hc );
! 249:
! 250:
! 251: /* Send an error message back to the client. */
! 252: extern void httpd_send_err(
! 253: httpd_conn* hc, int status, char* title, char* extraheads, char* form, char* arg );
! 254:
! 255: /* Some error messages. */
! 256: extern char* httpd_err400title;
! 257: extern char* httpd_err400form;
! 258: extern char* httpd_err408title;
! 259: extern char* httpd_err408form;
! 260: extern char* httpd_err503title;
! 261: extern char* httpd_err503form;
! 262:
! 263: /* Generate a string representation of a method number. */
! 264: extern char* httpd_method_str( int method );
! 265:
! 266: /* Reallocate a string. */
! 267: extern void httpd_realloc_str( char** strP, size_t* maxsizeP, size_t size );
! 268:
! 269: /* Format a network socket to a string representation. */
! 270: extern char* httpd_ntoa( httpd_sockaddr* saP );
! 271:
! 272: /* Set NDELAY mode on a socket. */
! 273: extern void httpd_set_ndelay( int fd );
! 274:
! 275: /* Clear NDELAY mode on a socket. */
! 276: extern void httpd_clear_ndelay( int fd );
! 277:
! 278: /* Read the requested buffer completely, accounting for interruptions. */
! 279: extern int httpd_read_fully( int fd, void* buf, size_t nbytes );
! 280:
! 281: /* Write the requested buffer completely, accounting for interruptions. */
! 282: extern int httpd_write_fully( int fd, const void* buf, size_t nbytes );
! 283:
! 284: /* Generate debugging statistics syslog message. */
! 285: extern void httpd_logstats( long secs );
! 286:
! 287: #endif /* _LIBHTTPD_H_ */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>