#ifndef _LIBHTTPD_H_
#define _LIBHTTPD_H_
#include <sys/types.h>
#include <sys/time.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#if defined(AF_INET6) && defined(IN6_IS_ADDR_V4MAPPED)
#define USE_IPV6
#endif
#ifndef MAX
#define MAX(a,b) ((a) > (b) ? (a) : (b))
#endif
#ifndef MIN
#define MIN(a,b) ((a) < (b) ? (a) : (b))
#endif
#define NEW(t,n) ((t*) malloc( sizeof(t) * (n) ))
#define RENEW(o,t,n) ((t*) realloc( (void*) o, sizeof(t) * (n) ))
#define ol_strcpy(dst,src) memmove(dst,src,strlen(src)+1)
typedef union {
struct sockaddr sa;
struct sockaddr_in sa_in;
#ifdef USE_IPV6
struct sockaddr_in6 sa_in6;
struct sockaddr_storage sa_stor;
#endif
} httpd_sockaddr;
typedef struct {
char* binding_hostname;
char* server_hostname;
unsigned short port;
char* cgi_pattern;
int cgi_limit, cgi_count;
char* charset;
char* p3p;
int max_age;
char* cwd;
int listen4_fd, listen6_fd;
int no_log;
FILE* logfp;
int no_symlink_check;
int vhost;
int global_passwd;
char* url_pattern;
char* local_pattern;
int no_empty_referrers;
int do_list_dir;
char* index_name;
} httpd_server;
typedef struct {
int initialized;
httpd_server* hs;
httpd_sockaddr client_addr;
char* read_buf;
size_t read_size, read_idx, checked_idx;
int checked_state;
int method;
int status;
off_t bytes_to_send;
off_t bytes_sent;
char* encodedurl;
char* decodedurl;
char* protocol;
char* origfilename;
char* expnfilename;
char* encodings;
char* pathinfo;
char* query;
char* referrer;
char* useragent;
char* accept;
char* accepte;
char* acceptl;
char* cookie;
char* contenttype;
char* reqhost;
char* hdrhost;
char* hostdir;
char* authorization;
char* remoteuser;
char* response;
size_t maxdecodedurl, maxorigfilename, maxexpnfilename, maxencodings,
maxpathinfo, maxquery, maxaccept, maxaccepte, maxreqhost, maxhostdir,
maxremoteuser, maxresponse;
#ifdef TILDE_MAP_2
char* altdir;
size_t maxaltdir;
#endif
size_t responselen;
time_t if_modified_since, range_if;
size_t contentlength;
char* type;
char* hostname;
int mime_flag;
int one_one;
int got_range;
int tildemapped;
off_t first_byte_index, last_byte_index;
int keep_alive;
int should_linger;
struct stat sb;
int conn_fd;
int processed_directory_index;
char* file_address;
} httpd_conn;
#define METHOD_UNKNOWN 0
#define METHOD_GET 1
#define METHOD_HEAD 2
#define METHOD_POST 3
#define METHOD_PUT 4
#define METHOD_DELETE 5
#define METHOD_TRACE 6
#define CHST_FIRSTWORD 0
#define CHST_FIRSTWS 1
#define CHST_SECONDWORD 2
#define CHST_SECONDWS 3
#define CHST_THIRDWORD 4
#define CHST_THIRDWS 5
#define CHST_LINE 6
#define CHST_LF 7
#define CHST_CR 8
#define CHST_CRLF 9
#define CHST_CRLFCR 10
#define CHST_BOGUS 11
#ifdef __cplusplus
extern "C" {
#endif
extern httpd_server* httpd_initialize(
char* hostname, httpd_sockaddr* sa4P, httpd_sockaddr* sa6P,
unsigned short port, char* cgi_pattern, int cgi_limit, char* charset,
char* p3p, int max_age, char* cwd, int no_log, FILE* logfp,
int no_symlink_check, int vhost, int global_passwd, char* url_pattern,
char* local_pattern, int no_empty_referrers );
extern int httpd_initialize_listen_socket( httpd_sockaddr* saP );
extern void httpd_set_logfp( httpd_server* hs, FILE* logfp );
extern void httpd_unlisten( httpd_server* hs );
extern void httpd_terminate( httpd_server* hs );
extern int httpd_get_conn( httpd_server* hs, int listen_fd, httpd_conn* hc );
#define GC_FAIL 0
#define GC_OK 1
#define GC_NO_MORE 2
extern int httpd_got_request( httpd_conn* hc );
#define GR_NO_REQUEST 0
#define GR_GOT_REQUEST 1
#define GR_BAD_REQUEST 2
extern int httpd_parse_request( httpd_conn* hc );
extern int httpd_start_request( httpd_conn* hc, struct timeval* nowP );
extern void httpd_write_response( httpd_conn* hc );
extern void httpd_close_conn( httpd_conn* hc, struct timeval* nowP );
extern void httpd_destroy_conn( httpd_conn* hc );
extern void httpd_send_err(
httpd_conn* hc, int status, char* title, char* extraheads, char* form,
char* arg );
extern char* httpd_err400title;
extern char* httpd_err400form;
extern char* httpd_err408title;
extern char* httpd_err408form;
extern char* httpd_err503title;
extern char* httpd_err503form;
extern char* httpd_method_str( int method );
extern void httpd_realloc_str( char** strP, size_t* maxsizeP, size_t size );
extern char* httpd_ntoa( httpd_sockaddr* saP );
extern void httpd_set_ndelay( int fd );
extern void httpd_clear_ndelay( int fd );
extern int httpd_read_fully( int fd, void* buf, size_t nbytes );
extern int httpd_write_fully( int fd, const char* buf, size_t nbytes );
extern void httpd_logstats( long secs );
#ifdef __cplusplus
}
#endif
#endif