From 291d55642d7aa574b28c764c1e6749275ce1be2f Mon Sep 17 00:00:00 2001 From: Michael Thomson Date: Fri, 13 Sep 2024 08:22:21 -0700 Subject: [PATCH] big update: simplifying + pandoc --- Makefile | 4 +- content/post.md | 20 ++++ flake.nix | 2 + header.c | 9 -- header.h | 11 --- main.c | 12 +-- public/.DS_Store | Bin 0 -> 6148 bytes public/clicked.html | 1 - public/favicon.ico | Bin 0 -> 15406 bytes public/index.css | 10 ++ public/index.html | 10 +- public/post.html | 31 +++++++ request.c | 31 ++----- request.h | 5 - response.c | 35 +------ response.h | 13 +-- route.c | 12 --- route.h | 17 ---- server | Bin 55048 -> 0 bytes server.c | 217 ++++++++++++++++++++++---------------------- server.h | 15 +-- templates/post.html | 38 ++++++++ utils.c | 25 ----- utils.h | 7 -- 24 files changed, 228 insertions(+), 297 deletions(-) create mode 100644 content/post.md delete mode 100644 header.c delete mode 100644 header.h create mode 100644 public/.DS_Store delete mode 100644 public/clicked.html create mode 100644 public/favicon.ico create mode 100644 public/index.css create mode 100644 public/post.html delete mode 100644 route.c delete mode 100644 route.h delete mode 100755 server create mode 100644 templates/post.html delete mode 100644 utils.c delete mode 100644 utils.h diff --git a/Makefile b/Makefile index 7fa9ed9..2d37d01 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ # ----- Variables for customization ----- CC = gcc # Compiler (you can change to clang if desired) -CFLAGS = -g2 -Wall -Wextra #-fsanitize=address # Standard flags + debugging & warnings +CFLAGS = -g2 -Wall -Wextra #-fsanitize=address,undefined # Standard flags + debugging & warnings LDFLAGS = # Linker flags, if any # ----- Automatic dependency tracking ----- @@ -19,4 +19,4 @@ server: $(OBJS) # Phony target for cleaning .PHONY: clean clean: - rm -f $(OBJS) + rm -f $(OBJS) server diff --git a/content/post.md b/content/post.md new file mode 100644 index 0000000..c12ab36 --- /dev/null +++ b/content/post.md @@ -0,0 +1,20 @@ +--- +title: Hello, World! +author: Michael +date: 2024-09-13 +abstract: This is my first post +--- + +this is a test +- oh yeah + +this is a quote: + +> sdfdsfsdfdsfdsfdsfds +> sfdsfdsfsfdsfds +```c +int main() +{ + return 0; +} +``` diff --git a/flake.nix b/flake.nix index 7b99041..a5c06a1 100644 --- a/flake.nix +++ b/flake.nix @@ -30,7 +30,9 @@ vcpkg vcpkg-tool ccls + man-pages bear + pandoc ] ++ (if system == "aarch64-darwin" then [ ] else [ gdb ]); }; }); diff --git a/header.c b/header.c deleted file mode 100644 index deec1d2..0000000 --- a/header.c +++ /dev/null @@ -1,9 +0,0 @@ -#include "header.h" -#include - -struct Header header_constructor(char *key, char *value) { - struct Header header; - header.key = strdup(key); - header.value = strdup(value); - return header; -} diff --git a/header.h b/header.h deleted file mode 100644 index 0353739..0000000 --- a/header.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef HEADER_H -#define HEADER_H - -struct Header { - char *key; - char *value; -}; - -struct Header header_constructor(char *key, char *value); - -#endif // !HEADER_H diff --git a/main.c b/main.c index c24017c..200a09b 100644 --- a/main.c +++ b/main.c @@ -2,18 +2,8 @@ #include "server.h" #include -char *home(struct Request request) { - return read_file("public/index.html"); -} - -char *clicked(struct Request request) { - return read_file("public/clicked.html"); -} - int main(void) { - struct Server server = server_constructor("3000"); - add_route(&server, "GET", "/", home); - add_route(&server, "POST", "/clicked", clicked); + struct Server server = server_constructor("3000", "public"); launch(&server); return EXIT_SUCCESS; } diff --git a/public/.DS_Store b/public/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..fab088f0d30f6c1c9ca70531c2acff14f30cd16e GIT binary patch literal 6148 zcmeHKK~BRk5S%SVN-2jPxghxk6-YcFROP^#4?xo*5TQ8~5Xank4DaIvvtFx^q`g)M zcBS>$>m6I3MA;aCOrGbbzz9G_SL_YgY%rZy?^rKI_K6bLxWf}3QC^l+(aH9}Z&W~^ zU4}E9(8u`k{AOh}c)6ew}e_5lmbxANXwydiFJgO|vxuq02{sPt|5 z-c3GQtO2u@++~4RG77A)YB7#mjDrSatSyfq$a_YqnZ8H1yULa0Og} zwF3Hm2z13fVQm;c9crxcL>^lCccky35# v98PO(pkLF~G_N*XQ`m{6n7LYtkLb}D585H-32Q?}X#OJ*W$?xo*r@_v40KXE literal 0 HcmV?d00001 diff --git a/public/clicked.html b/public/clicked.html deleted file mode 100644 index 3721df5..0000000 --- a/public/clicked.html +++ /dev/null @@ -1 +0,0 @@ -

