From 4ee88984fcca86c5b0c9c4bbb7e9148c7d2fe9db Mon Sep 17 00:00:00 2001 From: Xavier Del Campo Romero Date: Sun, 6 Aug 2023 16:43:57 +0200 Subject: Add hello world example --- examples/hello/main.c | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 examples/hello/main.c (limited to 'examples/hello/main.c') diff --git a/examples/hello/main.c b/examples/hello/main.c new file mode 100644 index 0000000..f44ff0c --- /dev/null +++ b/examples/hello/main.c @@ -0,0 +1,101 @@ +#include +#include +#include +#include +#include +#include +#include + +static int hello(const struct http_payload *const pl, + struct http_response *const r, void *const user) +{ + int ret = -1; + struct html_node *html = html_node_alloc("html"), *body, *p; + struct dynstr d; + + dynstr_init(&d); + + if (!html) + { + fprintf(stderr, "%s: html_node_alloc failed\n", __func__); + goto end; + } + else if (!(body = html_node_add_child(html, "body"))) + { + fprintf(stderr, "%s: html_node_add_child body failed\n", __func__); + goto end; + } + else if (!(p = html_node_add_child(html, "p"))) + { + fprintf(stderr, "%s: html_node_add_child p failed\n", __func__); + goto end; + } + else if (html_node_set_value(p, "Hello from slweb!")) + { + fprintf(stderr, "%s: html_node_set_value p failed\n", __func__); + goto end; + } + else if (html_serialize(html, &d)) + { + fprintf(stderr, "%s: html_serialize failed\n", __func__); + goto end; + } + + *r = (const struct http_response) + { + .status = HTTP_STATUS_OK, + .buf.rw = d.str, + .n = d.len, + .free = free + }; + + if (http_response_add_header(r, "Content-Type", "text/html")) + { + fprintf(stderr, "%s: http_response_add_header failed\n", __func__); + goto end; + } + + ret = 0; + +end: + html_node_free(html); + + if (ret) + dynstr_free(&d); + + return ret; +} + +int main(int argc, char *argv[]) +{ + int ret = EXIT_FAILURE; + const short port = 8080; + const struct handler_cfg cfg = {0}; + struct handler *const h = handler_alloc(&cfg); + static const char *const urls[] = {"/", "/index.html"}; + + if (!h) + { + fprintf(stderr, "%s: handler_alloc failed\n", __func__); + goto end; + } + + for (size_t i = 0; i < sizeof urls / sizeof *urls; i++) + if (handler_add(h, urls[i], HTTP_OP_GET, hello, NULL)) + { + fprintf(stderr, "%s: handler_add failed\n", __func__); + goto end; + } + + if (handler_listen(h, port)) + { + fprintf(stderr, "%s: handler_listen failed\n", __func__); + goto end; + } + + ret = EXIT_SUCCESS; + +end: + handler_free(h); + return ret; +} -- cgit v1.2.3