aboutsummaryrefslogtreecommitdiff
path: root/include/slweb
diff options
context:
space:
mode:
Diffstat (limited to 'include/slweb')
-rw-r--r--include/slweb/handler.h24
-rw-r--r--include/slweb/html.h15
-rw-r--r--include/slweb/http.h106
-rw-r--r--include/slweb/server.h15
-rw-r--r--include/slweb/wildcard_cmp.h8
5 files changed, 168 insertions, 0 deletions
diff --git a/include/slweb/handler.h b/include/slweb/handler.h
new file mode 100644
index 0000000..4ac7f76
--- /dev/null
+++ b/include/slweb/handler.h
@@ -0,0 +1,24 @@
+#ifndef HANDLER_H
+#define HANDLER_H
+
+#include "slweb/http.h"
+#include <stddef.h>
+
+typedef int (*handler_fn)(const struct http_payload *p,
+ struct http_response *r, void *user);
+
+struct handler_cfg
+{
+ const char *tmpdir;
+ int (*length)(unsigned long long len, const struct http_cookie *c,
+ struct http_response *r, void *user);
+ void *user;
+};
+
+struct handler *handler_alloc(const struct handler_cfg *cfg);
+void handler_free(struct handler *h);
+int handler_add(struct handler *h, const char *url, enum http_op op,
+ handler_fn f, void *user);
+int handler_listen(struct handler *h, short port);
+
+#endif /* HANDLER_H */
diff --git a/include/slweb/html.h b/include/slweb/html.h
new file mode 100644
index 0000000..e62575e
--- /dev/null
+++ b/include/slweb/html.h
@@ -0,0 +1,15 @@
+#ifndef HTML_H
+#define HTML_H
+
+#include <dynstr.h>
+
+struct html_node *html_node_alloc(const char *element);
+void html_node_free(struct html_node *n);
+int html_node_set_value(struct html_node *n, const char *val);
+int html_node_set_value_unescaped(struct html_node *n, const char *val);
+int html_node_add_attr(struct html_node *n, const char *attr, const char *val);
+struct html_node *html_node_add_child(struct html_node *n, const char *elem);
+void html_node_add_sibling(struct html_node *n, struct html_node *sibling);
+int html_serialize(const struct html_node *n, struct dynstr *d);
+
+#endif /* HTML_H */
diff --git a/include/slweb/http.h b/include/slweb/http.h
new file mode 100644
index 0000000..ac1f51a
--- /dev/null
+++ b/include/slweb/http.h
@@ -0,0 +1,106 @@
+#ifndef HTTP_H
+#define HTTP_H
+
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdio.h>
+
+struct http_payload
+{
+ enum http_op
+ {
+ HTTP_OP_GET,
+ HTTP_OP_POST
+ } op;
+
+ const char *resource;
+
+ struct http_cookie
+ {
+ const char *field, *value;
+ } cookie;
+
+ union
+ {
+ struct http_post
+ {
+ bool expect_continue;
+ const void *data;
+ size_t n;
+ const char *dir;
+
+ const struct http_post_file
+ {
+ const char *tmpname, *filename;
+ } *files;
+ } post;
+ } u;
+
+ const struct http_arg
+ {
+ char *key, *value;
+ } *args;
+
+ size_t n_args;
+};
+
+#define HTTP_STATUSES \
+ X(CONTINUE, "Continue", 100) \
+ X(OK, "OK", 200) \
+ X(SEE_OTHER, "See other", 303) \
+ X(BAD_REQUEST, "Bad Request", 400) \
+ X(UNAUTHORIZED, "Unauthorized", 401) \
+ X(FORBIDDEN, "Forbidden", 403) \
+ X(NOT_FOUND, "Not found", 404) \
+ X(PAYLOAD_TOO_LARGE, "Payload too large", 413) \
+ X(INTERNAL_ERROR, "Internal Server Error", 500)
+
+struct http_response
+{
+ enum http_status
+ {
+#define X(x, y, z) HTTP_STATUS_##x,
+ HTTP_STATUSES
+#undef X
+ } status;
+
+ struct http_header
+ {
+ char *header, *value;
+ } *headers;
+
+ union
+ {
+ const void *ro;
+ void *rw;
+ } buf;
+
+ FILE *f;
+ unsigned long long n;
+ size_t n_headers;
+ void (*free)(void *);
+};
+
+struct http_cfg
+{
+ int (*read)(void *buf , size_t n, void *user);
+ int (*write)(const void *buf, size_t n, void *user);
+ int (*payload)(const struct http_payload *p, struct http_response *r,
+ void *user);
+ int (*length)(unsigned long long len, const struct http_cookie *c,
+ struct http_response *r, void *user);
+ const char *tmpdir;
+ void *user;
+};
+
+struct http_ctx *http_alloc(const struct http_cfg *cfg);
+void http_free(struct http_ctx *h);
+/* Positive return value: user input error, negative: fatal error. */
+int http_update(struct http_ctx *h, bool *write, bool *close);
+int http_response_add_header(struct http_response *r, const char *header,
+ const char *value);
+char *http_cookie_create(const char *key, const char *value);
+char *http_encode_url(const char *url);
+char *http_decode_url(const char *url, bool spaces);
+
+#endif /* HTTP_H */
diff --git a/include/slweb/server.h b/include/slweb/server.h
new file mode 100644
index 0000000..74f06ae
--- /dev/null
+++ b/include/slweb/server.h
@@ -0,0 +1,15 @@
+#ifndef SERVER_H
+#define SERVER_H
+
+#include <stdbool.h>
+#include <stddef.h>
+
+struct server *server_init(unsigned short port);
+struct server_client *server_poll(struct server *s, bool *io, bool *exit);
+int server_read(void *buf, size_t n, struct server_client *c);
+int server_write(const void *buf, size_t n, struct server_client *c);
+int server_close(struct server *s);
+int server_client_close(struct server *s, struct server_client *c);
+void server_client_write_pending(struct server_client *c, bool write);
+
+#endif /* SERVER_H */
diff --git a/include/slweb/wildcard_cmp.h b/include/slweb/wildcard_cmp.h
new file mode 100644
index 0000000..fa09913
--- /dev/null
+++ b/include/slweb/wildcard_cmp.h
@@ -0,0 +1,8 @@
+#ifndef WILDCARD_CMP_H
+#define WILDCARD_CMP_H
+
+#include <stdbool.h>
+
+int wildcard_cmp(const char *s, const char *p, bool casecmp);
+
+#endif /* WILDCARD_CMP_H */