see?

diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..fb93d0b9899e605f92bd3269a738f58274ea2aeb GIT binary patch literal 15406 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 bor8@1*WdA<;+B6;ANv3Q{(lAj$1CvPtq*fx literal 0 HcmV?d00001 diff --git a/public/index.css b/public/index.css new file mode 100644 index 0000000..44375b3 --- /dev/null +++ b/public/index.css @@ -0,0 +1,10 @@ +html { + background: #0D1017; + color: #BFBDB6; + font-family: -apple-system, BlinkMacSystemFont, "Avenir Next", Avenir, "Nimbus Sans L", Roboto, Noto, "Segoe UI", Arial, Helvetica, "Helvetica Neue", sans-serif; +} + +body { + max-width: 760px; + margin: auto; +} diff --git a/public/index.html b/public/index.html index c9d14c9..a27212b 100644 --- a/public/index.html +++ b/public/index.html @@ -5,19 +5,11 @@ Michael Thomson - +

Michael Thomson

-

Welcome to my site! doesn't it have so much content? I know, right?

-

It even has reactivity!

-
- - -
diff --git a/public/post.html b/public/post.html new file mode 100644 index 0000000..1fffc33 --- /dev/null +++ b/public/post.html @@ -0,0 +1,31 @@ + + + + + + Hello, World! + + + +

Michael Thomson

+ +

Hello, World!

+

Michael

+

2024-09-13

+ +

this is a test - oh yeah

+

this is a quote:

+
+

sdfdsfsdfdsfdsfdsfds sfdsfdsfsfdsfds

+
+
int main()
+{
+    return 0;
+}
+ + diff --git a/request.c b/request.c index 3918d1c..2b5f2a2 100644 --- a/request.c +++ b/request.c @@ -1,32 +1,13 @@ #include "request.h" -#include "header.h" -#include "utils.h" #include -#include - -#define MAX_HEADER_NUM 128 +#include struct Request request_constructor(char *raw_request) { struct Request request; - request.method = strstrtok(raw_request, " "); - request.target = strstrtok(NULL, " "); - request.version = strstrtok(NULL, "\r\n"); - char *raw_headers = strstrtok(NULL, "\r\n\r\n"); - request.body = strstrtok(NULL, "\0"); - - int num_headers = 0; - struct Header headers[MAX_HEADER_NUM]; - char *header_name = strstrtok(raw_headers, ": "); - if (header_name) { - char *header_value; - do { - header_value = strstrtok(NULL, "\r\n"); - headers[num_headers++] = header_constructor(header_name, header_value); - } while ((header_name = strstrtok(NULL, ": "))); - } - - request.num_headers = num_headers; - request.headers = headers; - + request.method = (char *)malloc(12 * sizeof(char)); + request.target = (char *)malloc(128 * sizeof(char)); + request.version = (char *)malloc(12 * sizeof(char)); + sscanf(raw_request, "%s %s %s", request.method, request.target, request.version); + // TODO: parse headers return request; } diff --git a/request.h b/request.h index b16b9b1..c3e6305 100644 --- a/request.h +++ b/request.h @@ -1,15 +1,10 @@ #ifndef REQUEST_H #define REQUEST_H -#include "header.h" - struct Request { char *method; // GET, POST, ... char *target; // /, /blog, /blog/post1, ... char *version; // HTTP/1.1 - char *body; - int num_headers; - struct Header *headers; }; struct Request request_constructor(char *raw_request); diff --git a/response.c b/response.c index 148008e..38f0ca5 100644 --- a/response.c +++ b/response.c @@ -1,40 +1,11 @@ #include "response.h" -#include "header.h" #include #include #include -#define MAX_BUFFER_SIZE 2048 - -struct Response response_constructor(char *version, char *status, char *body) { +struct Response response_constructor(char *version, char *status) { struct Response response; - response.version = strdup(version); - response.status = strdup(status); - response.body = strdup(body); - response.num_headers = 0; - response.headers = NULL; + response.version = version; + response.status = status; return response; } - -void add_header(struct Response *response, char *key, char *value) { - struct Header header = header_constructor(key, value); - response->headers = realloc( - response->headers, sizeof(struct Header) * (response->num_headers + 1)); - response->headers[response->num_headers++] = header; -} - -void response_to_string(char *buf, struct Response *response) { - char headers[MAX_BUFFER_SIZE]; - headers[0] = '\0'; - - for (int i = 0; i < response->num_headers; i++) { - strcat(headers, response->headers[i].key); - strcat(headers, ": "); - strcat(headers, response->headers[i].value); - strcat(headers, "\r\n"); - } - - - snprintf(buf, MAX_BUFFER_SIZE, "%s %s\r\n%s\r\n%s", response->version, - response->status, headers, response->body); -} diff --git a/response.h b/response.h index 5c71aac..bb6c1e3 100644 --- a/response.h +++ b/response.h @@ -1,22 +1,11 @@ #ifndef RESPONSE_H #define RESPONSE_H -#define OK "200 OK" -#define NOT_FOUND "404 Not Found" -#define INTERNAL_SERVER_ERROR "500 Internal Server Error" - struct Response { char *version; char *status; - char *body; - int num_headers; - struct Header *headers; }; -struct Response response_constructor(char *version, char *status, char *body); - -void response_to_string(char *buf, struct Response *response); - -void add_header(struct Response *response, char *key, char *value); +struct Response response_constructor(char *version, char *status); #endif // !RESPONSE_H diff --git a/route.c b/route.c deleted file mode 100644 index bf1af16..0000000 --- a/route.c +++ /dev/null @@ -1,12 +0,0 @@ -#include - -#include "route.h" - -struct Route route_constructor(char *target, char *method, - Route_Callback route_callback) { - struct Route route; - route.target = strdup(target); - route.method = strdup(method); - route.route_callback = route_callback; - return route; -} diff --git a/route.h b/route.h deleted file mode 100644 index ceba521..0000000 --- a/route.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef ROUTE_H -#define ROUTE_H - -#include "request.h" - -typedef char *(*Route_Callback)(struct Request request); - -struct Route { - char *target; - char *method; - Route_Callback route_callback; -}; - -struct Route route_constructor(char *target, char *method, - Route_Callback route_callback); - -#endif // !ROUTE_H diff --git a/server b/server deleted file mode 100755 index b9198f53ee0188e8031d434a84c66c3bf8d2ce81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55048 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 diff --git a/server.c b/server.c index 891f6fc..af2e46b 100644 --- a/server.c +++ b/server.c @@ -10,42 +10,20 @@ #include "request.h" #include "response.h" -#include "route.h" #include "server.h" #define MAX_BUFFER_SIZE 2048 -#define MAX_HEADER_NUM 48 int sockfd; -struct Server server_constructor(const char *PORT) { +struct Server server_constructor(const char *port, const char *static_path) { struct Server server; - server.PORT = PORT; - server.num_routes = 0; - server.routes = NULL; + server.port = port; + server.static_path = static_path; return server; } -void add_route(struct Server *server, char *method, char *target, - Route_Callback route_callback) { - struct Route route = route_constructor(target, method, route_callback); - server->routes = - realloc(server->routes, sizeof(struct Route) * (server->num_routes + 1)); - server->routes[server->num_routes++] = route; -} - -struct Route *match_route(struct Server *server, char *method, char *target) { - for (int i = 0; i < server->num_routes; i++) { - if (strcmp(server->routes[i].target, target) == 0 && - strcmp(server->routes[i].method, method) == 0) { - return &server->routes[i]; - } - } - return NULL; -} - void sigchld_handler(int s) { - // waitpid() might overwrite errno, so we save and restore it: int saved_errno = errno; while (waitpid(-1, NULL, WNOHANG) > 0) @@ -54,7 +32,110 @@ void sigchld_handler(int s) { errno = saved_errno; } -static void start(const char *PORT) { +void path_from_target(struct Server *server, char *target, char *path) { + strcpy(path, server->static_path); + strcat(path, target); + + char *question = strchr(path, '?'); + if (question) + *question = '\0'; + + if (path[strlen(path) - 1] == '/') + strcat(path, "index.html"); + + char *dot = strchr(path, '.'); + if (!dot) + strcat(path, ".html"); +} + +void get_mime_type(char *path, char *mime) { + char *dot = strchr(path, '.'); + if (!dot) + strcpy(mime, "text/html"); + else if (strcmp(dot, ".html") == 0) + strcpy(mime, "text/html"); + else if (strcmp(dot, ".css") == 0) + strcpy(mime, "text/css"); + else if (strcmp(dot, ".js") == 0) + strcpy(mime, "application/js"); + else if (strcmp(dot, ".jpg") == 0) + strcpy(mime, "image/jpeg"); + else if (strcmp(dot, ".png") == 0) + strcpy(mime, "image/png"); + else if (strcmp(dot, ".gif") == 0) + strcpy(mime, "image/gif"); + else if (strcmp(dot, ".ico") == 0) + strcpy(mime, "image/x-icon"); + else + strcpy(mime, "text/html"); +} + +int sendall(int s, char *buf, int *len) +{ + int total = 0; // how many bytes we've sent + int bytesleft = *len; // how many we have left to send + int n; + + while(total < *len) { + n = send(s, buf+total, bytesleft, 0); + if (n == -1) { break; } + total += n; + bytesleft -= n; + } + + *len = total; // return number actually sent here + + return n==-1?-1:0; // return -1 on failure, 0 on success +} + +void handle(struct Server *server, int client_fd) { + char *buf = (char *)malloc(MAX_BUFFER_SIZE * sizeof(char)); + recv(client_fd, buf, MAX_BUFFER_SIZE, 0); + + struct Request request = request_constructor(buf); + + char *path = (char *)malloc(1024 * sizeof(char)); + path_from_target(server, request.target, path); + + FILE *fp = fopen(path, "rb"); + if (fp == NULL) { + const char response[] = "HTTP/1.1 404 Not Found\r\n\r\nNot Found"; + send(client_fd, response, sizeof(response), 0); + printf("[%s] %s -> %s %s\n", request.method, request.target, path, "404"); + } else { + fseek(fp, 0, SEEK_END); + size_t file_size = ftell(fp); + rewind(fp); + + char mime_type[32]; + get_mime_type(path, mime_type); + + char res_header[1024]; + sprintf(res_header, "HTTP/1.1 200 OK\r\nContent-Type: %s\r\n\r\n", mime_type); + int header_size = strlen(res_header); + + char *res_buffer = (char *)malloc((file_size + header_size) * sizeof(char)); + strcpy(res_buffer, res_header); + + fread(res_buffer + header_size, 1, file_size, fp); + + int len = file_size + header_size; + if (sendall(client_fd, res_buffer, &len) == -1) { + perror("send content"); + exit(1); + } + + printf("[%s] %s -> %s %s\n", request.method, request.target, path, "200"); + + free(res_buffer); + }; + fclose(fp); +} + +void launch(struct Server *server) { + struct sockaddr_storage client_addr; + socklen_t client_addr_len = sizeof client_addr; + struct addrinfo hints, *res, *p; memset(&hints, 0, sizeof hints); @@ -63,7 +144,7 @@ static void start(const char *PORT) { hints.ai_flags = AI_PASSIVE; int gairv; - if ((gairv = getaddrinfo(NULL, PORT, &hints, &res)) != 0) { + if ((gairv = getaddrinfo(NULL, server->port, &hints, &res)) != 0) { fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(gairv)); exit(1); } @@ -108,86 +189,6 @@ static void start(const char *PORT) { perror("sigaction"); exit(1); } -} - -char *read_file(char *filename) { - // read in file - FILE *fp = fopen(filename, "r"); - if (fp == NULL) { - fprintf(stderr, "read_file: error opening file: %s\n", filename); - return NULL; - } - - // Calculate the content length - fseek(fp, 0, SEEK_END); - size_t file_size = ftell(fp); - rewind(fp); - - // allocate memory for file contents - char *buffer = malloc(file_size + 1); - if (buffer == NULL) { - fprintf(stderr, "read_file: memory allocation failed.\n"); - fclose(fp); - return NULL; - } - - // Read the file contents into buffer - size_t bytes_read = fread(buffer, 1, file_size, fp); - if (bytes_read != file_size) { - fprintf(stderr, "read_file: error reading file.\n"); - free(buffer); - fclose(fp); - return NULL; - } - - fclose(fp); - buffer[file_size] = '\0'; - - return buffer; -} - -void respond(struct Server *server, int *client_fd) { - // Recieve request - char buf[MAX_BUFFER_SIZE]; - recv(*client_fd, buf, MAX_BUFFER_SIZE, 0); - - // Parse request - struct Request request = request_constructor(buf); - - // Match route and get body content - struct Route *matched_route = - match_route(server, request.method, request.target); - - struct Response response; - if (matched_route == NULL) { - response = response_constructor("HTTP/1.1", NOT_FOUND, "Not found"); - } else { - char *body = matched_route->route_callback(request); - response = response_constructor("HTTP/1.1", OK, body); - } - - // calculate content length - char body_length[12]; - snprintf(body_length, sizeof(body_length), "%lu", strlen(response.body)); - add_header(&response, "Content-Length", body_length); - - printf("%s %s -> %s\n", request.method, request.target, response.status); - - // send response string - char response_string[MAX_BUFFER_SIZE]; - response_to_string(response_string, &response); - - if (send(*client_fd, response_string, strlen(response_string), 0) == -1) { - perror("send content"); - exit(1); - } -} - -void launch(struct Server *server) { - struct sockaddr_storage client_addr; - socklen_t client_addr_len = sizeof client_addr; - - start(server->PORT); int client_fd; while (1) { @@ -199,7 +200,7 @@ void launch(struct Server *server) { if (!fork()) { close(sockfd); - respond(server, &client_fd); + handle(server, client_fd); close(client_fd); exit(0); } diff --git a/server.h b/server.h index 5851e4c..af7ac0a 100644 --- a/server.h +++ b/server.h @@ -1,21 +1,14 @@ #ifndef SERVER_H #define SERVER_H -#include "header.h" -#include "route.h" - -#define BACKLOG 128 +#define BACKLOG 20 struct Server { - const char *PORT; - struct Route *routes; - int num_routes; + const char *port; + const char *static_path; }; -struct Server server_constructor(const char *PORT); - -void add_route(struct Server *server, char *method, char *target, - Route_Callback route_callback); +struct Server server_constructor(const char *port, const char *static_path); void launch(struct Server *server); diff --git a/templates/post.html b/templates/post.html new file mode 100644 index 0000000..b2e0140 --- /dev/null +++ b/templates/post.html @@ -0,0 +1,38 @@ + + + +$for(author-meta)$ + +$endfor$ +$if(date-meta)$ + +$endif$ + $pagetitle$ +$for(css)$ + +$endfor$ + + +
+

Michael Thomson

+ +
+ $if(title)$ +

$title$

+ $endif$ + $if(subtitle)$ +

$subtitle$

+ $endif$ + $for(author)$ +

$author$

+ $endfor$ + $if(date)$ +

$date$

+ $endif$ + $body$ + + diff --git a/utils.c b/utils.c deleted file mode 100644 index 6a24f21..0000000 --- a/utils.c +++ /dev/null @@ -1,25 +0,0 @@ -#include - -char *strstrtok(char *input, char *delim) { - static char *p; - - if (input != NULL) { - p = input; - } - - if (p == NULL) { - return p; - } - - char *end = strstr(p, delim); - if (end == NULL) { - char *temp = p; - p = NULL; - return temp; - } - - char *temp = p; - *end = '\0'; - p = end + strlen(delim); - return temp; -} diff --git a/utils.h b/utils.h deleted file mode 100644 index c4b5991..0000000 --- a/utils.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef UTILS_H -#define UTILS_H - -char *strstrtok(char *input, char *delim); - -#endif // !UTILS_H -