aboutsummaryrefslogtreecommitdiff
path: root/include/slweb/http.h
diff options
context:
space:
mode:
authorXavier Del Campo Romero <xavi.dcr@tutanota.com>2023-07-20 23:47:33 +0200
committerXavier Del Campo Romero <xavi.dcr@tutanota.com>2023-07-21 01:28:38 +0200
commit8c3ba33ced08b211db0cd5f81675bdf62f55acc7 (patch)
tree928ccf6a025db57c3a038a56a920735dccd286ff /include/slweb/http.h
parent4dd531b9ed1923837da32d69fa1933ec9083f8db (diff)
Move header files to subdirectory
Since slweb is meant as a library, it is advisable to keep public header files under their own directory in order to avoid name clashing i.e., #include "something.h" Now becomes: #include "slweb/something.h"
Diffstat (limited to 'include/slweb/http.h')
-rw-r--r--include/slweb/http.h106
1 files changed, 106 insertions, 0 deletions
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 */