From 15f400f3760659edd334c358679955503829f7d1 Mon Sep 17 00:00:00 2001
From: Lorenz Stechauner <lorenz.stechauner@necronda.net>
Date: Thu, 12 Jan 2023 10:22:27 +0100
Subject: [PATCH] Add status_code_t in http.h

---
 Makefile                     |  2 +-
 src/lib/http.c               | 51 ++++++++++++++++--------------------
 src/lib/http.h               | 16 ++++++-----
 src/worker/request_handler.c |  6 ++---
 4 files changed, 35 insertions(+), 40 deletions(-)

diff --git a/Makefile b/Makefile
index 74fc972..7bf026b 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
 
 CC=gcc
-CFLAGS=-std=gnu11 -Wno-unused-but-set-variable -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -D_POSIX_C_SOURCE=200809L
+CFLAGS=-std=gnu11 -Wno-unused-but-set-variable -D_DEFAULT_SOURCE -D_GNU_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -D_POSIX_C_SOURCE=200809L
 LDFLAGS=-pthread -lssl -lcrypto -lmagic -lz -lmaxminddb -lbrotlienc
 
 DEBIAN_OPTS=-D CACHE_MAGIC_FILE="\"/usr/share/file/magic.mgc\"" -D PHP_FPM_SOCKET="\"/var/run/php/php7.4-fpm.sock\""
diff --git a/src/lib/http.c b/src/lib/http.c
index 883f662..085117f 100644
--- a/src/lib/http.c
+++ b/src/lib/http.c
@@ -349,7 +349,7 @@ int http_send_request(sock *server, http_req *req) {
     return 0;
 }
 
