aboutsummaryrefslogtreecommitdiff
path: root/include/httpd.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/httpd.h')
-rw-r--r--include/httpd.h280
1 files changed, 280 insertions, 0 deletions
diff --git a/include/httpd.h b/include/httpd.h
new file mode 100644
index 00000000..d75c5801
--- /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*
+*/