|  | #include <u.h> #include <libc.h>
 #include <httpd.h>
 
 
    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;
 typedef struct Bin Bin;
 struct Htmlesc
 {
 };
 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;
 
 | 
 | 
 /*
 
 struct HFields|  |  |  | * generic http header with a list of tokens, * each with an optional list of parameters
 */
 
 | 
 {
 
 };|  |  |  | |  |  |  | char          *s; HSPairs       *params;
 HFields       *next;
 
 | 
 | 
 /*
 
 struct HSPairs|  |  |  | * list of pairs a strings * used for tag=val pairs for a search or form submission,
 * and attribute=value pairs in headers.
 */
 
 | 
 {
 
 };|  |  |  | |  |  |  | char          *s; char          *t;
 HSPairs       *next;
 
 | 
 | 
 /*
 
 struct HRange|  |  |  | * byte ranges within a file */
 
 | 
 {
 
 };|  |  |  | |  |  |  | int           suffix;                 /* is this a suffix request? */ ulong         start;
 ulong         stop;                   /* ~0UL –> not given */
 HRange        *next;
 
 | 
 | 
 /*
 
 struct HETag|  |  |  | * list of http/1.1 entity tags */
 
 | 
 {
 
 };|  |  |  | |  |  |  | char          *etag; int           weak;
 HETag         *next;
 
 | 
 | 
 /*
 
 enum|  |  |  | * HTTP custom IO * supports chunked transfer encoding
 * and initialization of the input buffer from a string.
 */
 
 | 
 {
 
 };|  |  |  | |  |  |  | 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];
 
 | 
 | 
 /*
 struct HttpReq
 {
 
 };|  |  |  | |  |  |  | char          *meth; char          *uri;
 char          *urihost;
 char          *search;
 int           vermaj;
 int           vermin;
 
 | 
 | 
 /*
 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;
 
 | 
 | 
 /*
 
 struct HConnect|  |  |  | * all of the state for a particular connection */
 
 | 
 {
 
 };|  |  |  | |  |  |  | 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;
 
 | 
 | 
 /*
 
 extern      char          *hmydomain;|  |  |  | * configuration for all connections within the server */
 
 | 
 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);
 
 |