-const http_status *http_get_status(unsigned short status_code) {
+const http_status *http_get_status(status_code_t status_code) {
     for (int i = 0; i < http_statuses_size; i++) {
         if (http_statuses[i].code == status_code) {
             return &http_statuses[i];
@@ -358,30 +358,25 @@ const http_status *http_get_status(unsigned short status_code) {
     return NULL;
 }
 
-const http_status_msg *http_get_error_msg(const http_status *status) {
-    unsigned short code = status->code;
+const http_status_msg *http_get_error_msg(status_code_t status_code) {
     for (int i = 0; i < http_status_messages_size; i++) {
-        if (http_status_messages[i].code == code) {
+        if (http_status_messages[i].code == status_code) {
             return &http_status_messages[i];
         }
     }
     return NULL;
 }
 
-const char *http_get_status_color(const http_status *status) {
-    unsigned short code = status->code;
-    if (code >= 100 && code < 200) {
-        return HTTP_1XX_STR;
-    } else if ((code >= 200 && code < 300) || code == 304) {
-        return HTTP_2XX_STR;
-    } else if (code >= 300 && code < 400) {
-        return HTTP_3XX_STR;
-    } else if (code >= 400 && code < 500) {
-        return HTTP_4XX_STR;
-    } else if (code >= 500 && code < 600) {
-        return HTTP_5XX_STR;
+const char *http_get_status_color(status_code_t status_code) {
+    if (status_code == 304) return HTTP_2XX_STR;
+    switch (status_code / 100) {
+        case 1: return HTTP_1XX_STR;
+        case 2: return HTTP_2XX_STR;
+        case 3: return HTTP_3XX_STR;
+        case 4: return HTTP_4XX_STR;
+        case 5: return HTTP_5XX_STR;
+        default: return "";
     }
-    return "";
 }
 
 char *http_format_date(time_t time, char *buf, size_t size) {
@@ -396,24 +391,22 @@ char *http_get_date(char *buf, size_t size) {
     return http_format_date(raw_time, buf, size);
 }
 
-const http_doc_info *http_get_status_info(const http_status *status) {
-    unsigned short code = status->code;
-    static http_doc_info info[] = {
+const http_doc_info *http_get_status_info(status_code_t status_code) {
+    static const http_doc_info info[] = {
             {"info",    HTTP_COLOR_INFO,    "/.sesimos/res/icon-info.svg",    http_info_doc},
             {"success", HTTP_COLOR_SUCCESS, "/.sesimos/res/icon-success.svg", http_success_doc},
             {"warning", HTTP_COLOR_WARNING, "/.sesimos/res/icon-warning.svg", http_warning_doc},
             {"error",   HTTP_COLOR_ERROR,   "/.sesimos/res/icon-error.svg",   http_error_doc}
     };
-    if (code >= 100 && code < 200) {
-        return &info[0];
-    } else if ((code >= 200 && code < 300) || code == 304) {
-        return &info[1];
-    } else if (code >= 300 && code < 400) {
-        return &info[2];
-    } else if (code >= 400 && code < 600) {
-        return &info[3];
+    if (status_code == 304) return &info[1];
+    switch (status_code / 100) {
+        case 1: return &info[0];
+        case 2: return &info[1];
+        case 3: return &info[2];
+        case 4: // see case 5
+        case 5: return &info[3];
+        default: return NULL;
     }
-    return NULL;
 }
 
 int http_get_compression(const http_req *req, const http_res *res) {
diff --git a/src/lib/http.h b/src/lib/http.h
index 813fbbb..9befbb7 100644
--- a/src/lib/http.h
+++ b/src/lib/http.h
@@ -61,14 +61,16 @@
 #   define SERVER_STR_HTML "sesimos&nbsp;web&nbsp;server"
 #endif
 
+typedef unsigned short status_code_t;
+
 typedef struct {
-    unsigned short code:10;
+    status_code_t code:10;
     unsigned char type:3;
     char msg[64];
 } http_status;
 
 typedef struct {
-    unsigned short code:10;
+    status_code_t code:10;
     const char *msg;
 } http_status_msg;
 
@@ -120,7 +122,7 @@ typedef enum {
 } http_error_origin;
 
 typedef struct {
-    unsigned short status;
+    status_code_t status;
     http_error_origin origin;
     const char* ws_key;
 } http_status_ctx;
@@ -170,17 +172,17 @@ int http_send_response(sock *client, http_res *res);
 
 int http_send_request(sock *server, http_req *req);
 
-const http_status *http_get_status(unsigned short status_code);
+const http_status *http_get_status(status_code_t status_code);
 
-const http_status_msg *http_get_error_msg(const http_status *status);
+const http_status_msg *http_get_error_msg(status_code_t status_code);
 
-const char *http_get_status_color(const http_status *status);
+const char *http_get_status_color(status_code_t status_code);
 
 char *http_format_date(time_t time, char *buf, size_t size);
 
 char *http_get_date(char *buf, size_t size);
 
-const http_doc_info *http_get_status_info(const http_status *status);
+const http_doc_info *http_get_status_info(status_code_t status_code);
 
 int http_get_compression(const http_req *req, const http_res *res);
 
diff --git a/src/worker/request_handler.c b/src/worker/request_handler.c
index 1cc8581..e3568fb 100644
--- a/src/worker/request_handler.c
+++ b/src/worker/request_handler.c
@@ -259,8 +259,8 @@ int respond(client_ctx_t *ctx) {
             http_add_header_field(&res->hdr, "Content-Type", "text/html; charset=UTF-8");
 
             // TODO list Locations on 3xx Redirects
-            const http_doc_info *http_info = http_get_status_info(res->status);
-            const http_status_msg *http_msg = http_get_error_msg(res->status);
+            const http_doc_info *http_info = http_get_status_info(res->status->code);
+            const http_status_msg *http_msg = http_get_error_msg(res->status->code);
 
             if (ctx->msg_content[0] == 0) {
                 if (res->status->code >= 300 && res->status->code < 400) {
@@ -329,7 +329,7 @@ int respond(client_ctx_t *ctx) {
     http_send_response(client, res);
     ctx->res_ts = clock_micros();
     const char *location = http_get_header_field(&res->hdr, "Location");
-    info("%s%s%03i %s%s%s (%s)%s", http_get_status_color(res->status), ctx->use_proxy ? "-> " : "", res->status->code,
+    info("%s%s%03i %s%s%s (%s)%s", http_get_status_color(res->status->code), ctx->use_proxy ? "-> " : "", res->status->code,
          res->status->msg, location != NULL ? " -> " : "", location != NULL ? location : "",
          format_duration(ctx->res_ts - ctx->req_s, buf0), CLR_STR);