aboutsummaryrefslogtreecommitdiff
path: root/http.h
diff options
context:
space:
mode:
authorXavier Del Campo Romero <xavi.dcr@tutanota.com>2023-01-09 01:22:54 +0100
committerXavier Del Campo Romero <xavi.dcr@tutanota.com>2023-02-28 01:43:56 +0100
commitd26f046fc9149693a6ebc28301ccc3581c0f144e (patch)
tree9da22edd4840304d6cd19a27efab58ce245985aa /http.h
downloadslcl-d26f046fc9149693a6ebc28301ccc3581c0f144e.tar.gz
Initial commit
Diffstat (limited to 'http.h')
-rw-r--r--http.h96
1 files changed, 96 insertions, 0 deletions
diff --git a/http.h b/http.h
new file mode 100644
index 0000000..3390e49
--- /dev/null
+++ b/http.h
@@ -0,0 +1,96 @@
+#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;
+};
+
+#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(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);
+ 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);
+
+#endif /* HTTP_H */