#ifndef _HTTPD_H_
#define _HTTPD_H_ 1
#if defined(__cplusplus)
extern "C" { 
#endif

AUTOLIB(httpd)
/*
#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			hlflush(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
