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 | |
| 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')
| -rw-r--r-- | include/slweb/handler.h | 24 | ||||
| -rw-r--r-- | include/slweb/html.h | 15 | ||||
| -rw-r--r-- | include/slweb/http.h | 106 | ||||
| -rw-r--r-- | include/slweb/server.h | 15 | ||||
| -rw-r--r-- | include/slweb/wildcard_cmp.h | 8 |
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 */ |
