From 9270a0077ed0b78311db3267bdbc5fc2c0ac0ac4 Mon Sep 17 00:00:00 2001 From: default Date: Wed, 21 Sep 2022 19:28:30 +0200 Subject: [PATCH] Added a global server handler. --- Makefile | 2 +- httpd.c | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 116 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 2a47479..c09d3f6 100644 --- a/Makefile +++ b/Makefile @@ -20,4 +20,4 @@ data.o: data.c snac.h xs.h xs_json.h xs_openssl.h http.o: http.c snac.h xs.h xs_io.h xs_encdec.h xs_openssl.h xs_curl.h -httpd.o: http.c snac.h xs.h xs_encdec.h xs_socket.h xs_httpd.h +httpd.o: http.c snac.h xs.h xs_io.h xs_encdec.h xs_socket.h xs_httpd.h diff --git a/httpd.c b/httpd.c index 5fd8bbf..3047b3e 100644 --- a/httpd.c +++ b/httpd.c @@ -2,6 +2,7 @@ /* copyright (c) 2022 grunfink - MIT license */ #include "xs.h" +#include "xs_io.h" #include "xs_encdec.h" #include "xs_json.h" #include "xs_socket.h" @@ -10,11 +11,80 @@ #include "snac.h" +void server_get_handler(d_char *req, int *status, char **body, int *b_size, char **ctype) +/* basic server services */ +{ + char *req_hdrs = xs_dict_get(req, "headers"); + char *acpt = xs_dict_get(req_hdrs, "accept"); + char *q_path = xs_dict_get(req_hdrs, "path"); + + if (acpt == NULL) { + *status = 400; + return; + } + + /* get the server prefix */ + char *prefix = xs_dict_get(srv_config, "prefix"); + if (*prefix == '\0') + prefix = "/"; + + /* is it the server root? */ + if (strcmp(q_path, prefix) == 0) { + /* try to open greeting.html */ + xs *fn = xs_fmt("%s/greeting.html", srv_basedir); + FILE *f; + + if ((f = fopen(fn, "r")) != NULL) { + d_char *s = xs_readall(f); + fclose(f); + + *status = 200; + + /* does it have a %userlist% mark? */ + if (xs_str_in(s, "%userlist%") != -1) { + char *host = xs_dict_get(srv_config, "host"); + xs *list = user_list(); + char *p, *uid; + xs *ul = xs_str_new("\n"); + + s = xs_replace(s, "%userlist%", ul); + } + + *body = s; + } + } +} + void httpd_connection(int rs) /* the connection loop */ { FILE *f; xs *req; + char *req_hdrs; + char *method; + int status = 0; + char *body = NULL; + int b_size = 0; + char *ctype = NULL; + xs *headers = NULL; f = xs_socket_accept(rs); @@ -25,7 +95,52 @@ void httpd_connection(int rs) printf("%s\n", j); } + req_hdrs = xs_dict_get(req, "headers"); + + method = xs_dict_get(req_hdrs, "method"); + + if (strcmp(method, "GET") == 0) { + /* cascade through */ + if (status == 0) + server_get_handler(req, &status, &body, &b_size, &ctype); + } + else + if (strcmp(method, "POST") == 0) { + } + + /* let's go */ + headers = xs_dict_new(); + + /* unattended? it's an error */ + if (status == 0) + status = 404; + + if (status == 404) + body = "

404 Not Found

"; + + if (status == 400) + body = "

400 Bad Request

"; + + if (status == 303) + headers = xs_dict_append(headers, "location", body); + + if (status == 401) + headers = xs_dict_append(headers, "WWW-Authenticate", "Basic realm=\"IDENTIFY\""); + + if (ctype == NULL) + ctype = "text/html; charset=utf-8"; + + headers = xs_dict_append(headers, "content-type", ctype); + headers = xs_dict_append(headers, "x-creator", "snac/2.x"); + + if (b_size == 0 && body != NULL) + b_size = strlen(body); + + xs_httpd_response(f, status, headers, body, b_size); + fclose(f); + + free(body); }