diff options
| author | Xavier Del Campo Romero <xavi.dcr@tutanota.com> | 2023-07-20 23:47:33 +0200 |
|---|---|---|
| committer | Xavier Del Campo Romero <xavi.dcr@tutanota.com> | 2023-07-21 01:28:38 +0200 |
| commit | 8c3ba33ced08b211db0cd5f81675bdf62f55acc7 (patch) | |
| tree | 928ccf6a025db57c3a038a56a920735dccd286ff /include/slweb/http.h | |
| parent | 4dd531b9ed1923837da32d69fa1933ec9083f8db (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.h | 106 |
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 */ |
