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:
| M | http.c | | | 16 | +++++++++++++--- |
| M | utils/html.c | | | 56 | +++++++++++++++++--------------------------------------- |
| A | utils/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