307 lines · 5.8 KB · Text
RawDownload
.TH HTTPD 2.SH NAMEHConnect,HContent,HContents,HETag,HFields,Hio,Htmlesc,HttpHead,HttpReq,HRange,HSPairs,hmydomain,hversion,htmlesc,halloc,hbodypush,hbuflen,hcheckcontent,hclose,hdate2sec,hdatefmt,hfail,hflush,hgetc,hgethead,hinit,hiserror,hload,hlower,hmkcontent,hmkhfields,hmkmimeboundary,hmkspairs,hmoved,hokheaders,hparseheaders,hparsequery,hparsereq,hprint,hputc,hreadbuf,hredirected,hreqcleanup,hrevhfields,hrevspairs,hstrdup,http11,httpfmt,httpunesc,hunallowed,hungetc,hunload,hurlfmt,hurlunesc,hvprint,hwrite,hxferenc, \- routines for creating an http server.SH SYNOPSIS.nf.B #include <u.h>.B #include <libc.h>.B #include <httpd.h>.PP.ft Ltypedef 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; typedef struct Bin Bin;.ta \w'\fLHContents 'u +\w'\fLHContentsxx 'u +\w'\fLheader[HBufSize + 2];  'u 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[]; 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	hvprint(Hio*, char*, va_list);int	hwrite(Hio*, void*, int);int	hxferenc(Hio*, int);.ft R.SH DESCRIPTIONFor now, look at the source, or.IR httpd (8)..SH SOURCE.B /sys/src/libhttpd.SH SEE ALSO.IR bin (2).SH BUGSThis is a rough implementation and many details are going to change.