#ifndef _HTTPD_H_
#define _HTTPD_H_ 1
#if defined(__cplusplus)
extern "C" { 
#endif
/*
#pragma	lib	"libhttpd.a"
#pragma	src	"/sys/src/libhttpd"
*/

typedef struct HConnect		HConnect;
typedef struct HContent		HContent;
typedef struct HContents	HContents;
typedef struct HETag		HETag;
typedef struct HFields		HFields;
typedef struct Hio		Hio;
typedef struct Htmlesc		Htmlesc;
typedef struct HttpHead		HttpHead;
typedef struct HttpReq		HttpReq;
typedef struct HRange		HRange;
typedef struct HSPairs		HSPairs;

#ifndef _HAVE_BIN
typedef struct Bin		Bin;
#define _HAVE_BIN
#endif

enum
{
	HMaxWord	= 32*1024,
	HBufSize	= 32*1024,

	/*
	 * error messages
	 */
	HInternal	= 0,
	HTempFail,
	HUnimp,
	HBadReq,
	HBadSearch,
	HNotFound,
	HUnauth,
	HSyntax,
	HNoSearch,
	HNoData,
	HExpectFail,
	HUnkVers,
	HBadCont,
	HOK,
};

/*
 * table of html character escape codes
 */
struct Htmlesc
{
	char		*name;
	Rune		value;
};

struct HContent
{
	HContent	*next;
	char		*generic;
	char		*specific;
	float		q;			/* desirability of this kind of file */
	int		mxb;			/* max uchars until worthless */
};

struct HContents
{
	HContent	*type;
	HContent	 *encoding;
};

/*
 * generic http header with a list of tokens,
 * each with an optional list of parameters
 */
struct HFields
{
	char		*s;
	HSPairs		*params;
	HFields		*next;
};

/*
 * list of pairs a strings
 * used for tag=val pairs for a search or form submission,
 * and attribute=value pairs in headers.
 */
struct HSPairs
{
	char		*s;
	char		*t;
	HSPairs		*next;
};

/*
 * byte ranges within a file
 */
struct HRange
{
	int		suffix;			/* is this a suffix request? */
	ulong		start;
	ulong		stop;			/* ~0UL -> not given */
	HRange		*next;
};

/*
 * list of http/1.1 entity tags
 */
struct HETag
{
	char		*etag;
	int		weak;
	HETag		*next;
};

/*
 * HTTP custom IO
 * supports chunked transfer encoding
 * and initialization of the input buffer from a string.
 */
enum
{
	Hnone,
	Hread,
	Hend,
	Hwrite,
	Herr,

	Hsize = HBufSize
};

struct Hio {
	Hio		*hh;			/* next lower layer Hio, or nil if reads from fd */
	int		fd;			/* associated file descriptor */
	ulong		seek;			/* of start */
	uchar		state;			/* state of the file */
	uchar		xferenc;		/* chunked transfer encoding state */
	uchar		*pos;			/* current position in the buffer */
	uchar		*stop;			/* last character active in the buffer */
	uchar		*start;			/* start of data buffer */
	ulong		bodylen;		/* remaining length of message body */
	uchar		buf[Hsize+32];
};

/*
 * request line
 */
struct HttpReq
{
	char		*meth;
	char		*uri;
	char		*urihost;
	char		*search;
	int		vermaj;
	int		vermin;
};

/*
 * header lines
 */
struct HttpHead
{
	int		closeit;		/* http1.1 close connection after this request? */
	uchar		persist;		/* http/1.1 requests a persistent connection */

	uchar		expectcont;		/* expect a 100-continue */
	uchar		expectother;		/* expect anything else; should reject with ExpectFail */
	ulong		contlen;		/* if != ~0UL, length of included message body */
	HFields		*transenc;		/* if present, encoding of included message body */
	char		*client;
	char		*host;
	HContent	*okencode;
	HContent	*oklang;
	HContent	*oktype;
	HContent	*okchar;
	ulong		ifmodsince;
	ulong		ifunmodsince;
	ulong		ifrangedate;
	HETag		*ifmatch;
	HETag		*ifnomatch;
	HETag		*ifrangeetag;
	HRange		*range;
	char		*authuser;		/* authorization info */
	char		*authpass;

	/*
	 * experimental headers
	 */
	int		fresh_thresh;
	int		fresh_have;
};

/*
 * all of the state for a particular connection
 */
struct HConnect
{
	void		*private;		/* for the library clients */
	void		(*replog)(HConnect*, char*, ...);	/* called when reply sent */

	HttpReq		req;
	HttpHead	head;

	Bin		*bin;

	ulong		reqtime;		/* time at start of request */
	char		xferbuf[HBufSize];	/* buffer for making up or transferring data */
	uchar		header[HBufSize + 2];	/* room for \n\0 */
	uchar		*hpos;
	uchar		*hstop;
	Hio		hin;
	Hio		hout;
};

/*
 * configuration for all connections within the server
 */
extern	char*		hmydomain;
extern	char*		hversion;
extern	Htmlesc		htmlesc[];

/*
 * .+2,/^$/ | sort -bd +1
 */
void			*halloc(HConnect *c, ulong size);
Hio			*hbodypush(Hio *hh, ulong len, HFields *te);
int			hbuflen(Hio *h, void *p);
int			hcheckcontent(HContent*, HContent*, char*, int);
void			hclose(Hio*);
ulong			hdate2sec(char*);
int			hdatefmt(Fmt*);
int			hfail(HConnect*, int, ...);
int			hflush(Hio*);
int			hgetc(Hio*);
int			hgethead(HConnect *c, int many);
int			hinit(Hio*, int, int);
int			hiserror(Hio *h);
int			hload(Hio*, char*);
char			*hlower(char*);
HContent		*hmkcontent(HConnect *c, char *generic, char *specific, HContent *next);
HFields			*hmkhfields(HConnect *c, char *s, HSPairs *p, HFields *next);
char			*hmkmimeboundary(HConnect *c);
HSPairs			*hmkspairs(HConnect *c, char *s, char *t, HSPairs *next);
int			hmoved(HConnect *c, char *uri);
void			hokheaders(HConnect *c);
int			hparseheaders(HConnect*, int timeout);
HSPairs			*hparsequery(HConnect *c, char *search);
int			hparsereq(HConnect *c, int timeout);
int			hprint(Hio*, char*, ...);
int			hputc(Hio*, int);
void			*hreadbuf(Hio *h, void *vsave);
int			hredirected(HConnect *c, char *how, char *uri);
void			hreqcleanup(HConnect *c);
HFields			*hrevhfields(HFields *hf);
HSPairs			*hrevspairs(HSPairs *sp);
char			*hstrdup(HConnect *c, char *s);
int			http11(HConnect*);
int			httpfmt(Fmt*);
char			*httpunesc(HConnect *c, char *s);
int			hunallowed(HConnect *, char *allowed);
int			hungetc(Hio *h);
char			*hunload(Hio*);
int			hurlfmt(Fmt*);
char			*hurlunesc(HConnect *c, char *s);
int			hwrite(Hio*, void*, int);
int			hxferenc(Hio*, int);

/*
#pragma			varargck	argpos	hprint	2
*/
/*
 * D is httpd format date conversion
 * U is url escape convertsion
 * H is html escape conversion
 */
/*
#pragma	varargck	type	"D"	long
#pragma	varargck	type	"D"	ulong
#pragma	varargck	type	"U"	char*
#pragma	varargck	type	"H"	char*
*/

#if defined(__cplusplus)
}
#endif
#endif
