bunkum

an old and silly c99 web server with some fun features
Log | Files | Refs | README

commit d1a5f8e0b9375add30c53d8732ffe708906dbd1e
parent b2f9d0eb77025c4b345878d67cfb043d661ec278
Author: quantumish <freifeld.david@gmail.com>
Date:   Sun, 23 Apr 2023 17:43:00 -0700

Switch `serve_error()` to use new HTML gen tools

Diffstat:
Mhttp.c | 16+++++++++++++---
Mutils/html.c | 56+++++++++++++++++---------------------------------------
Autils/html.h | 49+++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 79 insertions(+), 42 deletions(-)

diff --git a/http.c b/http.c @@ -31,8 +31,9 @@ #include "utils/time.h" #include "utils/shitvec.h" #include "utils/sync.h" - +#include "utils/html.h" #include "utils/compress.h" + #include "http/response.h" #include "http/request.h" @@ -40,8 +41,17 @@ response_t serve_error(enum StatusCode c) { response_t r = resp_new(c); resp_add_hdr(&r, "Content-Type", "text/html"); - char msg[32] = {0}; - sprintf(msg, "<h1>Error %d</h1>", c); + + char errt[256]; + sprintf(errt, "Error %d", c); + + html_t html = html_new(); + html_fc_t err = html_h1_new(errt); + html_fc_t desc = html_p_new("Hey! Don't do that."); + html_body_add(&html.body, &err); + html_body_add(&html.body, &desc); + char* msg = html_render(&html); + resp_add_content(&r, msg, strlen(msg)); return r; } diff --git a/utils/html.c b/utils/html.c @@ -1,42 +1,5 @@ +#include "html.h" #include "log.h" -#include "shitvec.h" - -enum html_fc_type { - HTML_A, - HTML_P, - HTML_BR, - HTML_H1, -}; - -typedef struct html_fc { - enum html_fc_type type; - union { - char* text; - struct { char* href; char* content; } a; - } value; -} html_fc_t; - -typedef struct title { - char* text; -} html_title_t; - -typedef struct base { - char* href; - char* target; -} html_base_t; - -typedef struct head { - shitvec_t meta; -} html_head_t; - -typedef struct body { - shitvec_t content; -} html_body_t; - -typedef struct html { - shitvec_t _buf; - html_body_t body; -} html_t; html_t html_new() { html_t out; @@ -54,8 +17,15 @@ html_fc_t html_p_new(char* content) { return out; } +html_fc_t html_h1_new(char* content) { + html_fc_t out; + out.type = HTML_H1; + out.value.text = content; + return out; +} + void html_body_add(html_body_t* body, html_fc_t* fc) { - shitvec_push(&body->content, &fc); + shitvec_push(&body->content, fc); } void c_sv_pushs(shitvec_t* sv, char* str) { @@ -75,10 +45,18 @@ char* html_render(html_t* html) { c_sv_pushs(&html->_buf, elem->value.text); c_sv_pushs(&html->_buf, "</p>"); break; + case HTML_H1: + c_sv_pushs(&html->_buf, "<h1>"); + c_sv_pushs(&html->_buf, elem->value.text); + c_sv_pushs(&html->_buf, "</h1>"); + break; default: log_error("Didn't handle rendering HTML element!"); } } c_sv_pushs(&html->_buf, "</body>"); c_sv_pushs(&html->_buf, "</html>"); + shitvec_push(&html->_buf, "\0"); + + return html->_buf.arr; } diff --git a/utils/html.h b/utils/html.h @@ -0,0 +1,49 @@ +#ifndef HTML_H +#define HTML_H + +#include "shitvec.h" + +enum html_fc_type { + HTML_A, + HTML_P, + HTML_BR, + HTML_H1, +}; + +typedef struct html_fc { + enum html_fc_type type; + union { + char* text; + struct { char* href; char* content; } a; + } value; +} html_fc_t; + +typedef struct title { + char* text; +} html_title_t; + +typedef struct base { + char* href; + char* target; +} html_base_t; + +typedef struct head { + shitvec_t meta; +} html_head_t; + +typedef struct body { + shitvec_t content; +} html_body_t; + +typedef struct html { + shitvec_t _buf; + html_body_t body; +} html_t; + +html_t html_new(); +html_fc_t html_p_new(char* content); +html_fc_t html_h1_new(char* content); +void html_body_add(html_body_t* body, html_fc_t* fc); +char* html_render(html_t* html); + +#endif