From d5a8e17f60ae555eb2d8f5f3adbc0655b414a1f5 Mon Sep 17 00:00:00 2001 From: Nayan <33187059+GShadow5@users.noreply.github.com> Date: Tue, 6 May 2025 16:04:39 -0400 Subject: [PATCH] add request handler for http request and response generation --- Makefile | 9 ++++-- client_handler.c | 57 +++++----------------------------- request_handler.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++ request_handler.h | 11 +++++++ 4 files changed, 102 insertions(+), 53 deletions(-) create mode 100644 request_handler.c create mode 100644 request_handler.h diff --git a/Makefile b/Makefile index 82e06d1..adeb191 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,14 @@ -all: webserver.o client_handler.o - gcc -o webserver.out webserver.o client_handler.o -lpthread +all: webserver.o client_handler.o request_handler.o + gcc -o webserver.out *.o -lpthread webserver: webserver.c gcc -c webserver webserver.c -client_handler: client_handler.c +client_handler: client_handler.c client_handler.h request_handler.h gcc -c client_handler client_handler.c +request_handler: request_handler.c request_handler.h + gcc -c request_handler request_handler.c + clean: rm -f *.o *.out \ No newline at end of file diff --git a/client_handler.c b/client_handler.c index eae4710..a758d6a 100644 --- a/client_handler.c +++ b/client_handler.c @@ -1,5 +1,7 @@ #include "client_handler.h" +#include "request_handler.h" + #define BUFFER_SIZE 1024 void* client_handler(void* args) { @@ -11,60 +13,15 @@ void* client_handler(void* args) { // Null terminate buffer buffer[bytes_read] = '\0'; - // Check if request is GET - char* ptr = buffer; // Modifiable pointer to buffer - char* buf_temp = - (char*)malloc(10); // Temporary buffer to store request code - char* ptr_temp = buf_temp; // Modifiable pointer to temporary buffer - // Copy request code to temporary buffer - while (*ptr != ' ') { - *ptr_temp = *ptr; - ptr++; - ptr_temp++; - } - // Null terminate temporary buffer - *ptr_temp = '\0'; - ptr++; // Skip over space - if (strcmp(buf_temp, "GET") == 0) { - printf("Received a GET request!!\n"); - } else { - printf("Received a non-GET request!!\n"); - return NULL; - } + char* response = (char*)malloc(BUFFER_SIZE); + size_t response_length = BUFFER_SIZE; - // Get filename - char* filename = (char*)malloc(100); // Buffer to store filename - ptr_temp = filename; // Modifiable pointer to filename - *ptr_temp = '.'; // Prepend . to filename - ptr_temp++; - // Copy filename to temporary buffer - while (*ptr != ' ') { - // Convert %20 to space - if (*ptr == '%' && *(ptr + 1) == '2' && *(ptr + 2) == '0') { - ptr += 3; - *ptr_temp = ' '; - ptr_temp++; - } else { - // Copy character - *ptr_temp = *ptr; - ptr++; - ptr_temp++; - } - } - *ptr_temp = '\0'; // Null terminate filename - - // Print filename - printf("Filename: %s\n", filename); + handle_request(buffer, bytes_read, response, &response_length); // Send response - char* response = "HTTP/1.1 200 OK\n\n"; - send(client, response, strlen(response), 0); + send(client, response, response_length, 0); - printf("Request:\n"); - printf("%s\n", buffer); - - free(buf_temp); - free(filename); + free(response); return NULL; } free(buffer); diff --git a/request_handler.c b/request_handler.c new file mode 100644 index 0000000..aaadff4 --- /dev/null +++ b/request_handler.c @@ -0,0 +1,78 @@ + +#include "request_handler.h" + +void handle_request(char* request, int length, char* response, + size_t* response_length) { + request[length] = '\0'; // Null terminate request for printing + + printf("Request ---------\n"); + printf("%s\n---------\n", request); + + // Check if request is GET + char* ptr = request; // Modifiable pointer to request + char buf_temp[10]; // Temporary buffer to store request code + char* ptr_temp = + (char*)&buf_temp; // Modifiable pointer to temporary buffer + // Copy request code to temporary buffer + while (*ptr != ' ') { + *ptr_temp = *ptr; + ptr++; + ptr_temp++; + } + // Null terminate temporary buffer + *ptr_temp = '\0'; + ptr++; // Skip over space + if (strcmp(buf_temp, "GET") == 0) { + printf("Received a GET request!!\n"); + } else { + printf("Received a non-GET request!!\n"); + return; + } + + // Get filename from request url + char filename[100]; // Buffer to store filename + ptr_temp = (char*)&filename; // Modifiable pointer to filename + *ptr_temp = '.'; // Prepend . to filename + ptr_temp++; + // While loop to copy filename to temporary buffer + while (*ptr != ' ') { + // Convert %20 to space + if (*ptr == '%' && *(ptr + 1) == '2' && *(ptr + 2) == '0') { + ptr += 3; + *ptr_temp = ' '; + ptr_temp++; + } else { + // Copy character + *ptr_temp = *ptr; + ptr++; + ptr_temp++; + } + } + *ptr_temp = '\0'; // Null terminate filename + + // Print filename + printf("Filename: %s\n", filename); + + // Create reponse string + ptr_temp = response; + char* temp = "HTTP/1.1 200 OK\nContent-Type: text/html\n\n"; + while (*temp != '\0') { + *ptr_temp = *temp; + ptr_temp++; + temp++; + } + // Put the filename in the html response + temp = filename; + while (*temp != '\0') { + *ptr_temp = *temp; + ptr_temp++; + temp++; + } + + *ptr_temp = '\0'; // Null terminate response + + printf("Response --------\n"); + printf("%s\n--------\n", response); + + *response_length = strlen(response); +} \ No newline at end of file diff --git a/request_handler.h b/request_handler.h new file mode 100644 index 0000000..3f8e10a --- /dev/null +++ b/request_handler.h @@ -0,0 +1,11 @@ +#ifndef HTTP_RESPONSE_BUILDER_H +#define HTTP_RESPONSE_BUILDER_H + +#include +#include +#include + +void handle_request(char* request, int length, char* response, + size_t* response_length); + +#endif \ No newline at end of file