diff --git a/README.md b/README.md index fa87f4d..3b68d7a 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,13 @@ # cws -A simple Web Server written in C (learning purposes), it works only on Linux systems. +A minimal web server written in C. This is a personal project; it is not intended to be a production-ready tool, nor +will it ever be. Use it at your own risk. ## Requirements - [meson](https://mesonbuild.com/index.html) - [doxygen](https://www.doxygen.nl/) - - Optional, just to build the docs + - Optional, just to build the docs. ## How to build @@ -21,7 +22,8 @@ And then run `cws`! ## Docs ```bash -$ git submodule update --init # inside the cws directory +# inside the cws directory +$ git submodule update --init $ doxygen ``` @@ -29,7 +31,7 @@ And then open the `docs/html/index.html`. ## Roadmap -- [x] Understading basic web server concepts +- [x] Understanding basic web server concepts - [x] Basic server - [ ] CLI args - [ ] Enhance web server @@ -47,5 +49,4 @@ And then open the `docs/html/index.html`. - [Beej's Guide to Network Programming](https://beej.us/guide/bgnet/) -You can find my journey inside the `notes` directory or on -my [blog](https://francescorocca.me/building-an-http-server-in-c/). +You can find my journey inside the `notes` directory. diff --git a/src/http/http.c b/src/http/http.c index d391cf3..18cb540 100644 --- a/src/http/http.c +++ b/src/http/http.c @@ -13,22 +13,27 @@ http_t *http_parse(char *request_str, int sockfd) { return NULL; } - /* Insert sockfd */ + /* Insert socket file descriptor */ request->sockfd = sockfd; /* Parse HTTP method */ char *pch = strtok(request_str, " "); + if (pch == NULL) { + return NULL; + } printf("[http] method: %s\n", pch); http_parse_method(request, pch); /* Parse location */ pch = strtok(NULL, " "); + if (pch == NULL) { + return NULL; + } printf("[http] location: %s\n", pch); strncpy(request->location, pch, LOCATION_LEN); /* Parse location path */ /* TODO: Prevent Path Traversal */ - /* TODO: Fix warnings */ if (strcmp(request->location, "/") == 0) { snprintf(request->location_path, LOCATION_LEN, "%s/index.html", WWW); } else { @@ -38,6 +43,9 @@ http_t *http_parse(char *request_str, int sockfd) { /* Parse HTTP version */ pch = strtok(NULL, " \r\n"); + if (pch == NULL) { + return NULL; + } printf("[http] version: %s\n", pch); strncpy(request->http_version, pch, HTTP_VERSION_LEN); diff --git a/src/server/server.c b/src/server/server.c index a526abf..ba02e9e 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -125,6 +125,13 @@ void handle_clients(int sockfd) { /* Parse HTTP request */ http_t *request = http_parse(data, client_fd); + + if (request == NULL) { + close_client(epfd, client_fd, clients); + http_free(request); + continue; + } + http_send_response(request); fprintf(stdout, BLUE "[server] Client (%s) disconnected\n" RESET, ip); close_client(epfd, client_fd, clients);