new files
diff --git a/include/httpd.h b/include/httpd.h
new file mode 100644
index 0000000..d75c580
--- /dev/null
+++ b/include/httpd.h
@@ -0,0 +1,280 @@
+/*
+#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*
+*/